2012년 10월 10일 수요일

Marshaling LPCTSTR


C# (Managed code) 에서 C++ DLL (Unmanaged code) 의 다음과 같은 함수를 사용해야 할 경우가 있었다.

C++
void Func(LPCTSTR szKey);

C/C++ 기억이 가물가물 하지만.. LPCTSTR 타입은 다음과 같다.
UNICODE 을 정의할 경우 -> LPCWSTR (16-bit Unicode character) 즉, CONST WCHAR *
ANSI 일 경우 -> LPCSTR (8-bit ANSI character) 즉, CONST CHAR *

*) Windows API 는 ANSI string 과 Unicode (UTF-16) string 을 사용한다.
*) C# 은 Unicode (UTF-16) 을 사용한다.

LPCTSTR 의 대응되는 C# 타입은 [UnmanagedType.LPWStr] string 이다.

C++              C#
LPCTSTR -> [UnmanagedType.LPTStr] string


UnmanagedType 열거형
매개변수나 필드를 Unmanaged 코드로 어떻게 마샬링 할 것인지 지정하는 열거타입

UnmanagedType.LPWSTR
2바이트 null 로 끝나는 유니코드 문자열. Unmanaged 함수인 CoTaskMemAlloc 로 생성된 문자열에 대해서만 사용됨.
ANSI 문자열로 마샬링할 경우에는 UnmanagedType.LPSTR, Unicode 문자열로 마샬링할 경우에는 UnmanagedType.LPWSTR 을 사용하는 것 같다. 플랫폼 종속적인 경우에는 UnmanagedType.LPTSTR 을 사용해되 괜찮을것 같다.

MarshalAsAttribute
Managed 코드와 Unmanaged 코드 사이에 데이터를 어떻게 마샬링 할 것인지 지정한다. parameter, field, return value에 사용 가능하다.



*) Windows Data Types - MSDN
*) MarshalAsAttribute Class - MSDN
*) UnmanagedType 열거형 - MSDN
*) How to map Win32 types to C# types when using P/Invoke? - stackoverflow


@

댓글 없음:

댓글 쓰기