[英]Problem: How to convert CString into const char * in C++ MFC
[英]Why does MFC C++ CString(const char*) completely changing const char* value?
我希望標題足夠好,可以幫助解釋我遇到的問題。 我認為一旦解決了這個問題,我的項目就會完成。 請注意,兩個項目都是在Unicode下編譯的。
我正在使用帶有LPCTSTR
並返回const char*
的CLI/C++
DLL。 如果在逐步執行時將返回值存儲在項目中的const char*
中,則可以看到返回值就是我希望返回的值。
現在,如果我執行以下操作:
LPCTSTR strValue = L"test";
const char* Return = MethodCall(strValue);
LPCTSTR Final = CString(Return);
返回值將等於“ Xmkk = Asmks”(這應該是)。 此方法加密字符串。 問題是當我執行CString
,Final將等於“ ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ㹙癩鞮᠀諸²⤐²”。 如何在不更改其數據的情況下將onst char*
轉換為LPCTSTR
”
謝謝。
銷毀CString(Return)之后(此情況發生在“其構造后的下一行”)。“最終”指針指向已釋放的內存塊(該內存是內部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
正如vnm所提到的,您通過在第3行中調用其構造函數來創建一個臨時CString
對象,然后該對象立即被銷毀。 這會重新分配用於緩沖區的內存塊,這意味着任何嘗試訪問該內存中存儲的數據的操作都是未定義的行為。 這就是您的字符串看上去亂碼的原因:它已被刪除。
如果您不熟悉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
}
您可以做的是創建一個新的CStringA
對象,並將其CStringA
為const char*
作為Final。 然后,只要定義了CStringA,Final將保持有效。
我建議不要使用CString
(或CStringW
)來存儲需要使用const char*
訪問的存儲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.