小编da-*_*oft的帖子

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
查看次数

尝试发布或编辑时,其他用户更改了记录

正在使用Delphi 7Sql Server express 2008 R2开发应用程序,使用BDE通过ODBC连接Sql Server,并使用SQL Native Client作为驱动程序.

在某些特定形式的表组件加薪EDBEngineError"记录已被其他用户更改",我只是尝试添加数据,发生同样的问题时table.cancel,table.post,table.edit.....

几天前我将驱动程序从SQL Server更改为Sql Native Client因为sql server有"连接有另一个hstmt的结果集"的问题,所以我把它改为SQL Native客户端,形成这个我遇到了'记录已经由antoher用户'错误更改.

请任何一个帮助

sql-server delphi odbc bde sql-server-native-client

4
推荐指数
1
解决办法
2399
查看次数