web-dev-qa-db-ja.com

C ++ [Windows]実行可能ファイルがあるフォルダーへのパス

WindowsのC++アプリでfstreamを使用していくつかのファイルにアクセスする必要があります。これらのファイルはすべて、exeファイルが置かれているフォルダーのサブフォルダーにあります。

  • 最も簡単で重要なものは何ですか:現在の実行可能ファイルのフォルダへのパスを取得する最も安全な方法は何ですか?
31
asas

GetModuleHandle および GetModuleFileName を使用して、exeの実行元を確認します。

HMODULE hModule = GetModuleHandleW(NULL);
WCHAR path[MAX_PATH];
GetModuleFileNameW(hModule, path, MAX_PATH);

次に、パスからexe名を削除します。

46
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);

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;
}

mainProgram.cpp

TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);

更新: PathRemoveFileSpec はWindows 8では非推奨です。ただし、代替の PathCchRemoveFileSpec は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);

GetThisPath.cpp

#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;
}

mainProgram.cpp

TCHAR dest[MAX_PATH];
GetThisPath(dest, MAX_PATH);
23
Nate

デフォルトでは、exeが実行されるディレクトリが開始場所になります。そのため、サブフォルダー内のファイルを開くのは簡単なはずです

fstream infile; 
infile.open(".\\subfolder\\filename.ext");

プログラム内から。

ただし、必要な機能をラップするフレームワークを使用するか(ブーストを見ます)、または GetModuleFileName (ショーンeが示唆したように)

2
KevenK