我正在开发一个使用该IStream
接口读取和写入数据的 COM 库。我的 MIDL 代码如下所示:
interface IParser : IUnknown
{
HRESULT Load([in] IStream* stream, [out, retval] IParsable** pVal);
};
由于IStream
它的基本接口ISequentialStream
未在类型库中定义,因此它们在我的中定义。到目前为止,一切都很好。但是,当我使用 OLEView 查看我的类型库时,ISequentialStream
只定义了成员RemoteRead
and RemoteWrite
,而我期望Read
and Write
,因为它们是我实际调用的。更奇怪的是,MSDN列出了这两个成员(除了原始成员之外),但声明它们不受支持。
问题
那么这些成员是什么,我如何从客户端使用它们(例如,一个托管应用程序来创建一个托管Stream
包装器IStream
)?
漫长的故事
我想在客户端实现一个包装器,它将IStream
调用转发到 .NET 流,例如System.IO.FileStream
. 这个包装器可以像这样继承IStream
:
public class Stream : Lib.IStream
{
public System.IO.Stream BaseStream { get; private set; }
public Stream(System.IO.Stream stream)
{
this.BaseStream = stream;
}
// All IStream members in here...
public void Read(byte[] buffer, int bufferSize, IntPtr bytesReadPtr)
{
// further implementation...
this.BaseStream.Read();
}
}
然后,我想用这个包装器调用我的服务器:
var wrapper = new Stream(baseStream);
var parsable = parser.Load(wrapper);
问题是,Lib.Stream
在前面的示例中只提供RemoteRead
and RemoteWrite
,因此服务器调用stream->Read()
最终会进入无人区。据我了解,有System.Runtime.InteropServices.ComTypes.IStream
托管 COM 服务器,但在我的示例中,我有一个非托管 COM 服务器和一个应该提供IStream
实例的托管客户端。