繁体   English   中英

由PostMessage发送的C#中的C ++中的免费HBITMAP

[英]Free HBITMAP from c++ in c# sent by PostMessage

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

我有一个使用PostMessage将结构发送到c#的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之后销毁了指针,则收到的图像为Null,但是如果我不销毁指针,则每次预览都会增加内存使用量。

有人可以帮我解决这个问题吗? 全部!

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

至于释放HBITMAP ,正确的方法是使用DeleteObject()HBITMAP是该HBITMAP不会跨进程边界传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM