2013-07-15 26 views
5

我想使用的PInvoke科技本地庫使用.NET位圖中,本地功能具有以下原型機GDI的位圖,如何從一個.net位

int cropImage( bool aBlocking,Gdiplus::Bitmap *aInputImage,) 

我又寫道的下面的PInvoke

public extern int cropImage(bool blocking , Intptr bitmap) 

,我叫它這樣

System.Drawing.Bitmap b = new Syste.Drawing.Bitmap("Amour.jpg"); 
cropImage(true,b.getHitmap()); 

,但它不工作,你有什麼sugge st?

回答

0

我建議克服這個問題的最好方法是使用一個本地庫,它接受一個HBitmap,然後使用CBitmap :: fromHandle函數,然後調用你正在嘗試與之通信的API!

2

Gdiplus :: Bitmap是一個C++類,它在<GdiPlusHeaders.h> Windows SDK頭文件中聲明。它是一個包裝類,可以使較不友好的低級別GDI + C界面更易於使用。 System.Drawing.Bitmap是而不是這個C++類的直接替代品,它也是一個圍繞低級GDI + API的包裝類,但是用C#編寫。它與C++包裝完全沒有關係。使用從Bitmap.GetHbitmap()得到的HBITMAP也不起作用,這是句柄,而不是C++對象。

您不能直接從C#中調用此函數,pinvoke不支持創建C++對象。您需要用C++/CLI語言編寫一個ref類包裝器。支持編寫託管代碼和調用本地C++代碼而無需pinvoke的語言。你可以根據需要#include <gdiplus.h>,這樣你就可以創建Gdiplus :: Bitmap對象。另一種方法是使用C++創建一個DLL,該DLL具有兩個導出函數,一個創建Gdiplus :: Bitmap,另一個破壞它。這將讓你使用pinvoke,而不是將參數聲明爲IntPtr。