c++ - C++ DLL 中的线程安全字符串缓冲区变量

标签 c++ winapi dll string thread-safety

我正在 MSVC++2010 中编写带有导出函数的 Win32 DLL。其中一些函数将文件名返回为 LPCSTR。因为我以前有时需要摆弄字符串,所以我目前正在使用一个长度为 32184 的全局缓冲区变量,它应该涵盖 Windows 中可能出现的任何文件名,然后我总是初始化并返回需要字符串的地方。

我的老板使用 VB6 遗留应用程序中的这个库。他现在告诉我他需要它是线程安全的:对我来说不幸的是,由于 VB6 的事件驱动行为,即使另一个函数尚未返回,也可能会在我的库中调用一个函数。当然,这意味着我不能依赖单个内部缓冲区,而是必须在每次需要时创建一个然后返回它。

2 个问题:

  1. 我严重依赖 Windows API 函数,例如 FindFirstFile 和来自 filesystemregex 库的 Boost 函数。我可以假设它们都是线程安全的吗?

  2. 如果我每次想要返回一个字符串时都必须在堆上创建一个新的缓冲区,我应该在哪里再次释放内存?

最佳答案

  1. Windows API 函数通常是线程安全的,但有一定的局限性(例如,您不能同时从两个线程在同一个句柄上FindNextFile,但可以使用两个不同的句柄)。对于 boost 函数,请查阅文档,但一般来说,文件系统/正则表达式函数应该是安全的,只要您不同时在两个线程之间使用同一个对象。
  2. 您必须让 VB6 应用程序回调以在完成后释放该字符串。您可能还想考虑将 DLL 编写为 COM 库;从 COM 调用返回的 BSTR 将在不再需要时由 VB6 自动释放。

关于c++ - C++ DLL 中的线程安全字符串缓冲区变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6444831/

相关文章:

C++ 嵌套类前向声明​​错误

c++ - 当未与 GCC 和 CMAKE 一起使用时如何解决 undefined reference

unicode - Win32 API 函数需要什么编码?

delphi - 将基本程序中的过程名称传输到 dll 中并在那里执行

c# - 将函数转储到动态程序集中

c++ - 无法链接到库...VS 2010 lib

c++ - 在 Xcode 中的第 imread ("one.jpg"行发出)

c++ - 指向 char 数组的指针,未处理的异常

c++ - WINAPI C/C++ -> 为什么二进制文件的大小会急剧增加? (从 VS2013 切换到 VS 2015)

c++ - 哪些 Win32 用户模式句柄可以在进程之间共享?