gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:15 25 4
gpt4 key购买 nike

我在通过引用传递 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com