c++ - 为什么 MFC C++ CString(const char*) 完全改变 const char* 值?

标签 c++ mfc character-encoding cstring lpcstr

我希望标题足以帮助解释我遇到的问题。我想一旦解决了这个问题我的项目就差不多完成了。请注意,这两个项目都是在 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/

相关文章:

使用 Microsoft MFC 进行 C++ 单元测试

html - 元标记 "charset=utf-8"能否确保在任何浏览器中正确的可视化?

java - 将 Java 字符串转换为 Windows-1258

c++ - 无法将 id 分配给 OpenGL 中的属性

c++ - 为什么我程序中的一个变量使用了 60% 的执行时间?

c++ - 如何适本地反检查 Boost 错误代码?

model-view-controller - Windows CWnd::OnLButtonDown 双击时未按预期调用

c++ - 如何将 UTC 时间戳转换为本地时间,一小时后的秒数?

c++ MFC 和处理 windows 消息

ruby - Ruby 中的 charCodeAt() 等价物