RegisterTypeLibForUser调用似乎不起作用 - 任何想法?

时间:2010-03-24 09:38:00

标签: delphi windows-7 typelib

这对a previous one来说真的是一个问题,我需要为每个用户注册应用程序,TLB和OCX,而不是HKLM。我编写了以下代码 - 基于此处和其他地方的答案,但TLB未注册 - 没有错误抛出,只是没有任何反应(此代码段来自Embarcadero website

procedure RegisterTypeLibrary(TypeLib: ITypeLib; const ModuleName: string);
var
  Name: WideString;
  HelpPath: WideString;
  RegisterTypeLibForUser : function(tlib: ITypeLib; szFullPath, szHelpDir: POleStr): HResult; stdcall;
  res : HResult;
begin
  Name := ModuleName;
  HelpPath := ExtractFilePath(ModuleName);
  res:=RegisterTypeLib(TypeLib, PWideChar(Name), PWideChar(HelpPath));
  if res <> S_OK then begin
    @RegisterTypeLibForUser:=GetProcAddress(GetModuleHandle('oleaut32.dll'), 'RegisterTypeLibForUser');
    if (@RegisterTypeLibForUser <> nil) then begin
      res:=RegisterTypeLibForUser(TypeLib, PWideChar(Name), PWideChar(HelpPath));
    end;
  end;
  //MessageBox(GetForegroundWindow, PChar(IntToHex(res, 8)), nil, MB_OK);
  OleCheck(res);
end;

任何人都有任何指示,因为我现在迷路了。

更新:

感谢所有的帮助和建议,所以要澄清......

据我了解,我不应该要求提升许可,所以这应该是有效的,但我可能是错的。应用程序没有虚拟化(或者至少它并不意味着),此时它只是调用上面的代码而没有其他任何东西。

如果我以管理员的身份运行它(或者至少不会抛出错误),不提升它会给我一个错误。那么我可以根本不这样做,还是我做错了?这与我通过regsvr32注册时相同,虽然这是一个稍微不同的问题 - 如何做同样的事情,但对于OCX控件。

2 个答案:

答案 0 :(得分:3)

您仍然需要设置reg密钥,如QC(您的链接)所示,但这次是在当前用户注册表中。

答案 1 :(得分:0)

在针对Vista或Win7运行时,您还必须使用提升的权限运行。

<强> - 编辑 -
问题可能是您的应用程序正在虚拟化,并且对RegisterTypeLib的初始调用IS返回OK,但它仅对当前会话有效。要么完全消除该调用,要么只在运行vista之前的操作系统版本时执行调用。