蒼天吶,寫了一個com組件編譯通過,MFC測試,編譯通過,但是,但是,但是,系統初始化的時候卻無法獲取com組件句柄,很難受,度媽媽查了兩天未果,找人問了一下是rgs的鍋,由於編譯器鬧鬼,沒有自動生成rgs文件一次組件並沒有註冊到系統的註冊表裏,因此這個時候MFC再去系統裏獲取com組件的時候肯定找不到啊。因此只能手動編輯rgs文件,然後通過了,通過了。。。。
不多說上代碼
MFC調用com組件代碼
CoInitialize(NULL);
CLSID clsid;
CString str ="";
//BSTR bstr = _bstr_t(str.c_str());
BSTR bstr = str.AllocSysString();
BSTR outBstr;
HRESULT hr=CLSIDFromProgID(OLESTR("LFSSDCardCom.ssdCardInterface"),&clsid);
IssdCardInterface *ptr;
if(SUCCEEDED(hr))
{
hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
__uuidof(IssdCardInterface),(LPVOID*)&ptr);
outBstr = ptr->ReadUserCard(bstr);
//str = ptr->GetIDCardInfo();
SetDlgItemText(IDC_EDIT1,(_bstr_t)outBstr);
}
else
{
SetDlgItemText(IDC_EDIT1,"ProgID to clsid failure!");
}
if (FAILED(hr))
{
SetDlgItemText(IDC_EDIT1,"創建根接口失敗!");
}
CoUninitialize();
HRESULT爲空,手動編輯rgs文件
首先編輯com文件的rgs文件,
其中LFSSDCardCom.DLL爲你的com組件名稱
HKCR
{
NoRemove AppID
{
'%APPID%' = s 'LFSSDCardCom'
'LFSSDCardCom.DLL'
{
val AppID = s '%APPID%'
}
}
}
然後編輯com組件的接口類rgs文件
HKCR
{
LFSSDCardCom.ssdCardInterface.1 = s 'ssdCardInterface Class'
{
CLSID = s '{542C7D4A-0D52-4F29-87FD-3F7EA890250A}'
}
LFSSDCardCom.ssdCardInterface = s 'ssdCardInterface Class'
{
CLSID = s '{542C7D4A-0D52-4F29-87FD-3F7EA890250A}'
CurVer = s 'LFSSDCardCom.ssdCardInterface.1'
}
NoRemove CLSID
{
ForceRemove {542C7D4A-0D52-4F29-87FD-3F7EA890250A} = s 'ssdCardInterface Class'
{
ProgID = s 'LFSSDCardCom.ssdCardInterface.1'
VersionIndependentProgID = s 'LFSSDCardCom.ssdCardInterface'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
'TypeLib' = s '{998BA579-7232-4CA9-B265-D554F6C98A6E}'
Version = s '1.0'
}
}
}
其中CLSID爲idl文件中的
編寫完成之後保存,編譯,註冊com組件
重新編譯MFC
OK,就此完成。