我只想获得在控制台上写的可执行文件的完整路径,但是变量路径只存储数字如何将其转换为字符串(我知道这段代码只输出路径的内存位置)?
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int main() {
WCHAR path[MAX_PATH];
GetModuleFileName(NULL, path, 500);
cout << "File path is: " << path << endl;
}
答案 0 :(得分:2)
您的代码存在一些问题:
GetModuleFilename
- 缓冲区大小应该是TCHAR中的大小,在您的情况下为MAX_PATH,而不是500.这是一个等待发生的缓冲区溢出为500 &GT; MAX_PATH 答案 1 :(得分:0)
wchar是16位,你正在使用cout,输出流需要8位字符,这就是为什么你在输出上得到奇怪的数字
当你必须使用wchar时使用wcout并处理你使用的那种字符串!
答案 2 :(得分:0)
正如评论中已经提到的,您可能希望使用wcout
来打印WCHAR
字符串。
您可能需要考虑使用这样的函数以便捷的C ++方式包装GetModuleFileName()
调用:
#include <stdexcept> // For std::runtime_error
#include <string> // For std::wstring
#include <Windows.h> // For Win32 API
// Represents an error in a call to a Win32 API.
class win32_error : public std::runtime_error
{
public:
win32_error(const char * msg, DWORD error)
: std::runtime_error(msg)
, _error(error)
{ }
DWORD error() const
{
return _error;
}
private:
DWORD _error;
};
// Returns the full path of current EXE
std::wstring GetPathOfExe()
{
// Get filename with full path for current process EXE
wchar_t filename[MAX_PATH];
DWORD result = ::GetModuleFileName(
nullptr, // retrieve path of current process .EXE
filename,
_countof(filename)
);
if (result == 0)
{
// Error
const DWORD error = ::GetLastError();
throw win32_error("Error in getting module filename.",
error);
}
return filename;
}
请注意,如果您想要原始字符串缓冲区的WCHAR
s中的大小,则可能需要使用_countof()
。
答案 3 :(得分:0)
#include <iostream>
#include <string>
#include <windows.h>
std::wstring app_path() {
std::wstring path;
path.resize(MAX_PATH, 0);
auto path_size(GetModuleFileName(nullptr, &path.front(), MAX_PATH));
path.resize(path_size);
return path;
}
int main() {
auto path(app_path());
std::wcout << L"File path is: " << path << std::endl;
}
试试这个!