2016-04-01 3 views
0

Wir müssen eine C-Zeichenfolge durch DLL-Grenzen in einer sicheren Weise zurückgeben! Wie können wir das tun?C-Zeichenfolge durch DLL-Grenzen

Meine Idee:

extern "C" __declspec(dllexport) const char *const Api 
{ 
    ... 
    static const char *output = result.c_str(); 
    return output; 
} 
+0

Was ist "Ergebnis"? Ist es auch eine statische Variable? Das Zurückgeben einer solchen Zeichenfolge ist kein Problem (aber ich würde Ihnen trotzdem empfehlen, ein Argument zu übergeben, an das Sie stattdessen kopieren), das Problem ist die Lebensdauer der Variablen, auf die Sie einen Zeiger zurückgeben. –

Antwort

1

Ein Zeiger in Ihrem Beispiel-Code zurückgegeben wird, aber der Speicherbereich das Gerät gerichtet ist, ist wahrscheinlich nicht resident bleiben.

Wenn die Ergebnisvariable (std :: string?) Auf dem Stapel liegt, wird sie zerstört, wenn die Funktion zurückkehrt und der zurückgegebene Zeiger hängt - sicherlich nicht das, was Sie wollen.

Ein sicherer Weg, dies zu tun, ist strdup() die Antwort, aber dann ist der Aufrufer verantwortlich für die Freigabe der C-String. Das Entladen der DLL bedeutet, dass der zurückgegebene Zeiger hängt, bis er auf eine Heap-Variable verweist.

1

Die einfachste Art und Weise sicher

extern "C" 
__declspec(dllexport) 
size_t Api 
    (char* dest, 
    size_t dest_size) 
{ 
    if (dest) 
    strncpy(dest, str, dest_size); 
    return strlen(str); 
} 

Die andere sichere Weise

extern "C" 
__declspec(dllexport) 
void Api 
    (void (*callback)(const char*)) 
{ 
    callback(str); 
} 

Returning malloc'd/new'd Speicher ist nicht 100% sicher, da die DLL und das Hauptprogramm kann zu verschiedenen Laufzeiten verlinken und unterschiedliche Heaps verwenden. Wenn dies der Fall ist, kann der Aufrufer den Speicher nur freigeben/löschen, indem er in der DLL freigibt/löscht (und die DLL muss diese umbrechen und die Wrapper exportieren). Das ist ein Ärger.

Die Rückgabe von statischem Speicher ist nicht 100% sicher, da der Aufrufer den Zeiger speichern und die DLL entladen könnte. In diesem Fall wird der Zeiger baumeln.

Automatische Speicherrückgabe ist natürlich 100% unsicher.

Verwandte Themen