2010-03-24 53 views
3

这确实是a previous one的问题,我需要为每个用户注册应用程序,TLB和OCX,而不是注册到HKLM。我写了下面的代码 - 基于这里和其他地方的答案,但TLB未注册 - 不会引发错误,只是什么都不会发生(此代码片段来自Embarcadero websiteRegisterTypeLibForUser调用似乎不工作 - 任何想法?

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; 

任何人有任何指针作为。我现在失去了

更新:所有帮助和建议

谢谢你,所以要澄清...

据我了解,这,我应该不属于R平等地提高许可,所以这应该是工作,但我可能是错的。应用程序没有被虚拟化(或者至少不是这个意思),目前它只是调用上面的代码,没有别的。

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

回答

3

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

+0

您的意思是更改并重新编译VCL - 或者可以将它视为本地文件的副本吗? – Mmarquee 2010-03-24 10:06:51

+0

不,我的意思是你需要在注册表中注册你的COM类。 RegisterTypeLib不会在CLSID中为您的CoClass创建注册表项。 – ChristianWimmer 2010-03-26 10:45:27

0

对Vista或Win7运行时,您还必须以提升的权限运行。

CNC中
的问题可能是你的应用程序被虚拟化,并RegisterTypeLib初始呼叫正在恢复正常,但其仅适用于当前会话。要么完全消除该呼叫,要么只有在vista之前的操作系统版本上运行时才执行呼叫。

+0

由于该功能只访问HKCU配置单元,因此它旨在无Admin权限的情况下工作。 – ChristianWimmer 2010-03-26 10:46:39