我目前在托管C ++代码中的dll中有一个System::Drawing::Bitmaps
数组。我希望能够从非托管(本机)C ++调用托管C ++中的方法。问题是如何将数组传递回非托管C ++?
我可以在托管C ++位图上调用GetHbitmap()
,该位图返回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 ++调用GetBitmaps方法时将这些位图恢复到非托管C ++。我不知道我应该传入什么类型的变量,然后一旦我传入它,我该怎么做才能将它转换为非托管C ++可以使用的类型?
答案 0 :(得分:1)
您肯定需要创建一个非托管数组来调用您的本机代码。之后你还需要做好适当的清理工作。所以基本代码应该是这样的:
#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文件和函数名称和签名。你当然要替换它们。