我正在尝试使用Qt和C ++获取Windows路径。下面的代码编译,但没有得到Qt中的Windows文件夹路径。相同的代码适用于Visual Studio 2010
wchar_t path[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, 0, path);
以下代码更改似乎有效:
int const bufferSize = 512;
QScopedPointer<WCHAR> dirPath(new WCHAR[bufferSize]);
ZeroMemory( dirPath.operator ->(), bufferSize);
SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, 0, dirPath.operator ->());
答案 0 :(得分:2)
没有Qt功能可以执行此操作,但可以通过阅读环境变量WINDIR
来实现您的要求:
QStringList env_list(QProcess::systemEnvironment());
int idx = env_list.indexOf(QRegExp("^WINDIR=.*", Qt::CaseInsensitive));
if (idx > -1)
{
QStringList windir = env_list[idx].split('=');
qDebug() << "Var : " << windir[0];
qDebug() << "Path: " << windir[1];
}
输出:
Var : "WINDIR"
Path: "C:\WINDOWS"
答案 1 :(得分:1)
QString windowsInstallPath;
#ifdef Q_WS_WIN
QDir d;
if (d.cd("%windir%"))
windowsInstallPath = d.absolutePath();
#endif
if (!windowsInstallPath.isNull())
qDebug() << windowsInstallPath;
else
qDebug() << "Not compiled for Windows";
应该工作。
答案 2 :(得分:0)
我认为没有特定的Qt功能可以做到这一点。
最近的是QSysinfo,告诉你windows版本。但是SHGetFolderPath()shoudl在Qt中工作以及任何其他win API调用。
ps在Windows vista中 - &gt;这被替换为SHGetKnownFolderPath
答案 3 :(得分:0)
这是一个单行解决方案:
QString winPath = QString::fromUtf8(qgetenv("windir"));
这也可以用于任何环境变量。我不确定Qt4中qgetenv
是否可用,但它在Qt5中。
答案 4 :(得分:0)
我认为获取Windows目录的另一种非常合理的方法是从传递给程序的环境中获取它:
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
qDebug() << env.value("windir");
答案 5 :(得分:0)
如果您的应用程序不支持终端服务,您可能会在 TS 环境下获得不同的目录。今天我自己发现了这一点,并不是说我曾经被 %windir% 或 %SystemRoot% 或使用 ShGetKnownFolderPath 或 GetWindowsDirectory API 所困扰。
我选择使用存在于 Windows 2000 及更高版本的 GetSystemWindowsDirectory。 Microsoft's page for the function is here.
Raymond Chen 的进一步解释is here.
最后,代码...
它是用 Delphi 6 编写的。对此很抱歉:) 这是我目前正在编写的代码,但是如果您有使用您的语言编写的 GetWindowsDirectory 代码,那么只需要一些复制 + 重命名,因为函数签名是完全相同的。注意:此代码是 ANSI(...Delphi 6 中的单字节字符)。
function GetSystemWindowsDirectoryA(lpBuffer: PAnsiChar; uSize: UINT): UINT; stdcall; external kernel32 name 'GetSystemWindowsDirectoryA';
function GetSystemWindowsDirectory: string;
var
buf: array[0..MAX_PATH] of Char;
resultLength: Cardinal;
begin
resultLength := GetSystemWindowsDirectoryA(@buf, SizeOf(buf));
if resultLength = 0 then
RaiseLastOSError;
SetLength(Result, resultLength);
Move(buf, PChar(Result)^, resultLength);
end;