如何使用Qt / C ++获取Windows路径

时间:2012-06-05 17:03:36

标签: c++ qt

我正在尝试使用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 ->());

6 个答案:

答案 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");

https://doc.qt.io/qt-5/qprocessenvironment.html

答案 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;