我遇到了将std::string按引用传递到dll函数中的问题。
这是函数调用:
这是函数头:
我尝试通过逐步调用函数来调试,并查看函数内部的
函数中的
我尝试检测任何堆栈损坏,但编译器说没有错误。
DLL已经以调试设置编译。.exe程序也以调试方式编译。
有什么问题吗?帮帮忙..!
P.S. 我使用的是Visual Studio 2013。WinApp。
编辑
我已经更改了函数的头文件为以下代码:
这是函数调用:
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程序也以调试方式编译。
有什么问题吗?帮帮忙..!
P.S. 我使用的是Visual Studio 2013。WinApp。
编辑
我已经更改了函数的头文件为以下代码:
AFCLIBDLL_API EAFCErrors CAFC::CreateArchive(char const *const _pArchiveName)
{
std::string _sArchiveName(_pArchiveName);
...
我真的不知道如何修复这个错误...
关于堆:它是分配在我们进程的虚拟内存中的,对吧?在这种情况下,共享虚拟内存是普遍存在的。
std::string
和其他STL类型的定义可能在EXE和DLL之间不同,这可能会导致问题。 - cf-basic_string(const _Elem *_Ptr)
- 它是在.c_str()之后被调用的。在进入函数时_Ptr的值正确:"data\gtasa.afc"。 - Aleksey