我正在准备一个Delphi模块,它在一个线程中设置一个钩子来记录一个宏:
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);
Run Code Online (Sandbox Code Playgroud)
这在WinXP上工作正常,但在Vista/Windows 7上失败了ERROR_ACCESS_DENIED.我在谷歌(这个)中找到了(那个).报价单:
较低权限进程不能:...使用Journal钩子来监视更高权限的进程.
尝试没有成功:
代码示例:
if LogonUser(PWideChar(sAdminUser), PWideChar(sDomain), PWideChar(sPwd),
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then
begin
if not ImpersonateLoggedOnUser(hToken) then
raise Exception.Create('Error impersonating the user');
end;
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
Run Code Online (Sandbox Code Playgroud)
LogonUser并ImpersonateLoggedOnUser执行没有错误.
尝试的其他可能性:
您能否在Visa/Windows 7下显示设置挂钩的代码或建议工作解决方案?
我已经创建了一个需要提升的本地COM服务器,应该从非提升的进程中实例化.
使用MSDN关于COM高程名字对象的文章,我已按照指定的要求配置了服务器类.服务器已在HKLM配置单元中成功注册.
代码示例:
procedure CoCreateInstanceAsAdmin(const Handle: HWND;
const ClassID, IID: TGuid; PInterface: PPointer);
var
rBindOpts: TBindOpts3;
sMonikerName: WideString;
iRes: HRESULT;
begin
ZeroMemory(@rBindOpts, Sizeof(TBindOpts3));
rBindOpts.cbStruct := Sizeof(TBindOpts3);
rBindOpts.hwnd := Handle;
rBindOpts.dwClassContext := CLSCTX_LOCAL_SERVER;
sMonikerName := 'Elevation:Administrator!new:' + GUIDToString(ClassID);
iRes := CoGetObject(PWideChar(sMonikerName), @rBindOpts, IID, PInterface);
OleCheck(iRes);
end;
class function CoIMyServer.Create: IMyServer;
begin
CoCreateInstanceAsAdmin(HInstance, CLASS_IMyServer, IMyServer, @Result);
end;
Run Code Online (Sandbox Code Playgroud)
说到CoGetObject(PWideChar(sMonikerName), @rBindOpts, IID, PInterface)我获得UAC屏幕并确认以管理员身份运行服务器.但是,OleCheck(iRes)返回:"请求的操作需要提升"错误.
从那篇文章中我读到了"肩上(OTS)高程".
这是使我的服务器实例可用于非提升过程的唯一方法吗?如果是这样,何时应该CoInitializeSecurity在服务器上调用?
完成注册详情
HKLM\SOFTWARE\Wow6432Node\Classes\CLSID
{MyServer CLSID}
(Default) = IMyServer Object
LocalizedString …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用(this)文章从命令行自动将我的包安装到IDE .
使用IDE时,软件包安装正确,我的组件显示在Lazarus调色板上.
为了验证该文章的步骤,安装有IDE我复制后idemake.cfg,packagefiles.xml并staticpackages.inc从文件C:\Users\<user_name>\AppData\Local\lazarus到临时文件夹,所以我有我的包那里注册.
然后尝试没有成功:
1.从IDE中卸载我的包
2. make clean all从c:\Lazarus
3.调用lazbuild并构建我的包
4.将所有保存的文件(idemake.cfg,packagefiles.xml和staticpackages.inc)C:\Users\<user_name>\AppData\Local\lazarus
复制到5.复制保存idemake.cfg到c:\Lazarus
6. .lpl为我的包创建的文件并放置在C:\Lazarus\packager\globallinks
7最后称为make idepkg从C:\Lazarus
8.可选地尝试make bigide和lazbuild --build-ide=用相同的结果
当Lazarus IDE构建并启动时,我可以在已安装的软件包中看到我的软件包,但标有green "+".调色板也错过了我的组件.
如果我选择那么Tool -> Build Lazarus with profile: Build IDE with Packages,这将使我的包在第二次重建IDE后正确安装.
版本信息:
Lazarus:0.9.30.2
FPC:2.4.4
操作系统:赢7
我错过了什么吗?是否可以在没有IDE的情况下从命令行注册包?
提前致谢.