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 に答える