2012-01-11 5 views
1

Я пытаюсь получить System.Drawing.Image (сгенерированный в .NET dll) в элемент управления изображением в приложении Visual C++/MFC. Я новичок в COM/Interop, но у меня есть взаимодействие. Однако я не уверен, как передать данные растрового изображения с C# на C++.System.Drawing.Image для управления изображениями Visual C++/MFC

Основной процесс:
1. C++/MFC вызывает на COM-сервере (Interop)
2. C# COM сервер вызывает .NET DLL
3. Сформировать System.Drawing.Image в DLL .NET
4. C# COM сервер возвращает данные растрового изображения в некоторой форме (Interop)
5. C++/MFC отображает растровое

в C# COM сервер, у меня есть:

Bitmap bm = new Bitmap(img); 
IntPtr hbm = bm.GetHbitmap(); 
return hbm; 

Где img is System.Drawing.Image Я хочу отправить. Метод возвращает IntPtr, который получает выстраивал в long*

В моем MFC C++ приложение тестирования, у меня есть:

long pOutHB; 

pQRCodePtr->Generate(m_sQRText.AllocSysString(), 50, 50, &pOutHB); 

HBITMAP hb = (HBITMAP) pOutHB; 
m_QRCodePicture.SetBitmap(hb); 
m_QRCodePicture.Invalidate(); 
m_QRCodePicture.UpdateData(); 

Но ничего не получает положенный в контроле изображения. Я также попытался создать CBitmap, используя HBITMAP, но это также было неудачно. Я проверил, что сервер .NET dll/COM генерирует действительное изображение.

Большинство моих исследований по этому вопросу непокрытой принимая ++ растровое C и делает System.Drawing.Image, не собирается в другом направлении (например, этот вопрос: Safety of passing HBITMAP handle from unmanaged to managed code for created a System.Drawing.Bitmap)

я иду вниз правильный путь здесь? Я понимаю, что мой код может быть совершенно неправильным. Я ищу что-то, чтобы указать мне в правильном направлении. Моя первая попытка состояла в том, чтобы передать массив byte[], но некоторые чтения указали мне в направлении прохождения указателя HBitmap как более эффективного.

+1

Если DLL работает в другом процессе, чем приложение, вы не сможете делиться растровым изображением между ними. Ручки GDI действительны только в процессе, который их создал. –

+0

Проводник процесса показывает DLL-оболочку оболочки (C# COM-сервер), а .NET dll открыта (и только открыта) с помощью PID приложения C++. Если COM-вызов не запускает другой процесс, который я не вижу, похоже, что приложение C++ является единственным интересным. – bgh10788

ответ

0

Для справки в будущем выясняется, что я делал это правильно. Ручка HBITMAP действительна и сохраняется даже после возврата из функции .NET и проходит через COM-взаимодействие. Согласно MSDN, вам необходимо очистить объект.

Добавление некоторой очистки, это работает. Generate - это вызов службы COM-обертки, которая возвращает , который привязан к long.

long pOutHB; 

pQRCodePtr->Generate(m_sQRText.AllocSysString(), 200, 200, &pOutHB); 

HBITMAP hb1 = (HBITMAP) pOutHB; 

HBITMAP oldHB = m_QRCodePicture.SetBitmap(hb1); 
if (oldHB) 
{ 
    DeleteObject(oldHB); 
} 
Смежные вопросы