我有一个程序需要将文件放在与已经运行的Windows进程相同的目录中。如何将此目录检索为std :: string,以便我可以在正确的位置写入?
我知道这不是一个问题,但我确实在谷歌搜索了很多,而且我找不到任何与解决方案类似的东西。
编辑:我正在使用Code :: Blocks,因此一个不是特定于单个IDE功能的解决方案是最好的。
答案 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;文库