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);
}
COM免注册C++代码
最新推荐文章于 2024-10-09 10:07:13 发布