gpt4 book ai didi

c++ - 如何将位图数组从托管 C++ 传递到非托管 C++

转载 作者:行者123 更新时间:2023-11-28 07:45:03 30 4
gpt4 key购买 nike

我目前在托管 C++ 代码的 dll 中有一个 System::Drawing::Bitmaps 数组。我希望能够从非托管( native )C++ 调用托管 C++ 中的方法。问题是如何将数组传递回非托管 C++?

我可以在返回 IntPtr 的托管 C++ 位图上调用 GetHbitmap()。我应该传递一个 IntPtr 数组吗?不太确定执行此操作的最佳方法。所以要清楚我有这个:

托管 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++ 可以使用的类型?

最佳答案

您肯定需要创建一个非托管数组来调用您的 native 代码。之后您还必须注意适当的清理工作。所以基本代码应该是这样的:

#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# 类名和命名空间以及 native 代码 .h 文件和函数名和签名。您当然必须替换它们。

关于c++ - 如何将位图数组从托管 C++ 传递到非托管 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054631/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com