如何获取程序当前执行路径?

Posted 學海無涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取程序当前执行路径?相关的知识,希望对你有一定的参考价值。

因在 ocx 控件中获取执行路径指向的地方不是我需要的地方,故采取获取自身加载的模块路径作为当前程序的执行路径,同时 dll 放在和 ocx 同级目录下。

#include <windows.h>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <vector>
#pragma execution_character_set("UTF-8")

std::string W2A(const std::wstring & utf8)
{
    int buffSize = WideCharToMultiByte(CP_ACP, NULL, utf8.c_str(), -1, NULL, NULL, NULL, FALSE);
    char *gbk = new char[buffSize + 1];
    memset(gbk, 0, buffSize + 1);
    WideCharToMultiByte(CP_ACP, NULL, utf8.c_str(), -1, gbk, buffSize, NULL, FALSE);
    std::string result(gbk);
    delete[] gbk;
    gbk = nullptr;
    return result;
}

#if 0
extern "C"  __declspec(dllexport) const char* __stdcall W2AEx(wchar_t* utf8)
{
    return W2A(utf8).c_str();
}
#endif

std::wstring A2W(const std::string & gbk)
{
    int buffSize = MultiByteToWideChar(CP_ACP, NULL, gbk.c_str(), -1, NULL, NULL);
    wchar_t* utf8 = new wchar_t[buffSize + 2];
    memset(utf8, 0, buffSize + 2);
    MultiByteToWideChar(CP_ACP, NULL, gbk.c_str(), -1, utf8, buffSize);
    std::wstring result(utf8);
    delete[] utf8;
    utf8 = nullptr;
    return result;
}

#if 0
extern "C"  __declspec(dllexport) const wchar_t* __stdcall A2WEx(char* gbk)
{
    return A2W(gbk).c_str();
}
#endif

char result[MAX_PATH];
extern "C"  __declspec(dllexport) const char* __stdcall OfSelfMoudulPath(char* dynamicLibrary)
{
    wchar_t buffer[MAX_PATH] = { 0 };
    GetModuleFileName(GetModuleHandle(A2W(dynamicLibrary).c_str()),buffer, MAX_PATH);
    std::string::size_type pos = W2A(buffer).find_last_of("\\/");
    std::string path = W2A(buffer).substr(0, pos);
    //return (path.c_str());
    memset(result, 0, MAX_PATH);
    strcpy_s(result, path.c_str());
    return result;
}

#if 0
std::string HexDump(char * buff, int len)
{
    std::stringstream save;
    for (unsigned char i = 0; i < len; i++)
    {
        //44 03 00 d1 56 00 00 05 00 16 60 4a 38 08 81 8e
        //44 03 00 D1 56 00 00 05 00 16 60 4A 38 08 81 8E
        save << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ((*(buff + i)) & 0xff);
    }
    //std::cout << save.str() << std::endl;
    return save.str();
}

extern "C"  __declspec(dllexport) const char* __stdcall HexDumpEx(char* buff, int len)
{
    return HexDump(buff, len).c_str();
}

std::string DeleteChar(const char * buff, int size, unsigned char code)
{
    std::vector<char> temp;
    //char temp[1024] = { 0 };
    int j = 0;
    for (int i = 0; i < size; i++)
    {
        if (*(buff + i) != code)
        {
            temp.push_back(*(buff + i));
            //temp[j] = *(buff + i);
            j++;
        }
    }
    temp.push_back(0);
    return std::string(temp.data());
}

extern "C"  __declspec(dllexport) const char* __stdcall DeleteCharEx(const char * buff, int size, unsigned char code)
{
    return DeleteChar(buff, size, code).c_str();
}
#endif

以上是关于如何获取程序当前执行路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Qt 应用程序的当前工作目录路径?

获取node 安装当前执行路径

如何在java中获取执行目录路径[重复]

如何获取当前显示的片段?

如何获取当前C#源代码文件的路径?

C#获取本执行程序所在的当前路径