C++ chars stored in the LPCSTR .. broken?

263 Views Asked by At
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);

part of the code to inject my dll.

ExePath() is a function to get AbsolutePath of std::string data type using GetModuleFileNameA API and so on.

DEF_INJECT_DLL is defined by #define "MyDll.dll"

But when I run this code, it shows me broken strings....

enter image description here

And, when I change the MessageBoxA to this:

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

enter image description here

it shows properly?

Also, I tried in this way:

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

but it shows to me like first screenshot.

What is the problem?

1

There are 1 best solutions below

0
On

The problem is in this line:

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

here you call ExePath(), which returns a std::string instance, modify it, and finally call c_str() to get the raw data buffer.

However, the return value is a temporary object. After that line, the returned std::string is deleted, and will clean its memory. Therefore, the address where dllPath points to is no longer valid!

You could store the return value in a local instance, e.g.

std::string str = ExePath().append("\\").append(DEF_INJECT_DLL);
LPCSTR dllPath = str.c_str();