首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

未进展系统注册的ActiveX控件,LoadLibrary/CreateInstance后,Invoke时报错“库没有注册”

2013-01-12 
未进行系统注册的ActiveX控件,LoadLibrary/CreateInstance后,Invoke时报错“库没有注册”?本帖最后由 proad

未进行系统注册的ActiveX控件,LoadLibrary/CreateInstance后,Invoke时报错“库没有注册”?
本帖最后由 proad 于 2012-11-27 13:38:19 编辑 以Flash32_11_4_402_287.ocx为例:
当flash player常规安装时,此代码能成功运行(hr=S_OK);
当flash player未安装时,此代码报错:Library not registered(库没有注册),如果让代码在未注册时成功运行?谢谢!


#define WIN32_LEAN_AND_MEAN
#include <tchar.h>
#include <Windows.h>
#include <assert.h>
#include <stdio.h>
#include <ole2.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
OleInitialize(NULL);
LPCTSTR lpFile = _T("D:\\Temp\\Flash32_11_4_402_287.ocx");
HMODULE hDll = LoadLibrary(lpFile);
if (hDll)
{
typedef HRESULT (WINAPI *DllGetClassObject_t)(REFCLSID, REFIID, LPVOID*);

DllGetClassObject_t DllGetClassObject = NULL;
DllGetClassObject = (DllGetClassObject_t)GetProcAddress(hDll, "DllGetClassObject");
if (DllGetClassObject)
{
CLSID clsid = GUID_NULL;
IClassFactory *pCF = NULL;
if (SUCCEEDED(CLSIDFromString(L"{D27CDB6E-AE6D-11CF-96B8-444553540000}", &clsid))
&& SUCCEEDED(DllGetClassObject(clsid, IID_IClassFactory, (void**)&pCF)))
{
IOleObject *obj = NULL;
IDispatch *disp = NULL;
if (SUCCEEDED(pCF->CreateInstance(NULL, IID_IOleObject, (void**)&obj))
&& SUCCEEDED(obj->QueryInterface(IID_IDispatch, (void**)&disp)))
{
DISPPARAMS params = { NULL, NULL, 0, 0 };
HRESULT hr = disp->Invoke(0x70, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_METHOD,
&params, NULL, NULL, NULL);

assert(SUCCEEDED(hr));
//此处报错:0x8002801D, TYPE_E_LIBNOTREGISTERED, Library not registered(库没有注册)
}

if (disp) disp->Release();
if (obj) obj->Release();
pCF->Release();
}
}
}

OleUninitialize();
return 0;
}

[解决办法]
可以不注册,但要模拟windows加载控件的流程
那比注册后再使用麻烦多了
[解决办法]
DispInvoke()也许可行,问题是你要提供ITypeInfo*,用LoadTypeLib()试试看...

热点排行