C++ Übergeben std::string durch den Verweis auf die Funktion in der dll

Habe ich das problem mit der übergabe by reference std::string Funktion in der dll.

Diese Funktion aufrufen:

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

Diese Funktion header:

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

Ich versuche zu Debuggen, pass-by-step durch die Funktion aufrufen und schauen _sFileName Wert innerhalb der Funktion.

_sFileName in Funktion setzt einen beliebigen Wert(beispielsweise t4gs..\n\t).

Ich versuche zu erkennen, keine heap-Beschädigung, aber der compiler sagt, dass es kein Fehler ist.

DLL kompiliert wurde, die im debug-Einstellungen. .exe-programm kompiliert in debug zu.

Was ist falsch?? Hilfe..!

P. S. ich habe Visual Studio 2013. WinApp.

BEARBEITEN

Habe ich header ändern der func diesem code:

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

Ich weiß wirklich nicht, wie man diesen Fehler beheben kann...

Über den Haufen: Sie zugeordnet sind, im virtuellen Speicher unseres Prozesses, richtig? In diesem Fall, gemeinsam genutzten virtuellen Speicher üblich ist.

  • Wurden die EXE-und DLL kompiliert mit genau dem gleichen compiler, exakt die gleichen flags? Ansonsten werden die Definitionen der std::string und andere STL-Typen sein könnte, der Unterschied zwischen der EXE und der DLL, und die, die Probleme verursachen können.
  • Ich würde empfehlen, dass Sie halten Sie Ihre DLLs mit einem gut definierten ABI . Vorbei zugewiesenen Speicher über eine DLL-Schnittstelle ist nach ärger. Die DLL und das aufrufende Anwendung möglicherweise nicht mit den gleichen heap, zum Beispiel.
  • warum sollte das ein problem sein, wenn Sie nicht verwenden Sie die gleichen heap? Sie immer noch teilen sich den gleichen Adressraum, richtig?
  • Gut, wenn er hinzu fügt, um die Zeichenfolge und es befreit Speicher und reserviert neuen Speicher, der andere Haufen wird nicht frei, weil Sie es nicht kennen, block, etc.
  • basic_string(const _Elem *_Ptr) - es hieß nach .c_str(). _Ptr bei der Eingabe in der Funktion ist richtig: "Daten\\gtasa.afc"
InformationsquelleAutor Aleksey | 2014-03-09
Schreibe einen Kommentar