2013-02-24 79 views
0

我目前在託管C++代碼中有一個System::Drawing::Bitmaps數組。我希望能夠從非託管(本地)C++調用託管C++中的方法。問題是如何將數組傳回非託管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

您一定需要創建一個非託管數組來調用您的本機代碼。之後你還必須照顧正確的清理。所以基本的代碼應該是這樣的:

#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文件和函數名稱和簽名。你當然必須替換它們。

+0

就代碼託管C++中的託管位圖轉換爲HBITMAP而言,此代碼非常有用。進一步的問題:我實際上是從外部非託管C++代碼調用此方法。所以當我從非託管C++傳入HBITMAP數組時,我將它作爲「HBITMAP *位圖」傳入。 – user1059993 2013-02-25 02:22:41

+0

然後在託管的C++ I中分配位圖=新的HBITMAP [託管位圖的數量]。然後我按照上面的指示分配每個元素。這一切工作正常,除非當我回到託管C++方法時:位圖數組突然變爲空,返回到非託管代碼。我假設也許我必須在託管C++中分配不同的HBITMAP數組? – user1059993 2013-02-25 02:25:09

相關問題