0

我有一个 mbstowcs() 不能正常工作:

mbstowcs(pParams->strDstFile, parParams->DstFile, sizeof(parParams->DstFile));

调试时的参数值是:

pParams->strDstFile = 0x0018e70c
parParams->DstFile = 121 long null terminated string.
sizeof(parParams->DstFile) = 1024

参数类型是:

TCHAR strDstFile[2048]; 
char DstFile[1024];

在进入 mbstowcs(wchar_t *pwcs, const char *s, size_t n) 之后:

wchar_t  *pwcs = 0x0018ef0c

这与发送的值不同。这会导致上述调用出现故障。

ps 在另一个函数调用中,和这个几乎一样,唯一的区别是第一个参数(pwcs)不同,没有问题。

该应用程序的连续运行给出了相同的结果,具有完全相同的地址值。

在查看另一篇文章时,它似乎是一个悬空指针/缓冲区溢出,尽管我无法使用内存断点跟踪它。

我在想也许是堆栈损坏?

谢谢大家。

4

1 回答 1

0

关于 TCHAR 和各种 TCHAR 宏的扩展方式似乎有几种不同的影响,请参阅_UNICODE vs UNICODE和这篇关于 _UNICODE vs UNICODE 的帖子

在使用mbstowcs()max size 参数时,应以字符为单位指定目标缓冲区的大小,而不是源缓冲区的大小。这将有助于防止缓冲区溢出。请参阅mbstowcs 描述 ,还请注意,mbstowcs()如果字符数达到最大值,则不会零终止,这种行为类似于大多数字符操作函数。

由于mbstowcs()是用于宽字符串,因此您确实应该使用宽字符串而不是 TCHAR。

看起来您的问题是由于堆栈覆盖造成的。您是使用相同的测试数据还是使用不同的数据并得到不同的结果?

Microsoft 为 Visual Studio 引入的各种 TCHAR 和 _T() 扩展实际上是为了允许在 Windows 的非 UNICODE 版本(例如 Windows 95/98)和 UNICODE 版本的 Windows(例如 Windows XP)之间轻松移植应用程序。多字节字符串功能还旨在为 Windows 95/98 的泰语或简体中文等语言提供支持,因为它们没有太多对 UNICODE 的核心 Windows API 支持,UNICODE 是 32 位 Windows 版本(如 Windows XP 或 Windows)的一部分行政长官。

在 Windows XP 及更高版本的 UNICODE 世界中,使用 TCHAR 扩展似乎没有什么价值,因为它们只会增加源代码和编译器设置的复杂性。

不确定您为什么使用多字节字符串而不是 UNICODE。我有一个针对 Windows 98 和 Windows XP 的旧应用程序,它确实在用户界面上进行了一些转换,但是所有内容都在内部存储为宽字符 UNICODE 字符串。我在应用程序中引入了对多字节字符串的原始支持,因为当时它似乎是必要的,但是虽然这在当时看起来是个好主意,但它引入了我真的希望我没有做过的复杂性。可能你正在做类似的事情。

于 2012-08-11T15:07:23.817 回答