小编Ale*_*yin的帖子

WH_JOURNALRECORD的SetWindowsHookEx在Vista/Windows 7下失败

我正在准备一个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钩子来监视更高权限的进程.

尝试没有成功:

  1. 以管理员身份运行应用 可能线程以比主线程更低的权限启动(虽然我不是100%肯定)
  2. 使用管理员安全上下文模拟线程也无济于事.

代码示例:

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)

LogonUserImpersonateLoggedOnUser执行没有错误.

尝试的其他可能性:

  1. 永久关闭UAC.这有帮助,但我不能强迫模块用户这样做.
  2. 模块客户签署应用程序并将其放在受信任的位置.没有尝试过,但这极大地使用户的模块使用复杂化.
  3. 将模块放入一些已签名的应用程序并分发EXE.这将打破一些核心功能.

您能否在Visa/Windows 7下显示设置挂钩的代码或建议工作解决方案?

delphi winapi windows-vista windows-7 setwindowshookex

8
推荐指数
1
解决办法
2844
查看次数

COM Elevation Moniker无法在Vista/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)

delphi com winapi windows-vista windows-7

6
推荐指数
1
解决办法
1747
查看次数

从命令行在Lazarus上安装不带IDE的软件包

我正在尝试使用(this)文章从命令行自动将我的包安装到IDE .

使用IDE时,软件包安装正确,我的组件显示在Lazarus调色板上.
为了验证该文章的步骤,安装有IDE我复制后idemake.cfg,packagefiles.xmlstaticpackages.inc从文件C:\Users\<user_name>\AppData\Local\lazarus到临时文件夹,所以我有我的包那里注册.

然后尝试没有成功:
1.从IDE中卸载我的包
2. make clean allc:\Lazarus
3.调用lazbuild并构建我的包
4.将所有保存的文件(idemake.cfg,packagefiles.xmlstaticpackages.inc)C:\Users\<user_name>\AppData\Local\lazarus
复制到5.复制保存idemake.cfgc:\Lazarus
6. .lpl为我的包创建的文件并放置在C:\Lazarus\packager\globallinks
7最后称为make idepkgC:\Lazarus
8.可选地尝试make bigidelazbuild --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的情况下从命令行注册包?

提前致谢.

ide package lazarus fpc

5
推荐指数
1
解决办法
1345
查看次数