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()
это функция, чтобы получить AbsolutePath
из std::string
тип данных с использованием GetModuleFileNameA
API и так далее.
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);
но это показывает мне как первый скриншот.
В чем проблема?
Проблема в этой строке:
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();
Других решений пока нет …