如何将托管C ++中的位图数组传递给非托管C ++

时间:2013-02-24 17:50:30

标签: c++ arrays unmanaged managed hbitmap

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

1 个答案:

答案 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文件和函数名称和签名。你当然要替换它们。