2

.NET Compact Framework(C#)で「Cstring」のタイプをマーシャリングするにはどうすればよいですか?

DLLname:Test_Cstring.dll(OSはWinCE 5.0)、ソースコード:

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

これを.NETCompactFramework(C#)でマーシャリングします。次に例を示します。

[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 -1,so PInvoke is unsuccessful!
}

.NET CFの「GetStringLen」のメソッドは失敗します!このタイプの「Cstring」をマーシャリングするにはどうすればよいですか?それについてのどんな情報でも非常にありがたいです!

4

2 に答える 2

2

CStringネイティブ型ではないため、マーシャリングすることはできませんchar。配列をラップするC++クラスです。

ネイティブタイプstringchar[]同じようにマーシャリングできます。P / Invokeする関数のパラメーターは、、、、、などのchar[]基本的なタイプとして持つ必要がありますが、クラスは必要ありません。詳細はこちら:intboolcharstruct

http://msdn.microsoft.com/en-us/library/aa446536.aspx

CStringを引数として取る関数を呼び出すには、次のようにします。

//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);        

上記のP/Invoke関数では、System.Stringにマーシャリングできるaを渡しchar*/wchar_t*ます。次に、アンマネージ関数はのインスタンスを作成し、それを操作しますCString

デフォルトSystem.Stringではにマーシャリングさchar*れるため、アンマネージバージョンが使用する文字列の種類に注意してください。このバージョンではTCHAR、を使用します。これは、でwchar_tコンパイルするとになり/UNICODEます。CharSet=CharSet.Unicodeそのため、DllImport属性で指定する必要があります。

于 2010-05-10T08:19:53.973 に答える
0

次のことを行う必要があります。

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

CStringは、実際にはネイティブ型ではなくMFC型です。文字列を取得して、ネイティブメソッドでCStringに変換するだけです。

于 2010-05-10T08:20:20.613 に答える