COM免注册C++代码

HRESULT WINAPI GetClassIID(LPCTSTR lpszDllFileName, LPCTSTR lpszClassName, REFIID classIID)
{
	ITypeLib* lpTypeLib = NULL;
 
	HRESULT hr = LoadTypeLibEx(lpszDllFileName, REGKIND_NONE, &lpTypeLib);
 
	if (FAILED(hr))return hr;
 
	CComPtr<ITypeLib> pTypeLib(lpTypeLib);
 
	UINT nTypeInfoCount = pTypeLib->GetTypeInfoCount();
 
	for (UINT i = 0 ; i < nTypeInfoCount; i++)
	{
		ITypeInfo* lpTypeInfo = NULL;
 
		hr = pTypeLib->GetTypeInfo(i, &lpTypeInfo);
 
		if (SUCCEEDED(hr))
		{	
			CComPtr<ITypeInfo> pTypeInfo(lpTypeInfo);
 
			TYPEATTR* lpTypeAttr = NULL;
 
			hr = lpTypeInfo->GetTypeAttr(&lpTypeAttr);
 
			if (SUCCEEDED(hr))
			{
				if (lpTypeAttr->typekind == TKIND_COCLASS)
				{			
					_bstr_t strTmp;
					hr = pTypeLib->GetDocumentation(i, strTmp.GetAddress(), NULL, NULL, NULL);
 
					if (SUCCEEDED(hr))
					{
						if (strTmp == _bstr_t(lpszClassName))
						{
							CopyMemory((void*)&classIID, &(lpTypeAttr->guid), sizeof IID);
 
							pTypeInfo->ReleaseTypeAttr(lpTypeAttr);
 
							return S_OK;
						}
					}
				}
 
				pTypeInfo->ReleaseTypeAttr(lpTypeAttr);
			}
		}
 
	}
 
	return S_FALSE;
}
 
 
HRESULT WINAPI CreateDllObjectW(LPCTSTR lpszDllFileName, LPCTSTR lpszClassName, IDispatch **ppvObject)
{
	IID classIID = {0};
 
	HRESULT hr = GetClassIID(lpszDllFileName, lpszClassName, classIID);
 
	if (FAILED(hr)) return hr;
 
	HINSTANCE hDllInst = GetModuleHandle(lpszDllFileName);
 
	if (!hDllInst) hDllInst = LoadLibrary(lpszDllFileName);
		
	if (!hDllInst) return S_FALSE;
 
	typedef HRESULT (__stdcall* pfnDllGetClassObject)(REFCLSID, REFIID, void**);
	pfnDllGetClassObject fnDllGetClassObject = (pfnDllGetClassObject)GetProcAddress(hDllInst, "DllGetClassObject");
 
	if (!fnDllGetClassObject)
	{
		FreeLibrary(hDllInst);
		return S_FALSE;
	}
 
	IClassFactoryPtr lpClassFactory = NULL;
 
	hr = (fnDllGetClassObject)(classIID, IID_IClassFactory, (void**)&lpClassFactory);
 
	if (SUCCEEDED(hr)) 
	{ 
		hr = lpClassFactory->CreateInstance(NULL, IID_IDispatch, (void**)ppvObject);
 
		if (SUCCEEDED(hr)) return S_OK;
	}
 
	FreeLibrary(hDllInst);
 
	return S_FALSE;
};
 
 
HRESULT WINAPI CreateDllObjectA(LPCSTR lpszDllFileName, LPCSTR lpszClassName, IDispatch **ppvObject)
{
	return CreateDllObjectW(CA2T(lpszDllFileName), CA2T(lpszClassName), ppvObject);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C+V代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值