2

タイトルが私が問題を抱えていることを説明するのに十分に役立つことを願っています。この問題を解決すれば、私のプロジェクトはほぼ完成すると思います。注意点として、両方のプロジェクトはUnicodeでコンパイルされています。

を取り込んでを返すCLI/C++DLLを使用しています。ステップスルー中にプロジェクトのリターンの値を格納すると、そのリターンが期待される値であることがわかります。LPCTSTRconst char*const char*

今、私が次のことをすると:

LPCTSTR strValue = L"test";
const char* Return = MethodCall(strValue);
LPCTSTR Final = CString(Return);

戻り値は「Xmkk=Asmks」に等しくなります(これが必要です)。このメソッドは文字列を暗号化します。問題は、私がそうするときCString、Finalは "ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ㹙癞鞮᠀に等しくなることです。データを変更せずにをにonst char*変換するにはどうすればよいですか? 」LPCTSTR

ありがとうございました。

4

3 に答える 3

4

CString(Return)が破棄された後(これは「構築後の次の行で」発生します)「Final」ポインターは、割り当て解除されたメモリーのチャンク(内部CString(Return)バッファー)を指しています。この時点で、それが指すメモリの内容は未定義であり、それを逆参照することは未定義の動作です。
内部バッファへのポインタを安全に使用するには、ポインタが存在する限り、バッファを所有するCStringが有効であることを確認する必要があります。


LPCTSTR strValue = L"test";
const char* Return = MethodCall(strValue);
LPCTSTR PointerToBuffer= 0;
{
  CString ReturnStringObj(Return);
  PointerToBuffer = ReturnStringObj;  
  // Can safelly use your pointer here  
}
// Here ReturnStringObj is killed and pointer dereferencing is invalid here




于 2012-03-20T17:22:13.537 に答える
1

vnmが言及しているように、CString3行目でコンストラクターを呼び出すことによって一時オブジェクトを作成していると、そのオブジェクトはすぐに破棄されます。これにより、バッファに使用していたメモリのチャンクの割り当てが解除されます。つまり、そのメモリに格納されているデータにアクセスしようとすると、未定義の動作になります。そのため、文字列は文字化けしているように見えます。すでに削除されています。

C ++を初めて使用する場合は、オブジェクトの存続期間を理解していることを確認する必要があります。これにより、このコードの記述が大幅に簡単になります。

解決策は、オブジェクトを使いCString終わるまでオブジェクトが破壊されないようにすることです。オブジェクトが関数内に存在するだけでよい場合は、そのオブジェクトをその関数内に作成された一時オブジェクトとして残すことができます。その関数の外部に存在する必要がある場合は、より高いレベルで作成するか、その関数へのポインターを保存する必要があります。

CStringオブジェクトは暗黙的にに変換可能であることに注意してくださいLPCTSTR

したがって、関数のスコープ内でオブジェクトを存続させるだけでよいと仮定するとCString、次のコードを記述できます。

{
    // Declare a string literal
    LPCTSTR strValue = L"test";

    // Encrypt the string
    const char* strReturn = MethodCall(strValue);

    // Create a CString object representing the encrypted string
    CStringA myString(strReturn);

    // Do something with myString, like display it in a message box
    // (Remember that it's an ANSI (non-Unicode) string!)
    // ...
    MessageBoxA(NULL, myString, NULL, MB_OK);
    // ...

    // myString (your CString object) gets destroyed here
}
于 2012-03-20T17:38:00.663 に答える
0

できることは、新しいオブジェクトを作成し、これをFinalCStringAにキャストすることです。const char*その後、CStringAが定義されている限り、Finalは有効なままになります。

を使用してアクセスする必要があるストレージにCString(または)を使用しないことをお勧めします。CStringWconst char*

于 2012-03-20T17:31:32.873 に答える