В настоящее время у меня есть массив System::Drawing::Bitmaps
в DLL в управляемом коде C ++. Я хотел бы иметь возможность вызывать метод в управляемом C ++ из неуправляемого (нативного) C ++. Вопрос в том, как мне передать массив обратно в неуправляемый C ++?
я могу позвонить GetHbitmap()
на управляемом растровом изображении C ++, который возвращает IntPtr
, Должен ли я передать массив IntPtrs? Не совсем уверен, лучший способ сделать это. Итак, чтобы быть ясно, у меня есть это:
Управляемый метод C ++:
void GetBitmaps(<????>* bitmaps)
{
//Calling into C# to get the bitmaps
array<System::Drawing::Bitmap^>^ bmp=ct->DataGetBitmaps(gcnew String(SessionID));
for(int i=0;i<bmp.Length;i++)
{
System::Drawing::Bitmap^ bm=(System::Drawing::Bitmap^)bmp.GetValue(i);
IntPtr hBmp=bm->GetHbitmap();
}
//So now how to I convert the hBmp to an array value that I can then pass back to unmanaged C++(hence the <????> question for the type)
}
Это массив HBITMAPS? И если так, как вы можете преобразовать IntPtr
hBmp к этому массиву?
Управляемый код C ++ работает все хорошо и правильно и правильно получает массив растровых изображений. но теперь мне нужно вернуть эти растровые изображения обратно в неуправляемый C ++, когда неуправляемый C ++ вызывает метод GetBitmaps. Я не знаю, к какому типу переменных я должен передавать, а затем, когда я передаю его, что мне делать, чтобы преобразовать его в тип, который может использовать неуправляемый C ++?
Вам обязательно нужно будет создать неуправляемый массив для вызова вашего собственного кода. Вы также должны будете позаботиться о надлежащей очистке после этого. Итак, основной код должен выглядеть так:
#include "stdafx.h"#include <windows.h>
#pragma comment(lib, "gdi32.lib")
#pragma managed(push, off)
#include <yourunmanagedcode.h>
#pragma managed(pop)
using namespace System;
using namespace System::Drawing;
using namespace YourManagedCode;
void SetBitmaps(const wchar_t* SessionID, CSharpSomething^ ct)
{
array<Bitmap^>^ bitmaps = ct->DataGetBitmaps(gcnew String(SessionID));
HBITMAP* array = new HBITMAP[bitmaps->Length];
try {
for (int i = 0; i < bitmaps->Length; i++) {
array[i] = (HBITMAP)bitmaps[i]->GetHbitmap().ToPointer();
}
// Call native method
NativeDoSomething(array, bitmaps->Length);
}
finally {
// Clean up the array after the call
for (int i = 0; i < bitmaps->Length; i++) DeleteObject(array[i]);
delete[] array;
}
}
В вашем вопросе было недостаточно информации, чтобы сделать это точным, мне пришлось использовать имена-заполнители для таких вещей, как имя класса C # и пространство имен, а также файл .h, собственный код, имя функции и подпись. Вам, конечно, придется заменить их.
Других решений пока нет …