代码之家  ›  专栏  ›  技术社区  ›  Peter Mortensen icecrime

如何使用C版本化的COM接口?

  •  1
  • Peter Mortensen icecrime  · 技术社区  · 15 年前

    如何创建已扩展的COM组件的实例和调用?

    我已经使用了第三方COM组件(来自Finnigan/Thermo Scientific的xrawfile2.dll)多年。 mass spectrometry 用.NET(混合vb.net和c)编写的用于访问原始光谱数据的相关应用程序。这很有效。但是,这个COM组件已经通过接口继承进行了扩展。以IDL表示(使用 OLE/COM Object Viewer [oleview.exe]):

    interface IXRawfile3 : IXRawfile2 {
    .
    .
    
    interface IXRawfile2 : IXRawfile {
    .
    .
    
    interface IXRawfile : IDispatch {
    .
    .
    
    coclass XRawfile {
        [default] interface IXRawfile;
    };
    

    完全提取 IDL for XRawFile2.dll 可用(HTML页面,带有<pre>)。

    我想使用新接口(ixrawfile3)中可用的函数,

    GetMassListRangeFromScanNum()
    

    而不是

    GetMassListFromScanNum()
    

    在原始接口(ixrawfile)中。

    创建xrawfile的实例并调用getMassListFromScannum()没有问题。 但我无法让它与getMassListRangeFromScannum()一起工作。例如,对xrawfile的一个实例使用getmasslistrangefromscannum()会产生以下编译错误:

      Error 1 'XRAWFILE2Lib.XRawfile' does not contain a
      definition for 'GetMassListRangeFromScanNum' and no
      extension method 'GetMassListRangeFromScanNum' accepting a
      first argument of type 'XRAWFILE2Lib.XRawfile' could be
      found (are you missing a using directive or an assembly
      reference?)
    

    这个 tryout C# source code 也有。

    平台:Windows XP 64位SP2。Visual Studio 2008。xrawfile2.dll的互操作文件是由Visual Studio 2008以正常方式创建的。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ian Ringrose    15 年前

    尝试将xrawfile的实例强制转换为ixrawfile3

    例如

    ( (IXRawfile3) myRawFile ).GetMassListRangeFromScanNum()
    

    这应该在COM对象上做一个查询接口,要求它提供Ixrawfile3接口。(假设导入的typelib与xrawfile的实现匹配)

        2
  •  0
  •   Pete Irfan TahirKheli    10 年前

    我建议使用以下语句(对于版本2.2):

    MSFileReader_XRawfile rawfile = new MSFileReader_XRawfile();
    

    这只会让你紧张。

    稍后您可以调用任何方法。