ブログ

割とコンピュータよりの情報をお届けします。

2019年2月3日

実行ファイルのディレクトリ名をstd::wstringで返す例

C言語からPythonの関数呼び出し4
「実行ファイルと同じフォルダにあるpyモジュールも使いたいので,前回より少し手を加えた.」と書いていた部分であるが,なかなかみすぼらしいコードだったので少し考えて,代わりのコードを用意しようと思った.

変更のコードは以下に示すが,
本体は,実行ファイルのディレクトリを取得するGetModuleFileDirW()と
バックスラッシュをバックスラッシュ2つに変換するReplaceBS2BSBS()と
wstringをstringに変換するwstring2string().

#include <string>
#include <iostream>
#include <codecvt>
#include <windows.h>

std::wstring GetModuleFileDirW()
{
    wchar_t path[MAX_PATH + 1];
    ::GetModuleFileNameW(NULL, path, sizeof(path));
    wchar_t drive[MAX_PATH + 1], dir[MAX_PATH + 1], fname[MAX_PATH + 1], ext[MAX_PATH + 1];
    _wsplitpath_s(path, drive, dir, fname, ext);

    std::wstring wsDir = drive;
    wsDir += dir;

    return wsDir;
}

std::wstring ReplaceBS2BSBS(std::wstring wsDir)
{
    {
        std::wstring wstmp;
        for (int i = 0; i < (int)wsDir.size(); ++i) {
            wstmp += wsDir[i];
            if (wsDir[i] == '\\') {
                wstmp += TEXT("\\");
            }
        }
        wsDir = wstmp;
    }
    return wsDir;
}

std::string wstring2string(std::wstring wsDir)
{
    // wstring からstringへの変換
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv;
    return cv.to_bytes(wsDir);
}

int main()
{
    std::wstring wsDir = ::GetModuleFileDirW();
    wsDir = ReplaceBS2BSBS(wsDir);

    // wstring からstringへの変換
    std::string sDir = ::wstring2string(wsDir);
    std::cout << sDir.c_str() << std::endl;

    return 0;
}

c_str()で前の例と同じchar[]に変換している.

≫ 続きを読む

2019/02/03 コンピュータ   TakeMe