在服务程序中,获取当前用户目录(如:C:\Documents and Settings\The God\Application Data)

最近在项目中遇到要服务中读取另外的程序保存的配制文件信,以前用 GetSpecialFolder(0, CSIDL_APPDATA) 这个API 来

获取当前用户的数据保存目录在XP下是没有问题的,如果是win7,vista 系统的话,由于服务是system 权限直接调用GetSpecialFolder(0, CSIDL_APPDATA)

返回的路径就不是当前登陆用户的目录。最后找到有一个API , 需要获取复制一个当前Explorer.exe 进程的 Token 来解取当前用户的目录就对了。

function SHGetFolderLocation(hwndOwner: HWND; csidl: Integer; hToken: THandle;
  dwFlags: DWORD; var ppidl: PItemIDList): HResult; stdcall;



完整的Delphi 代码如下:


function GetSpecialFolder_ForService(const nFolder: Integer): string;
var
  PItem: PItemIDList;
  Handle: HWND;
  nToken: DWORD;
  Path: Array[0..MAX_PATH] of widechar;
begin
  Result := '';
  nToken := GetTokenByName('Explorer.EXE');  //  这个是我获取Explorer.exe 进程的 Token 函数。
  if SHGetFolderLocation(0, nFolder, nToken, 0, PItem)=S_OK then
  begin
    SHGetPathFromIDList(PItem, Path);
    Result := Path;
  end;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值