主  题:如何注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)&brvbar;*.ocx&brvbar;&brvbar;");
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:
等我确认之后给你分  
这是我已经问过的问题,你看看我发过的帖子。

解决方案 »

  1.   

    BOOL CSetupDlg::RegisterOCX(LPCTSTR szTargetFile)
    {
    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; 
    }
      

  2.   

    用CreateProcess新开一个执行Regsvr32 a.ocx的进程。