从 PostMessage 发送的 c# 中的 c++ 免费 HBITMAP

Free HBITMAP from c++ in c# sent by PostMessage

我有一个内存问题,由 PostMessage 回调发送的结构中的 HBITMAP 引起。

.

我有一个 c++ 回调,它使用 PostMessage 将结构发送到 c#。这看起来像这样:

HRESULT CALLBACK MyCallback(void* ref, HRESULT hr, LPCWSTR pszMessage) {
   MyStruct st;        
   System::String^ serial = gcnew System::String(pszMessage);
   serial = serial->Substring(0, serial->LastIndexOf("\"));
   serial = serial->Substring(serial->LastIndexOf("\") + 1);
   st.serial = StringToInt(serial);
   HBITMAP send = updatePreview(pszMessage);
   IntPtr ptr=(IntPtr) send;
   st.imagen = ptr;
   PostMessage(w, WM_UPDATE_PREVIEW, IMAGE_UPDATE, (LPARAM)&st);
}

这是我的结构:

struct MyStruct
{
    IntPtr imagen;
    Int32 serial;
};

我在覆盖 WndProc 的 C# 代码中收到此消息:

protected override void WndProc(ref Message m)
{
    if (m.Msg == AePhocus.AePhocusManager.WM_UPDATE_PREVIEW)
    {
         PICTURE_STRUCT imageinfo = new PICTURE_STRUCT();
         Marshal.PtrToStructure(m.LParam, imageinfo);
                ....
                ....
     }
}

此方法刷新了我的预览并且工作正常,但问题是我无法释放从 C++ 发送的 HBITMAP。如果我在 PostMessage 之后销毁指针,则接收到的图像为空,但如果我不销毁它,每次预览都会增加内存的使用。

有人可以帮我解决这个问题吗? 大家好!!

PostMessage() 是异步的。在调用接收 WndProc 时,原始 MyStruct st 变量已经从内存中消失,并且 WndProc 正在访问垃圾。您需要使用 SendMessage() 来确保结构在 WndProc 退出之前保持活动状态。

至于释放 HBITMAP,正确的方法是使用 DeleteObject(),假设 HBITMAP 没有跨进程边界传递。