2011-06-15 95 views
0

我已經從用C++編寫具有以下signiture一個DLL導出函數:PInvoke的和的IStream

Foo(LPSTREAM *pStream, UINT &Size) 

返回一個存儲器流,顯然它的大小。我遇到的困難是爲導出的函數創建簽名,然後嘗試在C#中讀取流。一度能夠使用「不安全」字節指針來獲取信息,但這不符合我們的要求。

任何想法,例子,樣品等將不勝感激。

回答

0

你可以做到這一點,像這樣:

[DLLImport(@"mydll.dll")] 
public static extern void Foo(out ComTypes.IStream Stream, ref uint Size); 

這樣稱呼它:

ComTypes.IStream Stream = null; 
uint Size; 
Foo(out Stream, ref Size); 

正常,請確保您的調用約定比賽(C#默認爲STDCALL,C++默認爲CDECL) 。


順便說一句,爲什麼返回Size從自IStream知道它的大小,並會告訴你,如果你問到流分開?

+0

謝謝戴夫。我改變了代碼,當foo export函數執行時拋出一個異常。 – Kev 2011-06-15 17:59:40

+0

消息\t「無法將類型爲'System .__ ComObject'的COM對象轉換爲接口類型爲'System.Runtime.InteropServices.ComTypes.IStream'。此操作失敗,因爲對於IID爲'{0000000C'的接口在COM組件上調用QueryInterface -0000-0000-C000-000000000046}'由於以下錯誤而失敗:不支持此類接口(來自HRESULT的異常:0x80004002(E_NOINTERFACE))。「 \t字符串 – Kev 2011-06-15 18:00:20

+0

@Kev我已經做了一些挖掘,我現在有信心,它的工作原理。我認爲問題在於你沒有返回實現'IStream'的接口,就像錯誤信息所述。 – 2011-06-15 21:58:12