Problem mit eigenem Plugin: Total Commander stürzt ab

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
Birne94
Junior Member
Junior Member
Posts: 2
Joined: 2010-09-26, 13:41 UTC

Problem mit eigenem Plugin: Total Commander stürzt ab

Post by *Birne94 »

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
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 50697
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

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.
Author of Total Commander
https://www.ghisler.com
Birne94
Junior Member
Junior Member
Posts: 2
Joined: 2010-09-26, 13:41 UTC

Post by *Birne94 »

Ich habe die Funktion in der folgenden Form deklariert, da es ansonsten bei mir (Visual Studio 10) nicht ging (falsche Exportnamen):

Code: Select all

int __declspec(dllexport) __cdecl ProcessFile(NARCHandle hArcData, int Operation, char *DestPath, char *DestName)
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
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 50697
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

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.
Author of Total Commander
https://www.ghisler.com
Post Reply