C#과 C++ DLL 간의 스트링 데이타 교환
C# 코드
[DllImport("StoreUI_ko_Http.dll", CharSet = CharSet.Auto)]
public static extern void GetPage(string url, out string data);
C++ 코드
__declspec(dllexport) void GetPage(BSTR url, BSTR* Result)
{
char* pBuffer = NULL;
HttpConnectGet(url, &pBuffer);
CComBSTR bstrResult = UTF8ToUNICODE(pBuffer);
*Result = bstrResult.Detach();
free(pBuffer);
}
WinXP 환경에서는 위의 코드가 정상적으로 동작하지만
Vista에서는 타입변환 오류가 발생되고 만다.
스트링 대신에 바이트 타입으로 하면 에러는 발생되지 않지만
한글의 경우 유니코드 환경에서 데이타가 다 깨져버린다.
해결 방법은 아래처럼 string을 IntPtr로 변경해서 처리하면 된다.
IntPtr 는 C#처럼 포인터를 지원하지 않는 어플리케이션과 데이터를 주고 받을때
사용하면 편리하다.
IntPtr는 C++에서 넘기는 스트링에 대한 포인터 주소값을 저장하게 된다.
C# 코드
[DllImport("StoreUI_ko_Http.dll", CharSet = CharSet.Auto)]
public static extern void GetPage(string url, out IntPtr data);
IntPtr param = IntPtr.Zero; // 초기값 할당
GetPage("", param); // C++ 함수 호출
string msg = System.Runtime.InteropServices.Marshal.PtrToStringAuto(param); //string 변환
C++ 코드
__declspec(dllexport) void GetPage(BSTR url, BSTR* Result)
{
char* pBuffer = NULL;
HttpConnectGet(url, &pBuffer);
CComBSTR bstrResult = UTF8ToUNICODE(pBuffer);
*Result = bstrResult.Detach();
free(pBuffer);
}
[출처] C#과 C++ DLL 간의 스트링 데이타 교환|작성자 옆집엉아
'Programming > C#' 카테고리의 다른 글
mouse_event (user32) (0) | 2012.05.21 |
---|---|
keybd_event (user32) (0) | 2012.05.21 |
C# String을 C++ char로 변환 (0) | 2012.05.14 |
Returning Strings from a C++ API to C# (0) | 2012.05.14 |
SendMessage C# -> C++ with String (0) | 2012.05.09 |