【问题标题】:cast of (managed) Message to COPYDATASTRUCT向 COPYDATASTRUCT 发送(托管)消息
【发布时间】:2021-08-20 13:58:33
【问题描述】:

根据此示例,我正在使用重写的 WndProc 来完成进程间通信: https://docs.microsoft.com/en-us/windows/win32/dataxchg/using-data-copy 我对发件人没有问题,这很好用。但是,只要我想获取 LParam 的内容,我就无法编译它,我根本不明白是什么导致了问题。

protected:
    [SecurityPermission(SecurityAction::Demand, Flags = SecurityPermissionFlag::UnmanagedCode)]
    virtual void WndProc(Message %m) override

    {
        PCOPYDATASTRUCT pMyCDS;
        // Listen for operating system messages.
        switch (m.Msg)
        {
        case WM_COPYDATA:
            pMyCDS = (PCOPYDATASTRUCT)m.lParam; //doesn't work: Failure: E0413  no suitable conversion function from "System::IntPtr" to "PCOPYDATASTRUCT" exists
            break;
        }
    }

如果我只是在 WM_COPYDATA 案例中做一些其他的事情,我可以确认事件触发了,但是我当然需要获取 lParam 的内容。如何将 lParam 的内容复制或转换为 COPYDATASTRUCT?

我正在使用 Visual Studio 2019。

【问题讨论】:

  • 嗯。托管 C++ 不是我的强项,也许您不应该使用“原始”指针。但是,将 via 转换为 void* 会删除错误消息:pMyCDS = (PCOPYDATASTRUCT)(void*)m.lParam;注意事项
  • 这似乎有效!非常感谢!

标签: c++ visual-studio managed-c++


【解决方案1】:

你可以试试这个,不确定它是否有效。我有一段时间没有做过任何 C++/clr 了。 但我的猜测是,您尝试直接从 c++ 访问托管内存,而无需先对其进行编组。

switch (m.Msg)
{
case WM_COPYDATA:
    auto copydata = System::Runtime::InteropServices::Marshal::PtrToStructure<COPYDATASTRUCT>(m.LParam);
    // uses copydata here
    break;
}

至少我希望这会给你指明一个方向。 :)

【讨论】:

  • 哦,这是我第一次听说Marshaling,看来我需要再深入一点。不幸的是它没有编译。错误消息是 C2672 'System::Runtime::InteropServices::Marshal::PtrToStructure':找不到匹配的重载函数
  • 混合托管内存和堆内存时有两件重要的事情。编组和固定。编组通常涉及复制内存。安全但缓慢。通过固定,您可以告诉垃圾收集器“嘿,我正忙于这个参考,在我完成之前不要清理它”。 docs.microsoft.com/en-us/cpp/extensions/… 如前所述,我正在尝试在键入时刷新记忆,似乎很多人不使用 c++/clr
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 2017-12-09
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2015-07-13
  • 2014-04-25
相关资源
最近更新 更多