开发者

How to marshal the type of "Cstring" in .NET Compact Framework(C#)?

How to marshal the type of "Cstring" in .NET Compact Framework(C#)?

DLLname:Test_Cstring.dll(OS is WinCE 5.0),source code:

extern "C" __declspec(dllexport) int GetStringLen(CString str)
{ 
   return str.GetLength();
}

I marshal that in .NET Compact Framework(C#),for example:

[DllImport("Test_Cstring.dll", EntryPoint = "GetStringLen", SetLastError = true)]
public extern static int GetStringLen(string s);

private void Test_Cstring()
{
   int len=-1;
   len=GetStringLen("abcd");
   MessageBox.Show("Length:"+len.ToString()); //result is 开发者_StackOverflow社区-1,so PInvoke is unsuccessful!
}

The Method of "GetStringLen" in .NET CF is unsuccessful! How to marshal this type of "Cstring"? Any information about it would be very appreciated!


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜