c# string 에서 mfc의 LPCTSTR간의 변환
mfc 로 만들 DLL 함수중 문자열을 인자로 받는 함수가 있었습니다.
처음 dll을 만들때는 CString으로 만들었었죠. 결과적으로 c# 에서 string을 바로 CString으로 변환하는 방법은 래핑하는 방법밖에 없었구요(잘 찾아보면 있을지도..)
그래서 CString 으로 선언된 인자를 LPCTSTR로 변경하였습니다.
extern "C" __declspec(dllexport) int DLL_SetFile(LPCSTR filePath)
{
처음 dll을 만들때는 CString으로 만들었었죠. 결과적으로 c# 에서 string을 바로 CString으로 변환하는 방법은 래핑하는 방법밖에 없었구요(잘 찾아보면 있을지도..)
그래서 CString 으로 선언된 인자를 LPCTSTR로 변경하였습니다.
extern "C" __declspec(dllexport) int DLL_SetFile(LPCSTR filePath)
{
CString
path(filePath);
.
.
.
.
.
.
.
.
}
이런식으로 만들어서 인자값을 간단하게 CString으로 변화하여 MFC에서는 사용을 합니다.
자 그럼 c#에서 이 함수를 어떻게 사용하느냐..
일단 string값을 바로 대입할 수 는 없습니다.
변환을 한번 해줘야 하는데 바로 IntPtr값으로 변환을 한번 해주어야 합니다.
IntPtr
형식은 그 크기가 플랫폼마다 고유한 정수로 디자인되었습니다. 즉, 이 형식의 인스턴스는 32비트 하드웨어 및 운영
체제에서는 32비트로, 64비트 하드웨어 및 운영 체제에서는 64비트여야 합니다.
IntPtr
형식은 포인터를 지원하는 언어에서 사용할 수 있으며, 포인터를 지원하는 언어와 포인터를 지원하지 않는 언어 사이에서 데이터를 참조하는 일반적인
방법이 됩니다.
핸들을 보관하는 데도 IntPtr
개체를 사용할 수 있습니다. 예를 들어, IntPtr의
인스턴스는 파일 핸들을 보관하기 위해 System.IO ::
FileStream 클래스에서 광범위하게 사용됩니다.
IntPtr
형식은 CLS 규격이지만, UIntPtr 형식은 그렇지 않습니다. 공용 언어 런타임에서는 IntPtr
형식만 사용됩니다. UIntPtr 형식은 IntPtr
형식과의 구조적 대칭을 유지하기 위해 주로 사용됩니다.
이 형식은 ISerializable 인터페이스를 구현합니다
간단한 함수를 하나 만들었죠
using System.Runtime.InteropServices;
public IntPtr GetStringToIntPtr(string data)
{
return Marshal.StringToHGlobalAnsi(data);
}
관리되는 String의 내용을 관리되지 않는 메모리로 복사하고 복사할 때 ANSI 형식으로 변환합니다.
그렇습니다. 참으로 간단합니다. -_-
DLL_SetFile(GetStringToIntPtr(file));
끝입니다...
너무나 간단해서 -_- 짜증이 날 정도였죠..
c#에서 마샬링의 위력은 정말 대단합니다. string 뿐 아니라 구조체, 포인터까지 마샬링을 통해서 변환이 가능합니다..
이런식으로 만들어서 인자값을 간단하게 CString으로 변화하여 MFC에서는 사용을 합니다.
자 그럼 c#에서 이 함수를 어떻게 사용하느냐..
일단 string값을 바로 대입할 수 는 없습니다.
변환을 한번 해줘야 하는데 바로 IntPtr값으로 변환을 한번 해주어야 합니다.
이 형식은 ISerializable 인터페이스를 구현합니다
간단한 함수를 하나 만들었죠
using System.Runtime.InteropServices;
public IntPtr GetStringToIntPtr(string data)
{
return Marshal.StringToHGlobalAnsi(data);
}
매개 변수
- s
- 형식: System ::
String
복사할 관리되는 문자열입니다.
그렇습니다. 참으로 간단합니다. -_-
DLL_SetFile(GetStringToIntPtr(file));
끝입니다...
너무나 간단해서 -_- 짜증이 날 정도였죠..
c#에서 마샬링의 위력은 정말 대단합니다. string 뿐 아니라 구조체, 포인터까지 마샬링을 통해서 변환이 가능합니다..
댓글
댓글 쓰기