0

System::Drawing::Bitmaps私は現在、マネージC++コードのdllに配列を持っています。アンマネージ(ネイティブ)C++からマネージC++のメソッドを呼び出せるようにしたいと思います。問題は、配列をアンマネージC++に戻す方法です。

GetHbitmap()を返すマネージC++ビットマップを呼び出すことができますIntPtr。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)
}

HBITMAPの配列ですか?もしそうなら、どのようにしてIntPtrhBmpをその配列に変換できますか?

マネージC++コードはすべてうまく機能し、ビットマップの配列を正しく取得します。しかし、アンマネージC ++がGetBitmapsメソッドを呼び出すときに、これらのビットマップをアンマネージC++に戻す必要があります。渡す必要のある変数のタイプがわかりません。渡したら、アンマネージC ++で使用できるタイプに変換するにはどうすればよいですか?

4

1 に答える 1

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 ファイルと関数名と署名などにプレースホルダー名を使用する必要がありました。もちろん、それらを置き換える必要があります。

于 2013-02-24T18:54:19.777 に答える