【问题标题】:Trying to call a function via a pointer to a smart pointer to a COM interface尝试通过指向 COM 接口的智能指针的指针调用函数
【发布时间】:2014-07-10 09:04:21
【问题描述】:

我按照 Microsoft 教程 here(在 SO 的帮助下)从 C++ 代码调用 COM 对象。

教程的第 9 步说:

要调用托管 DLL,请将以下代码添加到 _tmain 功能:

// Initialize COM.
HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
ICalculatorPtr pICalc(__uuidof(ManagedClass));

当我在我的文件中使用这些代码行时,它们运行良好,并且我成功调用了 COM 接口上的函数。

现在,我需要在 2 个静态函数中访问 pICalc,所以我想将其设为静态类变量(我知道 static 在这句话中有 2 个不同的含义)。

这是我的代码:

在 MyCPlusPlusClass.h 中:

static ICalculatorPtr* pICalc;

在 MyCPlusPlusClass.cpp 中:

//Pointer definition
ICalculatorPtr* MyCPlusPlusClass::pICalc;

在静态函数中:

pICalc = new ICalculatorPtr(__uuidof(ManagedClass));

但是当我尝试调用函数时

(*pICalc)->SomeICalcFunction();

我明白了

_com_issue_error(Int32) at _com_ptr_t ...

我主要是 C# 程序员,所以我只是在 C++ 中犯了一个愚蠢的语法错误吗?

编辑: 在 .tlh 文件中,有

struct __declspec(uuid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")) _ManagedClass

_COM_SMARTPTR_TYPEDEF(ICalc, __uuidof(ICalc));
_COM_SMARTPTR_TYPEDEF(_ManagedClass, __uuidof(_ManagedClass));

virtual HRESULT __stdcall SomeICalcFunction (BSTR * pRetVal) = 0;

【问题讨论】:

  • 你能找到 ManagedDLL.tlh、ManagedDLL.tli 并粘贴这些文件的内容吗?
  • 您是否 100% 确定在调用 SomeICalcFunction 之前使用 pICalc 初始化调用静态函数?
  • @Wojteksurowka - 是的,因为我在静态初始化函数中调用 SomeICalcFunction,即它是初始化 pICalc 后的下一行。
  • @user2451677 - 我从 .tlh 文件中添加了一些相关行。请注意,当我在本地创建和使用接口指针时,它工作得很好,就像在教程中一样。

标签: c++ com smart-pointers


【解决方案1】:

好的,我认为您必须执行以下操作。

在 MyCPlusPlusClass.h 中:

改变

static ICalcPtr* pICalc;

static ICalcPtr pICalc;

在 MyCPlusPlusClass.cpp 中:

改变

//Pointer definition
ICalcPtr* MyCPlusPlusClass::pICalc;

ICalcPtr MyCPlusPlusClass::pICalc;

在所有静态函数中:

if(pICalc == NULL)
{
    if(FAILED(pICalc.CreateInstance(__uuidof(ManagedClass))))
        std::cout << "Can't create pICalc" << std::endl;
}

然后使用:

pICalc->SomeICalcFunction();

我真的不明白你为什么需要静态函数。将它们全部设为非静态,pICalc 也设为非静态。这样会更干净。

【讨论】:

  • @SList,您需要粘贴所有 C++ 代码,因为 _com_ptr_t 的构造函数(它是 pICalc 的类)在内部调用 CreateInstance()。这意味着 ICalcPtr pICalc(__uuidof(ManagedClass)) 和 ICalcPtr pICalc; pICalc.CreateInstance(__uuidof(ManagedClass)) 是相同的东西。您可以通过更改本地变量创建来检查这一点。
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 2021-07-22
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
相关资源
最近更新 更多