Бесплатный HBITMAP от c ++ в c #, отправленный PostMessage - PullRequest
0 голосов
/ 11 мая 2018

У меня проблема с памятью, вызванная HBITMAP внутри структуры, отправляемой из обратного вызова PostMessage.

.

У меня есть обратный вызов c ++, который отправляет структуру в c # с помощью PostMessage.Это выглядит так:

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;
};

Я получаю это сообщение в своем коде c # в моем переопределении WndProc:

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);
                ....
                ....
     }
}

Этот метод обновляет мои предварительные просмотры и работает нормально, но проблема в том, что я не могу освободить HBITMAP, отправленный с c ++.Если после PostMessage я уничтожу указатель, полученное изображение будет нулевым, но если я не уничтожу его, использование памяти увеличивается с каждым предварительным просмотром.

Может кто-нибудь помочь мне с этой проблемой, пожалуйста?Ты все !!

1 Ответ

0 голосов
/ 11 мая 2018

PostMessage() является асинхронным.К тому времени, когда вызывается WndProc, исходная переменная MyStruct st уже исчезла из памяти, а WndProc получает доступ к мусору.Вместо этого вам нужно использовать SendMessage(), чтобы структура оставалась в живых до тех пор, пока не выйдет WndProc.

Что касается освобождения HBITMAP, правильный способ - использовать DeleteObject() при условии, что HBITMAP не передается через границы процесса.

...