4

P / Invokeを使用して、アンマネージDLLから(とりわけ)文字列をフェッチしようとしていますが、何を試しても文字列が文字化けします。

私はネイティブのWindowsコーダーではないので、文字エンコードビットについてはよくわかりません。DLLは「マルチバイト文字セット」を使用するように設定されていますが、これは変更できません(他のプロジェクトが破損するため)。ラッパー関数を追加して、既存のクラスからデータを抽出しようとしています。問題の文字列は現在CStringとして存在し、マネージドStringBuilderに取得することを期待して、LPTSTRにコピーしようとしています。

これは私が正しいと信じていることです(私は明らかに無関係なビットを削除しました):

// unmanaged function
DLLEXPORT void Test(LPTSTR result)
{
  // eval->result is a CString
  _tcscpy(result, (LPCTSTR)eval->result);
}

// in managed code
[DllImport("Test.dll", CharSet = CharSet.Auto)]
static extern void Test([Out] StringBuilder result);

// using it in managed code
StringBuilder result = new StringBuilder();
Test(result);
// contents in result garbled at this point

// just for comparison, this unmanaged consumer of the same function works
LPTSTR result = new TCHAR[100];
Test(result);

ヒントを本当に感謝します!ありがとう!!!

4

3 に答える 3

3

c関数に割り当てていないので、paramaeterを使用しないでください

[DllImport("Test.dll", CharSet = CharSet.Auto)]
static extern void Test(StringBuilder result);

StringBuilder result = new StringBuilder(100);
Test(result);

これはあなたのために働くはずです

于 2009-05-15T05:42:29.833 に答える