2011-06-15 94 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