1

2つの通信コンポーネントがあります。1つは管理対象、もう1つは管理対象外です。管理対象は、管理対象外の実装から文字列(同じ文字列または単なるコピー)を取得する必要があります。次のコードを試しました。

// Unmanaged code
const char* GetTestName(Test* test)
{
    return test->getName();
}

// Managed wrapper
[DllImport(DllName, EntryPoint = "GetTestName")]
public static extern IntPtr GetTestName(IntPtr testObj);

// API Invocation
IntPtr testName = GetTestName(test);
string testStr = Marshal.PtrToStringAuto(testName);

ただし、testStrの値は期待どおりではありません。私がここで間違っていることを誰かが知っていますか?どんな提案も本当に役に立ちます。

4

2 に答える 2

1

あなたは近くにいますが、PtrToStringAnsi()を使用する必要があります。Autoは、Unicodeになるシステムデフォルトを使用します。

于 2010-10-08T18:22:37.343 に答える
1

代わりに、これをお勧めします:

[DllImport(DllName, EntryPoint = "EntryPoint")]
[MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetTestName(IntPtr testObj);

UnmanagedType.LPStrは、文字列とSystem.Text.StringBuilder、およびおそらく他のもので動作します(私はこれら2つだけを使用しました)。ただし、StringBuilderの方が一貫して機能することがわかりました。

さまざまな文字列マーシャリングオプションの詳細については、このMSDNの記事を参照してください。

于 2010-10-08T18:36:28.407 に答える