修改 C++ DLL 以支持 unicode - 要避免的常见陷阱?
Posted
技术标签:
【中文标题】修改 C++ DLL 以支持 unicode - 要避免的常见陷阱?【英文标题】:Modifying C++ DLL to support unicode - common pitfalls to avoid? 【发布时间】:2009-05-04 18:53:40 【问题描述】:我有一个当前仅支持 ASCII 的 Windows DLL,我需要更新它以使用 Unicode 字符串。此 DLL 目前在许多地方使用 char* 字符串,并进行了许多 ASCII Windows API 调用(如 GetWindowTextA、RegQueryValueExA、CreateFileA 等)。
我想改用 VC++ 中定义的 unicode/ascii 宏。所以我会使用 TCHAR 而不是 char 或 CHAR。对于 char*,我会使用 LPTSTR。而且我认为像 sprintf_s 这样的东西会被改为 _stprintf_s。
我以前从未真正处理过 unicode,所以我想知道在执行此操作时是否应该注意任何常见的陷阱。是否应该像用适当的宏替换类型和方法名称一样简单,还是需要注意其他复杂情况?
【问题讨论】:
【参考方案1】:首先阅读 Joel Spolsky 的这篇文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
然后在 Stack Overflow 上运行这些链接:What do I need to know about Unicode?
通常,您正在寻找 任何 假定 一个字符 = 一个字节(内存/缓冲区分配等)的代码。但是上面的链接会给你一个很好的细节纲要。
【讨论】:
我很喜欢的原始内存。我更担心我可能遇到的 Win API 问题,或者可能不会立即明显的极端情况。【参考方案2】:最大的危险可能是缓冲区大小。如果您的内存分配是根据 sizeof(TCHAR) 进行的,那么您可能会没事,但是如果有代码中原始程序员假设字符每个为 1 个字节并且他们在 malloc 语句中使用整数,那就很难做到全局搜索。
【讨论】:
刚刚为 malloc grepped 并且它只在几个地方使用,并且只用于字符串缓冲区一次。 new 在大多数地方都使用(我宁愿在任何地方都使用它。我不喜欢混合分配技术)。我想我已经在这里了。以上是关于修改 C++ DLL 以支持 unicode - 要避免的常见陷阱?的主要内容,如果未能解决你的问题,请参考以下文章