SHGetFolderPath返回带有问号的路径

时间:2010-12-28 17:25:32

标签: c++ winapi unicode character-encoding

我们的应用程序在运行时调用ShGetFolderPath来获取“我的文档”文件夹。这通常很有效。但是,对于三个用户 - Дмитрий,Jörg和Jörgen(看看你是否可以发现模式!) - 该调用会返回一些非常奇怪的结果。例如,对于Дмитрий,调用返回:

c:\Users\???????\Documents

我假设有一些字符编码shenanigan在这里,可能与Unicode有关,但我没有任何相关的经验。如何从窗口中获取文件夹(和其他相关文件夹)的有用路径,而无需通过注册表项来查看信息?

在发给我的电子邮件中,Дмитрий(“德米特里”)告诉我他的“我的文件”文件夹实际上就在这里:

C:\Users\43D6~1\Documents

所以我知道有一种方法可以从Windows中获得“正常”版本的路径,我只是不知道它是什么。

背景:我们的应用程序不支持unicode,并使用标准的“char *”字符串。我们怎样才能获得“正常”的路径?我不反对调用函数的“unicode”版本,然后将其转换为“普通”文本,如果可能的话。完全将应用程序转换为使用unicode不是一种选择(我们没有时间)。

感谢。

2 个答案:

答案 0 :(得分:5)

继续使用Unicode获取文件路径。然后调用GetShortPathNameW转换为短路径名组件。输出不应包含ASCII范围之外的任何字符,即使它是Unicode函数。然后,您可以将每个Unicode字符截断回8位以创建char字符串。

答案 1 :(得分:2)

  

我不反对调用该函数的“unicode”版本,然后将其转换为“普通”文本,如果可能的话。

如果您将对SHGetFolderPath的呼叫更改为SHGetFolderPathW,它将为您提供类型为LPWSTR的字符串,这是一个Unicode字符串。从那里,您可以将该字符串与以W结尾的各种Unicode函数一起使用,以访问所需的文件夹。