定义了char *GetExeFullPath()但是返回了空值

img

这个是在网上找到的,但是现在不管用
也不知道为什么,就挺烦人的,还以为其他片段错了

char buff[MAX_PATH];//用于存放获取的路径信息。
GetModuleFileName(NULL,buff,MAX_PATH);//第一个参数为句柄,NULL则指向当前程序。第二个参数用于存放地址的指针,第三个参数,系统自带的宏定义。不用管。
CString str=buff;//将buff存放的路径赋给字符串str,此时buff值如:“E:\MyTest\Debug****.exe”
int pos=str.ReverseFind('\');//查找倒数最后一个“\”符号
str=str.Left(pos+1);//str只获取exe所在文件夹路径; str为:"E:\MyTest\Debug"
//注意:第三步reversefind()函数中使用的是单引号。
return str

【以下回答由 GPT 生成】

是的,我想要找到为什么函数GetExeFullPath()返回空值以及其他代码是否有问题,并提供解决方案。

首先,让我们来看看函数GetExeFullPath()为什么会返回空值。根据您提供的代码,函数的实现如下:

char* GetExeFullPath()
{
    char* path = new char[1024];
    memset(path, 0, 1024);

    if (GetModuleFileName(NULL, path, 1024) == 0)
        return NULL;

    return path;
}

这个函数的目的是获取可执行文件的完整路径。它首先创建一个动态内存数组,并将其每个字节初始化为0。然后,它调用GetModuleFileName函数将可执行文件的完整路径存储在数组中。如果GetModuleFileName函数返回0,即失败,那么函数会返回空值,否则返回数组。

有几个原因可能导致GetModuleFileName函数失败并返回0: 1. 没有传递正确的模块句柄给GetModuleFileName函数。获取当前可执行文件的句柄可以通过将第一个参数设置为NULL来实现。 2. 内存不足以存储完整的路径。

解决方案: 1. 确保正确传递模块句柄给GetModuleFileName函数。在第一个参数中,您可以尝试将NULL替换为当前可执行文件的句柄,如下所示:

HMODULE hModule = GetModuleHandle(NULL);
if (GetModuleFileName(hModule, path, 1024) == 0)
    return NULL;
  1. 如果您的路径长度大于1023个字符,那么将动态内存数组的大小增加到适当的大小。可以使用strlen函数来获得路径的长度,然后根据需要增加数组的大小。

另外,还有一些其他代码存在问题: 1. 在main函数中,使用ifstream创建了akagiboundary对象,并尝试读取其中的内容。但是在您提供的代码中,没有进行实际的读取操作。应该使用getline函数或>>操作符来读取文件的内容。 2. 在文件无法读取时,尝试执行一些系统命令来下载文件是有问题的。可以尝试使用其他方法来处理文件读取失败的情况。

请参考下面修改后的代码:

#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;

char* GetExeFullPath()
{
    char* path = new char[1024];
    memset(path, 0, 1024);

    HMODULE hModule = GetModuleHandle(NULL);
    if (GetModuleFileName(hModule, path, 1024) == 0)
        return NULL;

    return path;
}

int main()
{
    char* exePath = GetExeFullPath();
    if (exePath != NULL) {
        cout << exePath << endl;
        delete[] exePath;
    }

    ifstream akagi("Akagi64.exe");
    string read_aka;
    if (akagi >> read_aka) {
        // 处理读取到的内容
    } else {
        // 文件读取失败的处理方法
    }
    akagi.close();

    ifstream boundary("ProjectBoundarySteam.exe");
    string read_boundary;
    if (boundary >> read_boundary) {
        // 处理读取到的内容
    } else {
        // 文件读取失败的处理方法
    }
    boundary.close();
}

希望这可以帮助您解决问题。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^