作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前在托管 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/
我是一名优秀的程序员,十分优秀!