描述:
写了个MFC 控件,中间调用一个ATL写的COM组件,如下:
LONG CSedPrinterOcxCtrl::Open(LPCTSTR DeviceName)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
_bstr_t strstr ="LPT";
::CoInitialize(NULL);
CLSID clsid;
HRESULT hr=::CLSIDFromProgID(OLESTR("Sed_Ptr_Module.SedPtrMod.1"),&clsid);//CLSCTX_INPROC_SERVER
ISedPtrMod *ptr;
hr=::CoCreateInstance(clsid,NULL,CLSCTX_ALL,__uuidof(ISedPtrMod),(LPVOID*)&ptr);
if(S_OK==hr)
{
ptr->OpenDevice(strstr);//OpenDevice()是COM内提供的函数
}
::CoUninitialize();
return 0;
}
ATL的COM组件中OpenDevice()功能由一个MFC动态库提供,ATL项目中调用如下:
STDMETHODIMP CSedPtrMod::OpenDevice(BSTR DeviceName, LONG* SedResult)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加实现代码
TCHAR s[MAX_PATH];
DWORD len = MAX_PATH;
LPCTSTR lpszKeyName = L"SOFTWARE\\OLEforRetail\\ServiceOPOS\\POSPrinter\\BTP-R990";
if(key.Open(HKEY_LOCAL_MACHINE, lpszKeyName) == ERROR_SUCCESS)
{
if(ERROR_SUCCESS==key.QueryStringValue(L"LDN",(LPTSTR)s,&len))
{
DWORD len = MAX_PATH;
BSTR p=::SysAllocString(s);
LONG cmp=BstrCmp(p,DeviceName);
if(cmp==S_OK)
{
Open("SP580");//Open()由一个MFC动态库提供
}
else
{
return S_FALSE;
}
}
}
return S_OK;
}
问题来了:各个项目单独编译均正确,但在OCX项目内调试运行时,执行到“hr=::CoCreateInstance(clsid,NULL,CLSCTX_ALL,__uuidof(ISedPtrMod),(LPVOID*)&ptr);”时就出错"hr 0x80040154 没有注册类别".
但时要把ATL项目中的“Open("SP580")”行屏蔽,各项目内调试运行就正常了?
这是怎么回事??哪里出错了呢??
解决方案1:
你不觉得你这两个代码atl和mfc在循环调用吗?
解决方案2: 和dll一块调,确定是哪里出的问题