C++ ATL組件編譯通過之後集成式無法初始化,HRESULT句柄返回爲空的情況, 需要Registrar文件手動編輯

蒼天吶,寫了一個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,就此完成。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章