C
Da bin ich noch einmal und ich habe auch ein paar Dinge heraus gefunden:
@ProgrammiererImFahrstuhl (PIF): Du hast natürlich absolut recht mit Deiner Anmerkung bezüglich des erneuten Öffnens. Ich habe im Konstruktur die DLL eingebunden und bei FormClose gebe ich sie wieder frei. Ein erneuter Aufruf des Fensters muss dann natürlich Probleme bringen. Ich habe das Laden der DLL jetzt in die FormShow()-Methode gepackt und das Problem ist damit auch gelöst. Aber es ändert nichts an dem grundlegenden Fehler.
Ich habe mal auf den "VCL-Krempel" (obwohl ich ja FireMonkey nutze) verzichtet und zwar in der Form, dass ich das Ganze in QT5 realisiert habe und dort läuft alles ohne Probleme ab.
Den AnsiString kann ich als Problemquelle eigentlich auch ausschließen, weil der Fehler selbst dann auftritt, wenn ich ihn gar nicht nutze.
Als eigentliche Ursache habe ich den Rückgabewert der DLL-Funktionen identifiziert und hier kommt es zumindest für einen C++-Laien wie mich zu einer seltsamen Erscheinung:
1. Ich habe in obigem Code die Rückgabe-Variableja innerhalb der Klasse global deklariert:
char chData[8];
const char* library;
int iReturn;
2. Wenn ich mir im Debugger den Wert für iReturn anzeigen lasse, so wird er nach dem Aufruf der DLL-Funktionen auch tatsächlich 0, was einer fehlerfreien Ausführung entspräche.
3. Jetzt habe ich das Ganze einmal mit lokalen Variablen ausprobiert und erhalte als Rückgabewert z. B. "1702720" was ja sehr nach einer Adresse riecht.
4. Das erklärt natürlich einiges und ich würde mal spekulieren:
- iReturn wird als Integer derklariert
- iReturn wird aber durch irgendetwas in einem Zeiger "gecastet".
- iReturn erhält den Wert 0 als Rückgabewert der DLL-Funktion und versucht sie in iReturn zu schreiben.
- da zu diesem Zeitpunkt iReturn aber als Zeiger angesehen wird und der Inhalt 0 ist, versucht die DLL-Funktion auf Adresse 0x00000000 zu schreiben und löst die Exception aus.
Daraufhin habe ich mir die Aufrufkonventionen für die DLL angeschaut, aber es wird ganz eindeutig ein Integer und kein Pointer darauf zurückgegeben. Wenn ich aber davon ausgehe, dass die Doku zur DLL falsch ist, dann müsste es ja in QT5 auch zu einem Fehler führen.
Hat noch jemand Ideen, wo sich der Haken verstecken könnte??