【发布时间】: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