从 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
没有跨进程边界传递。
我有一个内存问题,由 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
没有跨进程边界传递。