Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Passing std::string by reference to function in dll

I have the problem with passing by reference std::string to function in dll.

This is function call:

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"));

This is function header:

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

I try to debug pass-by-step through calling the function and look at _sFileName value inside function.

_sFileName in function sets any value(for example, t4gs..\n\t).

I try to detect any heap corruption, but compiler says, that there is no error.

DLL has been compiled in debug settings. .exe programm compiled in debug too.

What's wrong?? Help..!

P.S. I used Visual Studio 2013. WinApp.

EDIT

I have change header of func to this code:

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

I really don't know, how to fix this bug...

About heap: it is allocated in virtual memory of our process, right? In this case, shared virtual memory is common.

like image 995
Aleksey Avatar asked Mar 09 '14 06:03

Aleksey


1 Answers

The issue has little to do with STL, and everything to do with passing objects across application boundaries.

1) The DLL and the EXE must be compiled with the same project settings. You must do this so that the struct alignment and packing are the same, the members and member functions do not have different behavior, and even more subtle, the low-level implementation of a reference and reference parameters is exactly the same.

2) The DLL and the EXE must use the same runtime heap. To do this, you must use the DLL version of the runtime library.

You would have encountered the same problem if you created a class that does similar things (in terms of memory management) as std::string.

Probably the reason for the memory corruption is that the object in question (std::string in this case) allocates and manages dynamically allocated memory. If the application uses one heap, and the DLL uses another heap, how is that going to work if you instantiated the std::string in say, the DLL, but the application is resizing the string (meaning a memory allocation could occur)?

like image 136
PaulMcKenzie Avatar answered Sep 27 '22 20:09

PaulMcKenzie