Как отправить экземпляры объекта в WndProc - PullRequest
0 голосов
/ 28 июня 2011

Я использую свой пользовательский класс, который описывает некоторые состояния и значения:

  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 я мог использовать его для нужд логики. Это возможно?

1 Ответ

2 голосов
/ 28 июня 2011

Вы не сможете этого сделать. Указатели на управляемом языке ничего не значат, их часто перемещают и убивают, когда на них больше нет ссылок. Ну, может быть, вы сможете достичь чего-то, что вроде бы работает таким образом (в процессе), с небезопасным кодом и закрепленными указателями, но это будет вашей гибелью.

Если вы хотите только межпроцессное взаимодействие, то остерегайтесь последствий межпоточного взаимодействия.

Если вам нужно межпроцессное взаимодействие, посмотрите эту ветку: Механизмы IPC в C # - Использование и лучшие практики

Edit:

Отправка uniqueID через SendMessage для получения сериализованного объекта. Я не советую это делать, поскольку это может привести к взлому и ошибкам, но вы просили:

при отправке сообщения:

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");
}

Извините за опечатки в коде, я пишу это ad hoc и не могу проверить ...

...