gpt4 book ai didi

delphi - SHGetFolderPath 对我不起作用

转载 作者:行者123 更新时间:2023-12-03 15:55:10 25 4
gpt4 key购买 nike

我有这个功能:

function GetProfilePath: string;
const
SHGFP_TYPE_CURRENT = 0;
var
hToken: THandle;
ProfilePath: packed array[ 0..MAX_PATH ] of Char;
begin
ZeroMemory(@ProfilePath[0], SizeOf(ProfilePath));
OpenProcessToken( GetCurrentProcess, TOKEN_QUERY, hToken );
SHGetFolderPath( 0, CSIDL_APPDATA, hToken , SHGFP_TYPE_CURRENT, @ProfilePath[ 0 ] );
CloseHandle( hToken );
Result := ProfilePath;
end;

SHGetFolderPath 返回 E_FAIL (0x80004005) 和一个空的 ProfilePath 缓冲区。 MSDN 表示 E_FAIL 表示“nFolder 中的 CSIDL 有效,但该文件夹不存在”。但我很确定该文件夹确实存在。当我创建一个简单的测试应用程序并运行相同的代码时,它运行良好。

这可能有什么问题?

更新:我发现我的应用程序在 Delphi 下运行时运行不佳。当我单独运行它时,一切正常。

谢谢,罗马

最佳答案

用户 token 的使用看起来不必要地复杂。但是,话虽如此,当我在我的机器上运行你的代码时,它运行良好,没有错误。也许您的进程的用户 token 没有足够的权限访问该文件夹。或者该文件夹确实不存在!

就其值(value)而言,我认为您最好使用更简单的关闭 API SHGetSpecialFolderPath 。我的包装如下所示:

function GetSpecialFolderPath(const CSIDL: Integer): string;
var
Buffer: TWin32PathBuffer;
begin
if SHGetSpecialFolderPath(Application.Handle, @Buffer[0], CSIDL, False) then begin
Result := Buffer;
end else begin
RaiseLastOSError;
end;
end;

当然,如果该文件夹确实不存在,这可能会以与您的版本相同的方式失败。

<小时/>

好的,我刚刚重新阅读了您问题中的这条评论:

When I'm creating a simple test application and running the same code, it works well.

这听起来像是您在不同的上下文中运行真实的代码。也许在服务中?或者通过用户模拟。也许这就是解决这个问题的线索。关于代码失败的环境/上下文/设置,您没有告诉我们什么?

<小时/>

以及对您的代码的一些非常小的评论。您定义的 ProfilePath 多了一个所需的元素,而 packed 对于数组来说是多余的:

ProfilePath: array[ 0..MAX_PATH-1 ] of Char;

或者,更好的是,重新使用 Delphi RTL 中定义的类型,TWin32PathBuffer

关于delphi - SHGetFolderPath 对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8268982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com