Hallo an alle,
Im Moment schreibe ich gerade ein Packer-Plugin für den Totalcommander, welches eine bestimmte Art von Archiven entpacken soll. Dies funktioniert auch super, solange ich nur die erste Datei im Archiv entpacke. Versuche ich, eine andere Datei zu entpacken, stürzt der Totalcommander ab. Das komische daran ist, dass die Datei zwar vollständig entpackt wird, aber er danach abstürzt (Total Commander 32 bit funktioniert nicht mehr...).
Die ProcessFile-Funktion wird korrekt verlassen und liefert auch 0 (NULL) als Rückgabewert, was für keinen Fehler steht. Trotzdem stürzt der TTC nach dem Entpacken ab.
Hat jemand eine Idee, woran dies liegen könnte? Falls bestimmte Quellcode-Abschnitte nötig sind, sagt bescheid...
~Birne
Problem mit eigenem Plugin: Total Commander stürzt ab
Moderators: Hacker, Stefan2, white
- ghisler(Author)
- Site Admin
- Posts: 50697
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Das deutet sehr auf falsche Aufrufkonventionen hin. Wenn man nichts angibt, verwenden die meisten Compiler eine andere Art der Parameterübergabe als Windows (und TC): Plugins müssen die Funktionen als STDCALL exportieren. Verwendet man die falsche, bringt das den Stack durcheinander.
Die Deklaration als STDCALL geht bei C in 2. Schritten:
1. Deklaration der Funktion als
int __stdcall OpenArchive(tOpenArchiveData* ArchiveData)
2. Erzeugen einer .def-Datei, welche alle exportierten Funktionen auflistet. Das ist nötig, damit die Funktionen nicht mit "dekorierten" Namen wie _OpenArchive@4 exportiert werden. Inhalt der .def-Datei:
EXPORTS
OpenArchive
CloseArchive
... (weitere Funktionen)
Bei Delphi ist es einfacher, da schreibt man hinter die Funkion einfach
stdcall;
hin.
Die Deklaration als STDCALL geht bei C in 2. Schritten:
1. Deklaration der Funktion als
int __stdcall OpenArchive(tOpenArchiveData* ArchiveData)
2. Erzeugen einer .def-Datei, welche alle exportierten Funktionen auflistet. Das ist nötig, damit die Funktionen nicht mit "dekorierten" Namen wie _OpenArchive@4 exportiert werden. Inhalt der .def-Datei:
EXPORTS
OpenArchive
CloseArchive
... (weitere Funktionen)
Bei Delphi ist es einfacher, da schreibt man hinter die Funkion einfach
stdcall;
hin.
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Ich habe die Funktion in der folgenden Form deklariert, da es ansonsten bei mir (Visual Studio 10) nicht ging (falsche Exportnamen):
Wie genau binde ich denn die .def-Datei in mein Projekt ein? Ich habe jetzt schon versucht, sie einfach als Resource hinzuzufügen, was allerdings keine Wirkung zeigt.
Komisch finde ich es allerdings immer noch, dass alle anderen Funktionen scheinbar korrekt aufgerufen werden (OpenArchive, ReadHeader...) und nur ProcessFile bei der ersten Datei im Archiv funktioniert. Hat jemand eine Erklärung dafür?
Gruß,
Birne
Code: Select all
int __declspec(dllexport) __cdecl ProcessFile(NARCHandle hArcData, int Operation, char *DestPath, char *DestName)
Komisch finde ich es allerdings immer noch, dass alle anderen Funktionen scheinbar korrekt aufgerufen werden (OpenArchive, ReadHeader...) und nur ProcessFile bei der ersten Datei im Archiv funktioniert. Hat jemand eine Erklärung dafür?
Gruß,
Birne
- ghisler(Author)
- Site Admin
- Posts: 50697
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Das __cdecl ist falsch und bewirkt die genannten Fehler.
Die .def-Datei, habe ich einfach via Rechtsklick auf den Baum mit den Sourcedateien hinzugefügt, Visual Studio bindet die Datei dann automatisch richtig ein.
Die .def-Datei, habe ich einfach via Rechtsklick auf den Baum mit den Sourcedateien hinzugefügt, Visual Studio bindet die Datei dann automatisch richtig ein.
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com