1

在十多年没有使用 C++ 编程之后,我正在尝试向旧版 C++ Win32 DLL 添加正确的错误报告。

这有力地提醒了在 C/C++ 中使用空终止字符串令人难以置信的乏味——更不用说潜在的缓冲区溢出和安全问题了。

我正在考虑使用更高级的字符串库——可能是 MFC CString 或 STL 库。

编辑

我们软件的两个旧版本都使用 DLL - 用 C++ 编写;和更新的版本 - 用 C# 编写。

编译器是VS2008。

对于第一遍,我将记录到标准 Windows 事件日志,因为将错误消息传递回 DLL 客户端将是一个重大的架构变化(当前架构很糟糕,多个故障模式被折叠成一个布尔通过/失败返回值一直传递到调用堆栈。不用说,这使得问题诊断成为一场噩梦)。但我想在以后改进这一点。

字符串库问题

既然这是一个 DLL,这甚至是一个好主意吗?

DLL 是否有任何特殊注意事项?

我应该注意的问题?

为此目的,一个图书馆是否比另一个图书馆更好?

空字符串问题

如果我遇到空终止,我应该使用哪组字符串函数?MS 帮助文档不鼓励使用旧的 C 函数(例如 strcat 等)。但是现在似乎有很多很多其他选项可用(例如_tcscat、_mbscat、wcscat 等)。我应该使用哪个,为什么?

4

3 回答 3

3

这实际上取决于您要添加哪种类型的错误报告,以及该报告是否只是在 DLL 内部,或者它是否跨越 DLLL 边界进入调用 EXE。您可以在 DLL 的内部代码中使用您想要的任何字符串类/库,但对于导出的 DLL 函数和回调的参数,您应该继续使用以空字符结尾的字符指针,以便与多种编译器和语言兼容。

于 2012-04-18T23:01:00.517 回答
3

从 DLL 共享任何类型的模板类都是危险的。由于模板位于头文件中,因此您无法控制程序是否使用与您的 DLL 相同版本的头文件 - 不匹配会导致致命的错误。

至于 _tcscat、_mbscat 和 wcscat 之间的区别,您需要确定 API 的字符集。这些_mb函数使用大部分过时的多字节字符集,并且这些wc函数使用 wchar_t Unicode。_t根据您设置项目定义的方式,这些功能将解析为一个或另一个。

于 2012-04-18T23:06:49.467 回答
1

如果你小心,你总是可以使用std::string构造函数转换任何传入的内容,并使用str.c_str().

于 2012-04-18T23:00:07.670 回答