DLLname:Test_Cstring.dll(OS is WinCE 5.0),source code:
extern \"C\" __declspec(dl
You can't marshal CString
as it's not a native type - it's a C++ class that wraps up a char
array.
You can marshal string
to char[]
as char[]
is a native type. You need to have the parameters to the function you want to P/Invoke into as basic types like int
, bool
, char
or struct
, but not classes. Read more here:
http://msdn.microsoft.com/en-us/library/aa446536.aspx
In order to call functions that take CString as an argument you can do something like this:
//Compile with /UNICODE
extern "C" MFCINTEROP_API int GetStringLen(const TCHAR* str) {
CString s(str);
return s.GetLength();
//Or call some other function taking CString as an argument
//return CallOtherFunction(s);
}
[DllImport("YourDLL.dll", CharSet=CharSet.Unicode)]
public extern static int GetStringLen(string param);
In the above P/Invoke function we pass in a System.String
which can marshal to char*/wchar_t*
. The unmanaged function then creates a instance of CString
and works with that.
By default System.String
is marshalled to char*
, so be careful with what kind of string the unmanaged version takes. This version uses TCHAR
, which becomes wchar_t
when compiled with /UNICODE
. That's why you need to specify CharSet=CharSet.Unicode
in the DllImport
attribute.
you should do the following:
extern "C" __declspec(dllexport) int GetStringLen(LPCTSTR str)
{
CString s(str);
return s.GetLength();
}
The CString is actually an MFC type not a native type. Just grab the string and turn it into a CString in native method.