0
LPCSTR dllPath = ExePath().append("\\").append(DEF_INJECT_DLL).c_str();
DWORD dwBufSize = (DWORD)(strlen(dllPath) + 1) * sizeof(LPCSTR);

/* test */

char tbuf[1024]= {0,};
sprintf_s(tbuf, "dllPath : %s\r\ndwBufSize : %d", dllPath, dwBufSize);
MessageBoxA(NULL, tbuf, "TEST", MB_OK);

注入我的dll的部分代码。

ExePath()是使用API 等获取数据类型AbsolutePath的函数。std::stringGetModuleFileNameA

DEF_INJECT_DLL定义为#define "MyDll.dll"

但是当我运行这段代码时,它显示了断线......

在此处输入图像描述

而且,当我将其更改MessageBoxA为:

MessageBoxA(NULL,
            ExePath().append("\\").append(DEF_INJECT_DLL).c_str(),
            "TEST",
            MB_OK);

在此处输入图像描述

它显示正确?

另外,我尝试过这种方式:

MessageBoxA(NULL,dllPath, "TEST", MB_OK);

但它向我展示了第一个屏幕截图。

问题是什么?

4

1 回答 1

3

问题出在这一行:

LPCSTR dllPath = ExePath().append("\\").append(DEF_INJECT_DLL).c_str();

在这里你调用ExePath(),它返回一个std::string实例,修改它,最后调用c_str()以获取原始数据缓冲区。

但是,返回值是一个临时对象。在该行之后,返回的将std::string被删除,并将清理其内存。因此,dllPath指向的地址不再有效!

您可以将返回值存储在本地实例中,例如

std::string str = ExePath().append("\\").append(DEF_INJECT_DLL);
LPCSTR dllPath = str.c_str();
于 2013-01-25T14:43:01.270 回答