主 题:如何注ocx?
作 者:oldsword
所属论坛:Visual C++
问题点数:50
回复次数:5
人气指数:74
发表时间:2000-11-26 23:36:00
我原来用的是delphi,找了半天,找到了一个注册片段,如下:
[原理说明]OCX 也是 DLL(比较特殊的 DLL), 我们可以用 LoadLibrary() 载入之後, 分别查出 DllregisterServer, DllUnregisterServer, 呼叫这两支 export function 登录/取消 OCX.[参考资料] Delphi 2 Developer's Guide Second Edition. Xavier Pacheco & Steve Teixeira, Page. 195-197请教各位测试的结果! :)// ------------------------------------------------------------
// OCX 登录安装
// ------------
// 使用说明:
// InstallOcx(Ocx 的档案名称, True(登录)/False(取消登录)
// 传回值: True ==> 成功 False ==> 无法登录/取消登录
//
// e.g.
// if InstallOcx('d:\windows\system\html.ocx', False) then ..
// if InstallOcx('d:\windows\system\html.ocx', True) then ...
//
// 注意事项:
// 1. 在 Delphi IDE 执行 InstallOcx('xxx.ocx', False); 解除安
// 装後, 虽然 Windows Register Database 已清除该 OCX 的登
// 录资料, Delphi 仍需重新启动才有反应.
// 2. 本函数使用前, uses 述句中不要忘了 uses OleCtl, OleAuto;
// 3. Delphi 5 is uses ActiveX, OleServer, and EOleError is Exception;
// ------------------------------------------------------------
function InstallOcx(
const sFileName: AnsiString;
bSetup: boolean): boolean;
var
hOcx: THandle;
funcRegister: TDllRegisterServer;
funcUnRegister: TDllUnRegisterServer;
begin
Result := False;
// 检查档案是否存在
if not FileExists(sFileName) then
Raise EOleError.CreateFmt('找不到 %s', [sFileName]);
// 载入 OCX (也是一个 DLL)
hOcx := LoadLibrary(pchar(sFileName));
if hOcx < 32 then
Raise EOleError.CreateFmt('无法载入 %s', [sFileName]);
try
// 查出 DllRegisterServer 的 Call address
if bSetup then
begin
funcRegister := GetProcAddress(hOcx, 'DllRegisterServer');
if @funcRegister = nil then
Raise EOleError.CreateFmt('无法载入 %s 中的 DllRegisterServer',
[sFileName]);
// 执行 DllRegisterServer, 并与正常值比较
Result := funcRegister = S_OK;
end
else
begin
funcUnRegister := GetProcAddress(hOcx, 'DllUnregisterServer');
if @funcUnRegister = nil then
Raise EOleError.CreateFmt('无法载入 %s 中的 DllUnregisterServer',
[sFileName]);
// 执行, 并与正常值比较
Result := funcUnRegister = S_OK;
end;
// 如果执行失败, 提示讯息.
if not Result then
begin
if bSetup then
Raise EOleError.CreateFmt('无法登录注册 %s', [sFileName])
else
Raise EOleError.CreateFmt('无法取消注册 %s', [sFileName]);
end;
finally
FreeLibrary(hOcx);
end;
end;我的问题是:如何转到vc下面? 回复贴子:
edyang回复于2000-11-26 23:41:00 得20分
HINSTANCE hLib = LoadLibrary(pszDllName);if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
DisplayMessage(IDS_LOADLIBFAILED, pszDllName); //unable to load DLL
iReturn = FAIL_LOAD; //unable to load DLL
}// Find the entry point.
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,
_T(“DllRegisterServer”));
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
//unable to locate entry point
softsprite回复于2000-11-26 23:42:00 得0分
用regsvr32.exe就可以直接注册ocx
oldsword回复于2000-11-27 0:52:00 得0分
to edyang:
sorry.完整的代码呢?我为这个问题已经筋疲力尽了!
flyhigh回复于2000-11-28 9:31:00 得30分
这是我刚做的。给我分!
void CActiveXRegDlg::OnOK()
{
// TODO: Add extra validation here
CFileDialog findocx(true,0,0,0,"activex control(*.ocx)¦*.ocx¦¦");
if(findocx.DoModal()==IDOK)
{
CString pszDllName=findocx.GetPathName();
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)//
{
MessageBox("不能载入Dll文件!","结果",MB_OK);
return;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer"));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox("调用DllRegisterServer 失败!","结果",MB_OK);
FreeLibrary(hLib);
return;
}
MessageBox("注册成功","结果",MB_OK);
}
else
MessageBox("调用DllRegisterServer失败!","结果",MB_OK);
}// CDialog::OnOK();
}
取消注册只要把DllRegisterServer ->UnRegisterServer
OK!!
oldsword回复于2000-11-29 19:30:00 得0分
to flyhigh:
等我确认之后给你分
这是我已经问过的问题,你看看我发过的帖子。
作 者:oldsword
所属论坛:Visual C++
问题点数:50
回复次数:5
人气指数:74
发表时间:2000-11-26 23:36:00
我原来用的是delphi,找了半天,找到了一个注册片段,如下:
[原理说明]OCX 也是 DLL(比较特殊的 DLL), 我们可以用 LoadLibrary() 载入之後, 分别查出 DllregisterServer, DllUnregisterServer, 呼叫这两支 export function 登录/取消 OCX.[参考资料] Delphi 2 Developer's Guide Second Edition. Xavier Pacheco & Steve Teixeira, Page. 195-197请教各位测试的结果! :)// ------------------------------------------------------------
// OCX 登录安装
// ------------
// 使用说明:
// InstallOcx(Ocx 的档案名称, True(登录)/False(取消登录)
// 传回值: True ==> 成功 False ==> 无法登录/取消登录
//
// e.g.
// if InstallOcx('d:\windows\system\html.ocx', False) then ..
// if InstallOcx('d:\windows\system\html.ocx', True) then ...
//
// 注意事项:
// 1. 在 Delphi IDE 执行 InstallOcx('xxx.ocx', False); 解除安
// 装後, 虽然 Windows Register Database 已清除该 OCX 的登
// 录资料, Delphi 仍需重新启动才有反应.
// 2. 本函数使用前, uses 述句中不要忘了 uses OleCtl, OleAuto;
// 3. Delphi 5 is uses ActiveX, OleServer, and EOleError is Exception;
// ------------------------------------------------------------
function InstallOcx(
const sFileName: AnsiString;
bSetup: boolean): boolean;
var
hOcx: THandle;
funcRegister: TDllRegisterServer;
funcUnRegister: TDllUnRegisterServer;
begin
Result := False;
// 检查档案是否存在
if not FileExists(sFileName) then
Raise EOleError.CreateFmt('找不到 %s', [sFileName]);
// 载入 OCX (也是一个 DLL)
hOcx := LoadLibrary(pchar(sFileName));
if hOcx < 32 then
Raise EOleError.CreateFmt('无法载入 %s', [sFileName]);
try
// 查出 DllRegisterServer 的 Call address
if bSetup then
begin
funcRegister := GetProcAddress(hOcx, 'DllRegisterServer');
if @funcRegister = nil then
Raise EOleError.CreateFmt('无法载入 %s 中的 DllRegisterServer',
[sFileName]);
// 执行 DllRegisterServer, 并与正常值比较
Result := funcRegister = S_OK;
end
else
begin
funcUnRegister := GetProcAddress(hOcx, 'DllUnregisterServer');
if @funcUnRegister = nil then
Raise EOleError.CreateFmt('无法载入 %s 中的 DllUnregisterServer',
[sFileName]);
// 执行, 并与正常值比较
Result := funcUnRegister = S_OK;
end;
// 如果执行失败, 提示讯息.
if not Result then
begin
if bSetup then
Raise EOleError.CreateFmt('无法登录注册 %s', [sFileName])
else
Raise EOleError.CreateFmt('无法取消注册 %s', [sFileName]);
end;
finally
FreeLibrary(hOcx);
end;
end;我的问题是:如何转到vc下面? 回复贴子:
edyang回复于2000-11-26 23:41:00 得20分
HINSTANCE hLib = LoadLibrary(pszDllName);if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
DisplayMessage(IDS_LOADLIBFAILED, pszDllName); //unable to load DLL
iReturn = FAIL_LOAD; //unable to load DLL
}// Find the entry point.
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,
_T(“DllRegisterServer”));
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
//unable to locate entry point
softsprite回复于2000-11-26 23:42:00 得0分
用regsvr32.exe就可以直接注册ocx
oldsword回复于2000-11-27 0:52:00 得0分
to edyang:
sorry.完整的代码呢?我为这个问题已经筋疲力尽了!
flyhigh回复于2000-11-28 9:31:00 得30分
这是我刚做的。给我分!
void CActiveXRegDlg::OnOK()
{
// TODO: Add extra validation here
CFileDialog findocx(true,0,0,0,"activex control(*.ocx)¦*.ocx¦¦");
if(findocx.DoModal()==IDOK)
{
CString pszDllName=findocx.GetPathName();
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)//
{
MessageBox("不能载入Dll文件!","结果",MB_OK);
return;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,_T("DllRegisterServer"));
//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox("调用DllRegisterServer 失败!","结果",MB_OK);
FreeLibrary(hLib);
return;
}
MessageBox("注册成功","结果",MB_OK);
}
else
MessageBox("调用DllRegisterServer失败!","结果",MB_OK);
}// CDialog::OnOK();
}
取消注册只要把DllRegisterServer ->UnRegisterServer
OK!!
oldsword回复于2000-11-29 19:30:00 得0分
to flyhigh:
等我确认之后给你分
这是我已经问过的问题,你看看我发过的帖子。
{
ASSERT( szTargetFile ); HMODULE hDll = LoadLibrary( szTargetFile ); if ( NULL == hDll ) {
TRACE("装载OCX失败\n");
return FALSE;
} typedef int (FAR PASCAL * FUNC)(); FUNC pfunc = GetProcAddress( hDll, _T("DllRegisterServer") ); if ( NULL == pfunc ) {
TRACE("找不到DllregisterServer函数\n");
FreeLibrary( hDll );
return FALSE;
} pfunc(); FreeLibrary( hDll ); return TRUE;
}