【问题标题】:Access a COM Interface method C++访问 COM 接口方法 C++
【发布时间】:2010-09-30 10:46:22
【问题描述】:

两者:

  • CLSID
  • 独立身份证

已指定上述内容,并使用:

  • CoCreateInstance()

返回由上述 CLSID 指定的类的单个未初始化对象。

然后如何从 C++ 访问接口的方法? 没有:

  • ATL
  • MFC
  • 简单的 C++

之后,我使用 CreateInstance()

我遇到了麻烦,使用 CreateInstance() - 最后一个参数 - ppv

使用oleview,可以看到上面指定IID以上IID的方法,如:

interface IS8Simulation : IDispatch {
    HRESULT Open([in] BSTR FileName);
};

然后我怎样才能访问上述内容?示例/指导 - 请

问候

【问题讨论】:

    标签: c++ com oleview


    【解决方案1】:

    通过执行 CoCreateInstance,您可以获得一个接口指针。通过 QueryInterface(...) 方法,您可以轻松获取其他接口的接口指针。 例如。,

    IUnknown* pUnk = NULL; HRESULT hr = ::CoCreateInstance(clsid,NULL,CLSCTX_ALL,__uuidof(IUnknown),(void**)&pUnk);

    IS8Simulation* pSim = NULL; hr = pUnk->QueryInterface(__uuidof(IS8Simulation), (void**)&pSim);

    完成此操作后,您将在 pSim 中获得指向 IS8Simulation 的指针,通过它您可以调用该接口的方法。请记住,您需要在 CoCreateInstance 调用中提供有效的 clsid。

    【讨论】:

    • 在示例中,两个 uuidof(..) 调用都应以双下划线开头。我补充说,但不知何故那些在格式中丢失了(我应该已经逃脱了那些)
    • Aamir 为一篇好帖子 +1,但与其评论自己的帖子,不如编辑它们。让那些只浏览帖子而不看 cmets 的人一目了然。
    • 感谢 Aamir,但是 - IS8Simulation 声明在哪里?如何从该接口调用包含 BSTR 等参数的方法(如上图所示)
    • 嗯...使用Oleview可以看到接口的typelib信息。这将告诉您接口来自哪个二进制文件。它通常类似于 win32 = 'something.dll'。这是通常包含此接口声明的 dll/tlb 等。
    • 我得到了以下编译错误:IS8Simulation' undeclared (first use this function) pSim' undeclared (首先使用这个函数) `__uuidof' undeclared (首先使用这个函数)
    【解决方案2】:

    实际问题是什么有点模糊。一些代码会有所帮助。但是要猜一猜,需要QueryInterface吗?

    【讨论】:

      【解决方案3】:
       IS8Simulation* pSim = NULL;
       hr = pUnk->QueryInterface(__uuidof(IS8Simulation), (void)&pSim);
      

      我会尝试上述方法,但声明的是 IS8Simulation - 请原谅我对 COM 的理解不足

      另外,如何调用方法,下面使用plain C++

      HRESULT Open([in] BSTR FileName)
      

      【讨论】:

      • 一旦你有了指向你的接口的指针,即上面例子中的 pSim,你可以简单地调用它的方法,比如.. BSTR bstrFileName = ::SysAllocString(fileName); hr = pSim->打开(bstrFileName);记得在使用后通过调用 ::SysFreeString() 来释放 BSTR 是的,这是纯 C++
      • 阿米尔,再次感谢!!! :) 我会尝试上述方法,并将发布我的发现 - 你帮了大忙哇!
      【解决方案4】:

      您可能想要#import "something.dll"。这将为您提供诸如 IS8Simulation 之类的类型的 C++ 声明,类似于 #include "something.h" 会做的事情。

      【讨论】:

      • 我正在尝试使用 MIDL 编译器编译 IDL 文件。我发现了像“single”(VB)这样的类型声明——这正常吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2015-10-13
      • 2014-02-19
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多