【问题标题】:PInvoke and IStreamPInvoke 和 IStream
【发布时间】:2011-09-15 17:18:29
【问题描述】:

我有一个用 c++ 编写的 dll 导出的函数,其签名如下:

Foo( LPSTREAM *pStream, UINT &Size ) 

返回一个内存流,显然它的大小。我遇到的困难是为导出的函数创建签名,然后尝试在 C# 中读取流。曾经可以使用“不安全”字节指针来获取信息,但这不符合我们的要求。

任何想法、示例、示例等将不胜感激。

【问题讨论】:

    标签: c# pinvoke unmanaged istream


    【解决方案1】:

    你可以这样做:

    [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)。


    顺便说一句,既然IStream 知道它的大小并且如果你要求它会告诉你,为什么将Size 与流分开返回?

    【讨论】:

    • 谢谢戴夫。我修改了代码,当执行 foo 导出函数时抛出异常。
    • 消息“无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“System.Runtime.InteropServices.ComTypes.IStream”。此操作失败,因为对 COM 组件的 QueryInterface 调用由于以下错误,IID 为“{0000000C-0000-0000-C000-000000000046}”的接口失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE))。字符串
    • @Kev 我已经进行了一些挖掘,现在我确信这可行。我认为问题在于您没有返回实现IStream 的接口,正如错误消息所述。
    • 可能不是 COM 库,LPSTREAM 只是一个指向结构的指针,就像用于 DevIL 和 FreeImage 的结构一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2013-08-15
    • 1970-01-01
    • 2011-02-27
    • 2013-03-20
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多