4

C# から C++ WindowProc に文字列を送信する必要があります。これに関連する SO に関する質問は多数ありますが、どれもうまくいきませんでした。状況は次のとおりです。

PInvoke:
[DllImport("user32", CharSet = CharSet.Auto)]
public extern static int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, string lParam);

C#:
string lparam = "abc";
NativeMethods.User32.SendMessage(handle, ConnectMsg, IntPtr.Zero, lparam);

C++:
API LRESULT CALLBACK HookProc (int code, WPARAM wParam, LPARAM lParam)
{       
    if (code >= 0)
    {
        CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
                ...
        (LPWSTR)cwp->lParam   <-- BadPtr
                ...
    }

    return ::CallNextHookEx(0, code, wParam, lParam);
}

文字列を LPStr、LPWStr としてマーシャリングし、アンマネージ メモリから IntPtr を作成し、Marshal.WriteByte で書き込みを試みました。

ポインターは C++ 側の正しいメモリ位置ですが、データはそこにありません。私は何が欠けていますか?

4

2 に答える 2

2

C++LPWSTRまたはパラメーターの場合、DllImport でLPSTRC# を使用する必要があります。StringBuilder

C++LPCWSTRまたはパラメーターの場合、DllImport でLPCSTRC# を使用する必要があります。string

于 2010-04-16T14:29:34.690 に答える
1

SendMessage 呼び出しが期待どおりの同期方法で発生していること、および NativeMethods クラスが適切な Win32 呼び出し (Send と PostMessage) をマップしていることを確認してください。これが正しくない場合、メッセージが C++ で処理されるまでに、最後に、C# メソッドのスコープを離れてしまい、スタック上に作成されたローカル変数がなくなり、ポインターが正しくなくなります。

クロススレッド呼び出しのスタックとヒープに関する考慮事項: スレッドには独自のスタックがありますが、ヒープは共有されます。あるスレッドのスタック割り当て変数は、別のスレッドでは表示されません。文字列型は、.NET では奇妙なアヒルです。これはオブジェクトから派生した参照型ですが、コードでは値型のように見えるように作られています。したがって、ヒープに割り当てられたデータへのポインターを渡すことはおそらく機能するはずです。そこで登場するのが、ヒープ割り当て参照型としての StringBuilder です。

于 2010-04-16T14:36:03.070 に答える