旧版 Win32 DLL 中的空终止字符串 C++ - 有没有更好的方法
Null terminated strings in a legacy C++ Win32 DLL - is there a better way?
在 C++ 中编程之后,我正在尝试将正确的错误报告添加到旧版 Win32 DLL C++。
这有力地提醒了在 C/C++ 中使用以 null 结尾的字符串令人难以置信的乏味 - 更不用说潜在的缓冲区溢出和安全问题了。
我正在考虑使用更高级的字符串库 - 也许是 MFC CString 或 STL 库。
编辑
DLL被我们软件的旧版本(用C++编写)和新版本(用C#编写)使用。
编译器是VS2008。
对于第一次传递,我将登录到标准 Windows 事件日志,因为将错误消息传递回 DLL 客户端将是一个很大的体系结构更改(当前体系结构很糟糕,多个故障模式被折叠为单个布尔通过/失败返回值,该值一直传递回调用堆栈。 不用说,这使得问题诊断成为一场噩梦)。 但是我想在以后的某个时候改进这一点。
字符串库问题
由于这是一个 DLL,这甚至是一个好主意吗?
DLL 是否有任何特殊注意事项?
我应该注意的陷阱?
为此目的,一个库比另一个库更好吗?
空字符串问题
如果我遇到以 null 结尾的问题,我应该使用哪组字符串函数? MS 帮助文档不鼓励使用旧的 C 函数(例如 strcat 等)。 但是现在似乎还有许多其他选项可用(例如_tcscat,_mbscat,wcscat等)。 我应该使用哪个,为什么?
从 DLL 共享任何类型的模板类都是危险的。由于模板位于头文件中,因此您无法控制程序是否使用与 DLL 相同的标头版本 - 不匹配可能会导致致命的错误。
至于 _tcscat、_mbscat 和 wcscat 之间的差异,您需要确定 API 的字符集。_mb
函数使用大多数过时的多字节字符集,wc
函数使用wchar_t Unicode。_t
函数将解析为一个或另一个,具体取决于您设置项目定义的方式。
这实际上取决于您要添加的错误报告类型,以及该报告是仅在 DLL 内部还是越过 DLLL 边界进入调用 EXE。 您可以在 DLL 的内部代码中使用所需的任何字符串类/库,但对于导出的 DLL 函数和回调的参数,应继续使用 null 结尾的字符指针,以便与多个编译器和语言兼容。
如果你小心的话,你总是可以使用std::string
构造函数转换任何传入的内容,并使用str.c_str()
转换任何传出的东西。
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 遇到新行时,有没有办法停止istream_iterator
- 有没有一种方法可以在编译时获得作用域类名
- conan有没有办法导出一个空目录
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有可能有一个只有ADL才能找到的非好友功能
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- catch框架有没有办法比较流或文件
- 有没有任务栏API可以立即应用注册表更改
- 铸造标准::有没有回到原来的类型
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践