【问题标题】:PostMessage — how to send int array?PostMessage — 如何发送 int 数组?
【发布时间】:2021-04-07 10:38:35
【问题描述】:

如何发送int数组:

int *pars = new int[4];
pars[0] = 87675;
//...
pars[3] = 1024;
PostMessage(?);

然后正确接收并清除内存:

LONG OnMessage(WPARAM wParam, LPARAM lParam) {
//?
}

一切都在一个过程中。

【问题讨论】:

  • 一种方法是发帖时new,回复时delete。这不是一个好方法,但这是win32。或者,如果可以的话,创建一个全局/单例来存储数据
  • WM_COPYDATA 可能是跨进程的一种方法。否则,我有时只是将 appclass 用作两者之间的过渡 - 取决于应用程序的上下文和需求。
  • 在一个过程中(我更新了帖子)。
  • 我想说也许你想考虑一下你是想使用 PostMessage 还是 SendMessage?如果您使用 SendMessage,您可以在发送例程中管理内存清理,而接收方不必清理。此外,SendMessage() 将其“现在”发送,而 PostMessage 将其放入队列并在您泵送消息循环并到达该消息时处理它。但是,只有您自己确切地知道使用发送而不是发布是否会更好。

标签: c++ visual-c++ mfc postmessage


【解决方案1】:

在单个进程中,您可以通过LPARAM 传递地址。

    int *pars = new int[4];
    pars[0] = 87675;
    //...
    pars[3] = 1024;
    PostMessage(hWnd, WM_MY_CUSTOM_MSG, 0, (LPARAM)pars);

然后从lParam取,使用然后免费:

LONG OnMessage(WPARAM wParam, LPARAM lParam) {
    int *pars = (int*)lParam;

    // use it ...

    delete[] pars;
}

不理想,但这是 WinAPI ...

对于更类似于 RAII 的方法,将指针包装在 unique_ptr 中:

LONG OnMessage(WPARAM wParam, LPARAM lParam) {
    std::unique_ptr<int[]> pars((int*)lParam);

    // use it normally ...

    // it's freed automatically
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2013-11-22
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2017-08-28
    相关资源
    最近更新 更多