最近在项目中遇到要服务中读取另外的程序保存的配制文件信,以前用 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;