[英]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.