Я пытаюсь получить 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
как более эффективного.
Если DLL работает в другом процессе, чем приложение, вы не сможете делиться растровым изображением между ними. Ручки GDI действительны только в процессе, который их создал. –
Проводник процесса показывает DLL-оболочку оболочки (C# COM-сервер), а .NET dll открыта (и только открыта) с помощью PID приложения C++. Если COM-вызов не запускает другой процесс, который я не вижу, похоже, что приложение C++ является единственным интересным. – bgh10788