C ++ - 如何将正在运行的进程的.exe路径作为std :: string?

时间:2016-04-05 04:07:38

标签: c++ windows

我有一个程序需要将文件放在与已经运行的Windows进程相同的目录中。如何将此目录检索为std :: string,以便我可以在正确的位置写入?

我知道这不是一个问题,但我确实在谷歌搜索了很多,而且我找不到任何与解决方案类似的东西。

编辑:我正在使用Code :: Blocks,因此一个不是特定于单个IDE功能的解决方案是最好的。

2 个答案:

答案 0 :(得分:2)

如果您为Windows开发程序,则可以使用GetModuleFilename()API调用,然后从整个路径中删除文件名部分。这是一个例子:

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <regex>
using namespace std;

bool MakeNearFilename(const wstring& strPreferredFilename, wstring& strOutputFilename)
{
    WCHAR strExePath[MAX_PATH];
    if (!::GetModuleFileNameW(NULL, strExePath, _countof(strExePath))) {
        return false;
    }

    match_results<const WCHAR*> results;
    if (regex_match(strExePath, results, wregex(L"^(.+\\\\)?(.+?)\\.exe$"))) {
        strOutputFilename = wstring(results[1]) + strPreferredFilename);
    }
    else {
        strOutputFilename = strPreferredFilename;
    }

    return true;
}

int main()
{
    wstring strFilename;
    MakeNearFilename(L"MyProgram.log", strFilename);
    return 0;
}

答案 1 :(得分:1)

要获取当前流程的路径名,请使用前面提到的GetModuleFilename

要获取其他进程的路径名,请使用GetModuleFileNameEx。 Unicode示例:

#include <Windows.h>
#include <psapi.h>

#pragma comment(lib, "Psapi")

int main()
{
    wchar_t buf[MAX_PATH];
    DWORD pid = 123;
    std::cout << pid << std::endl;
    HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if (handle)
    {
        GetModuleFileNameExW(handle, 0, buf, MAX_PATH);
        CloseHandle(handle);
        std::wcout << buf << "\n";
    }

    return 0;
}

此代码需要&#34; Psapi.lib&#34;文库