0
我已经从用C++编写具有以下signiture一个DLL导出函数:PInvoke的和的IStream
Foo(LPSTREAM *pStream, UINT &Size)
返回一个存储器流,显然它的大小。我遇到的困难是为导出的函数创建签名,然后尝试在C#中读取流。一度能够使用“不安全”字节指针来获取信息,但这不符合我们的要求。
任何想法,例子,样品等将不胜感激。
我已经从用C++编写具有以下signiture一个DLL导出函数:PInvoke的和的IStream
Foo(LPSTREAM *pStream, UINT &Size)
返回一个存储器流,显然它的大小。我遇到的困难是为导出的函数创建签名,然后尝试在C#中读取流。一度能够使用“不安全”字节指针来获取信息,但这不符合我们的要求。
任何想法,例子,样品等将不胜感激。
你可以做到这一点,像这样:
[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
知道它的大小,并会告诉你,如果你问到流分开?
谢谢戴夫。我改变了代码,当foo export函数执行时抛出一个异常。 – Kev 2011-06-15 17:59:40
消息\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
@Kev我已经做了一些挖掘,我现在有信心,它的工作原理。我认为问题在于你没有返回实现'IStream'的接口,就像错误信息所述。 – 2011-06-15 21:58:12