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

后端 未结 2 1193
广开言路
广开言路 2021-01-23 04:48

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(dl         


        
相关标签:
2条回答
  • 2021-01-23 05:00

    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.

    0 讨论(0)
  • 2021-01-23 05:23

    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 讨论(0)
提交回复
热议问题