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文件中的

C++ ATL组件编译通过之后集成式无法初始化,HRESULT句柄返回为空的情况, 需要Registrar文件手动编辑_第1张图片

编写完成之后保存,编译,注册com组件

重新编译MFC

OK,就此完成。

 

你可能感兴趣的:(C++,COM组件,rgs)