C++ 通过引用 dll 中的函数传递 std::string

标签 c++ string c++11 dll pass-by-reference

我在通过引用传递 std::string 以在 dll 中运行时遇到问题。

这是函数调用:

CAFC AFCArchive;

std::string sSSS = std::string("data\\gtasa.afc");

AFCER_PRINT_RET(AFCArchive.OpenArchive(sSSS.c_str()));
//AFCER_PRINT_RET(AFCArchive.OpenArchive(sSSS));
//AFCER_PRINT_RET(AFCArchive.OpenArchive("data\\gtasa.afc"));

这是函数头:

#define AFCLIBDLL_API __declspec(dllimport) 
AFCLIBDLL_API EAFCErrors CAFC::OpenArchive(std::string const &_sFileName);

我尝试通过调用函数逐步调试并查看函数内部的 _sFileName 值。

_sFileName 在函数中设置任何值(例如,t4gs..\n\t)。

我尝试检测任何堆损坏,但编译器说没有错误。

DLL 已在调试设置中编译。 .exe 程序也在调试中编译。

怎么了??帮助..!

附言我使用的是 Visual Studio 2013.WinApp。

编辑

我已将 func 的 header 更改为此代码:

AFCLIBDLL_API EAFCErrors CAFC::CreateArchive(char const *const _pArchiveName)
{
    std::string _sArchiveName(_pArchiveName);
    ...

我真的不知道,如何修复这个错误...

关于堆:它是在我们进程的虚拟内存中分配的,对吧?在这种情况下,共享虚拟内存很常见。

最佳答案

这个问题与 STL 无关,而与跨应用程序边界传递对象有关。

1) DLL 和 EXE 必须使用相同的项目设置进行编译。您必须这样做,以便结构对齐和打包相同,成员和成员函数没有不同的行为,更微妙的是,引用和引用参数的低级实现完全相同。

2) DLL 和 EXE 必须使用相同的运行时堆。为此,您必须使用运行时库的 DLL 版本。

如果您创建一个与 std::string 做类似事情(在内存管理方面)的类,您会遇到同样的问题。

内存损坏的原因可能是有问题的对象(在本例中为 std::string)分配和管理动态分配的内存。如果应用程序使用一个堆,而 DLL 使用另一个堆,如果您在 DLL 中实例化 std::string,但是应用程序正在调整字符串的大小(意思是可能会发生内存分配)?

关于C++ 通过引用 dll 中的函数传递 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279052/

相关文章:

c++ - 使用头文件/源文件时访问类变量时出现问题

c++ - 在 C++ 中如何使用模板调用提供类型的特定成员

c++ - 如何在 CLI 上打印下标/上标?

c++ - 为什么在实现单例类时得到 "Undefined reference error"?

C++ recvfrom 超时

c++ - 读取文件

c++ - 我应该从使用 boost::shared_ptr 切换到 std::shared_ptr 吗?

java - java中的字符串到字符数组

ruby - 在 Ruby 中定义 String#prev 方法

c - char str[] 和 char *str 作为函数参数有什么区别?