这对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控件。
答案 0 :(得分:3)
您仍然需要设置reg密钥,如QC(您的链接)所示,但这次是在当前用户注册表中。
答案 1 :(得分:0)
在针对Vista或Win7运行时,您还必须使用提升的权限运行。
<强> - 编辑 - 强>
问题可能是您的应用程序正在虚拟化,并且对RegisterTypeLib的初始调用IS返回OK,但它仅对当前会话有效。要么完全消除该调用,要么只在运行vista之前的操作系统版本时执行调用。