0

いくつかの状態と値を記述するカスタム クラスを使用しています。

  class MyClass
    {
        int State;
        String Message;
        IList<string> Values;
    }

アプリケーション アーキテクチャのため、フォーム インタラクションにはメッセージとそのインフラストラクチャ (SendMessage/PostMessage、WndProc) が使用されます。問題は、SendMessage/PostMessage を使用して MyClass のインスタンスを WndProc に送信する方法です。私のコードでは、PostMessage は次のように定義されています。

[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

そのため、何らかの方法でカスタム メッセージ番号の下に送信する必要があり、MyClass インスタンスが必要なので、WndProc でロジックのニーズに使用できます。それが可能だ?

4

1 に答える 1

2

あなたはそれをすることができません。マネージ言語のポインターは何の意味もありません。参照されなくなると、しばしば再配置されて強制終了されます。おそらく、安全でないコードと固定されたポインターを使用して、このように (処理中に) 動作する何かを達成できるかもしれませんが、それはあなたの運命になるでしょう。

インプロセス通信のみが必要な場合は、クロススレッド通信の影響に注意してください。

クロス プロセス通信が必要な場合は、次のスレッドを参照してください: C# の IPC メカニズム - 使用法とベスト プラクティス

編集:

SendMessage を介して uniqueID を送信し、シリアル化されたオブジェクトをフェッチします。ハッキングやバグが発生しやすいため、これはお勧めしませんが、次のように要求されました。

メッセージを送信するとき:

IFormatter formatter = new BinaryFormatter();
string filename = GetUniqueFilenameNumberInFolder(@"c:\storage"); // seek a freee filename number -> if 123.dump is free return 123 > delete those when not needed anymore
using (FileStream stream = new FileStream(@"c:\storage\" + filename + ".dump", FileMode.Create))
{
   formatter.Serialize(stream, myClass);
}
PostMessage(_window, MSG_SENDING_OBJECT, IntPtr.Zero, new IntPtr(int.Parse(filename)));

WndProc で受信する場合:

if (msg == MSG_SENDING_OBJECT)
{
    IFormatter formatter = new BinaryFormatter();
    MyClass myClass;
    using (FileStream stream = new FileStream(@"c:\storage\" + lParam.ToInt32().ToString() + ".dump", FileMode.Open))
    {
        myClass = (MyClass)formatter.Deserialize(stream);
    }
    File.Delete(@"c:\storage\" + lParam.ToInt32().ToString() + ".dump");
}

コードのタイプミスで申し訳ありません。私はこのアドホックを書いており、テストできません...

于 2011-06-28T15:23:24.773 に答える