Ist es sicher, Funktionszeiger als Argumente zu übergeben Funktionen DLL und rufen sie aus dem Innern des dll?

StackOverflow https://stackoverflow.com/questions/653697

Frage

Ich mag einig (dll oder nicht) Funktionszeiger als Argumente für einige DLL-Funktionen und sie von der Innenseite der DLL-Aufruf zu übergeben. Ich frage mich, ob es sicher ist, weil ich eine Information über http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref HTM dass:

In DLL-Code wird davon ausgegangen, dass ein Funktionszeiger auf eine Funktionsdeskriptor. Ein Funktionszeiger Gespräch wird durch zuerst Erhalten der Funktionsadresse durch Dereferenzieren des Zeigers hergestellt ist; und dann, Verzweigung auf die Funktion Eintrag. Wenn ein Nicht-DLL-Funktion Zeiger auf DLL-Code übergeben wird, weist sie direkt auf die Funktion Eintrag. Ein Versuch zu dereferenzieren durch einen solchen Zeiger erzeugt eine nicht definierte Funktionsadresse. Die anschließende Verzweigung auf die nicht definierten Adresse kann zu einer Ausnahme führen.

Gilt diese Regel für Visual Studio und anderen Compiler als auch?

Was genau ich versuche zu tun ist, um das Problem der Speicherzuweisung und Aufhebung der Zuordnung zwischen verschiedenen dll und nicht-DLL-Funktionen zu lösen. Meine Idee ist, zwei Funktionszeiger zu übergeben - für gemeinsame Zuweisung und Freigabe-Funktionen -. Zu jeder DLL in einiger Initialisierung (zum Beispiel initialisieren (& malloc, & free)) und führen Sie dann alle Speicherverwaltung dieser gemeinsam verwenden und somit immer kompatible Funktionen

War es hilfreich?

Lösung

Es ist nicht wahr. DLL-Code behandelt Funktionszeiger auf genau die gleiche Art und Weise wie nicht-DLL-Code. Ist dies nicht der Fall wäre, könnte man nicht Standard-Bibliothek Funktionen wie qsort verwenden () innerhalb einer DLL (die einen Funktionszeiger Argument erwartet).

Andere Tipps

Passing Funktionszeiger auf eine DLL ist seit Generationen geschehen ist.

All Callback-Funktionen in der GUI-Programmierung verwendet (zB Fortschrittsbalken Update) verwenden Funktionszeiger.

Bei der Verwendung von WIN32 Entwicklung gibt es einen Grund, warum Sie Funktionszeiger auf malloc / free nutzen? Warum verwenden Sie nicht einfach malloc / free direkt?

Das ist, wie ich habe es immer in der Vergangenheit getan. Nicht, dass dies garantiert es ist der richtige Weg.
In der Tat könnte man das als Hinweis nehmen, dass es den denkbar schlechtesten Weg ist:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top