我希望标题足以帮助解释我遇到的问题。我想一旦解决了这个问题我的项目就差不多完成了。请注意,这两个项目都是在 Unicode 下编译的。
我正在使用 CLI/C++
DLL,它接受 LPCTSTR
并返回 const char*
。如果我在单步执行时将返回值存储在项目中的 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
关于c++ - 为什么 MFC C++ CString(const char*) 完全改变 const char* 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9791661/