C++;可执行文件所在文件夹的[Windows]路径 在Windows上的C++应用程序中,我需要访问一些文件,使用代码> fStuts。这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件文件夹路径的最简单、最重要的方法是什么

C++;可执行文件所在文件夹的[Windows]路径 在Windows上的C++应用程序中,我需要访问一些文件,使用代码> fStuts。这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件文件夹路径的最简单、最重要的方法是什么,c++,windows,C++,Windows,用于查找exe的运行位置 WCHAR path[MAX_PATH]; GetModuleFileNameW(NULL, path, MAX_PATH); 然后从路径中删除exe名称。默认情况下,运行exe的目录应该是起始位置。因此,在子文件夹中打开文件应该尽可能简单 fstream infile; infile.open(".\\subfolder\\filename.ext"); 从你的程序中 但是,除非您使用一个封装了所需功能的框架(我会看看boost),或者直接使用Windows A

用于查找exe的运行位置

WCHAR path[MAX_PATH];
GetModuleFileNameW(NULL, path, MAX_PATH);

然后从路径中删除exe名称。

默认情况下,运行exe的目录应该是起始位置。因此,在子文件夹中打开文件应该尽可能简单

fstream infile; 
infile.open(".\\subfolder\\filename.ext");
从你的程序中


但是,除非您使用一个封装了所需功能的框架(我会看看boost),或者直接使用Windows API(如sean e所建议的)

GetThisPath.h

/// dest is expected to be MAX_PATH in length.
/// returns dest
///     TCHAR dest[MAX_PATH];
///     GetThisPath(dest, MAX_PATH);
TCHAR* GetThisPath(TCHAR* dest, size_t destSize);
/// dest is expected to be MAX_PATH in length.
/// returns dest
///     TCHAR dest[MAX_PATH];
///     GetThisPath(dest, MAX_PATH);
TCHAR* GetThisPath(TCHAR* dest, size_t destSize);
GetThisPath.cpp

#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

TCHAR* GetThisPath(TCHAR* dest, size_t destSize)
{
    if (!dest) return NULL;
    if (MAX_PATH > destSize) return NULL;

    DWORD length = GetModuleFileName( NULL, dest, destSize );
    PathRemoveFileSpec(dest);
    return dest;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

TCHAR* GetThisPath(TCHAR* dest, size_t destSize)
{
    if (!dest) return NULL;

    DWORD length = GetModuleFileName( NULL, dest, destSize );
#if (NTDDI_VERSION >= NTDDI_WIN8)
    PathCchRemoveFileSpec(dest, destSize);
#else
    if (MAX_PATH > destSize) return NULL;
    PathRemoveFileSpec(dest);
#endif
    return dest;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);

更新:在Windows 8中不推荐使用。但是,此替换项仅在Windows 8+中可用。(感谢@askalee的评论)

我认为下面的代码可能有效,但我将把上面的代码留在那里,直到下面的代码被审查。我目前还没有一个编译器来测试这个。如果您有机会测试此代码,请发表评论,说明以下代码是否有效,以及您测试的操作系统。谢谢


GetThisPath.h

/// dest is expected to be MAX_PATH in length.
/// returns dest
///     TCHAR dest[MAX_PATH];
///     GetThisPath(dest, MAX_PATH);
TCHAR* GetThisPath(TCHAR* dest, size_t destSize);
/// dest is expected to be MAX_PATH in length.
/// returns dest
///     TCHAR dest[MAX_PATH];
///     GetThisPath(dest, MAX_PATH);
TCHAR* GetThisPath(TCHAR* dest, size_t destSize);
GetThisPath.cpp

#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

TCHAR* GetThisPath(TCHAR* dest, size_t destSize)
{
    if (!dest) return NULL;
    if (MAX_PATH > destSize) return NULL;

    DWORD length = GetModuleFileName( NULL, dest, destSize );
    PathRemoveFileSpec(dest);
    return dest;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

TCHAR* GetThisPath(TCHAR* dest, size_t destSize)
{
    if (!dest) return NULL;

    DWORD length = GetModuleFileName( NULL, dest, destSize );
#if (NTDDI_VERSION >= NTDDI_WIN8)
    PathCchRemoveFileSpec(dest, destSize);
#else
    if (MAX_PATH > destSize) return NULL;
    PathRemoveFileSpec(dest);
#endif
    return dest;
}
TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
  • 感谢@Warpspace建议的更改
没有Win32 API的方法有没有?@ ASAS:不,不是一个简单而安全的方法。@ ASAS:不使用Win32 API编写C++ Windows应用程序?喜欢用Qt吗?肖恩:是的,没有Win32 API。它不是一个GUI应用程序-它是我目前在MSVC中编写的一个解释器,移植起来应该不会太难-Win32 API让移植变得很难。我知道这确实很旧,但是
getModuleFileName(NULL,path,MAX_path)
还不够吗?什么?你听说过磨合吗?您不必告诉我exe运行的路径是默认路径……以防您误解:每个进程都有自己的值,表示当前目录。默认情况下,此值应设置为可执行文件所在的目录。您可以使用
GetCurrentDirectory()
的API调用检查此目录,或者使用
SetCurrentDirectory()
设置它。虽然我意识到这不是你问题的精确解决方案(正如我在原文中所说的),但信息并没有错。如果你觉得值得投反对票,我不确定你是否理解这里投票系统的预期用途。他可能指的是“开始”选项,你可以在Windows开始菜单程序链接中指定开始工作目录。答案不完整,但是我认为它不值得这些否决票。例如,除了有明确指定工作目录的快捷方式外,当从
cmd
启动程序时,当前工作目录将从父进程继承。您真的不能假设CWD与可执行映像的位置有任何关系。
PathRemoveFileSpec的+1不知道这一点。PathRemoveFileSpec似乎已被弃用:,请改用PathChRemoveFileSpec。@askalee值得注意的是,它仅受Win8(及以上版本)的支持当我意识到这在Windows8上不起作用时,桌面应用程序即将实现它。例如,Windows 8.1是
NTDDI\u WINBLUE
,而不是
NTDDI\u WIN8
。如果(NTDDI\U版本>=NTDDI\U WIN8)
PathchreMoveFileSpec
不起作用,我将从
#pragma comment(lib,“Pathcch.lib”)
调用我,但我得到一个错误
参数类型“TCHAR*”与参数类型“PWSTR”不兼容
比使用argv[0]更复杂的东西这是int main(int argc,char*argv[])的一个参数并对其进行解析?