当我尝试使用 CComObject 函数创建实例时,_pAtlModule 指针为空

liy*_*ang 2 c++ com atl

我正在处理 OPC(OLE 过程控制)客户端程序,使用异步回调方法使用 KepServer 从 PLC 获取数据。但我遇到了问题:

CComObject<COPCDataCallback>* pCOPCDataCallback;    // Pointer to Callback Object

// Create Instance of Callback Object using an ATL template
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);
Run Code Online (Sandbox Code Playgroud)

然后它停在这里:

_pAtlModule->Lock();
Run Code Online (Sandbox Code Playgroud)

这是在 atlcom.h

关于如何解决这个问题的任何想法?

Rom*_* R. 5

当您使用ATL类一样CComObject,假设你有一个ATL项目,在它定义的“ATL模块”类,如CAtlExeModuleT基于对EXE应用程序。

没有定义模块类/实例,没有全局内部_pAtlModule变量的初始化,因此问题。您需要添加模块类。

添加 ATL 支持的方法之一是使用 IDE,通常如果您现有的项目是基于 MFC 的:

另一种方法是添加CAppModule实例,如果您的项目使用 WTL:

然后第三种方法是使用 Visual Studio 向导创建一个新的匹配类型(EXE 或 DLL)的干净 ATL 项目,并检查周围的代码CAtlDllModuleTCAtlExeModuleT类,然后将其复制到现有项目中。

  • 看来您也可以使用 CComObjectNoLock 但这不会锁定模块。然后使用 CComCreator 创建对象(但这会增加引用计数,与 CComObject::CreateInstance 相反)。 (2认同)