Windows中可执行文件的完整路径,c ++

时间:2014-03-17 21:48:09

标签: c++ winapi

我只想获得在控制台上写的可执行文件的完整路径,但是变量路径只存储数字如何将其转换为字符串(我知道这段代码只输出路径的内存位置)?

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

4 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

  • 您将错误的大小参数传递给GetModuleFilename - 缓冲区大小应该是TCHAR中的大小,在您的情况下为MAX_PATH,而不是500.这是一个等待发生的缓冲区溢出为500 &GT; MAX_PATH
  • 您正在使用窄流输出,无法打印宽字符串,因此您可以看到地址。要打印宽字符,您需要使用std :: wcout。

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

试试这个!