Aufruf von C++ Klassen

Offizieller deutscher Support für das MASM32 SDK. Download FAQ

Moderatoren: crack, Krüsty, Marwin

Beitragvon Manni-P » Donnerstag 10. März 2005, 14:55

Hallo miteinander,

inzwischen habe ich leidlich erfolgreich an meine früheren Assembler-Zeiten angeknüpft. Microsoft C++ mag ich allerdings auch nicht mehr missen. Aber es gibt eben doch viele Funktionen, die lassen sich mit relativ geringem Aufwand (und mit hervorragender Laufzeit-Performance) mit einer kleinen MASM32-Utility lösen.

Hier ist nun mein Problem:

Ich möchte aus dem Assembler-Code heraus eine Instanz einer C++-Klasse aufrufen.

Anhand einer Link-Liste habe ich den verschlüsselten Namen der aufzurufenden Funktion identifiziert und mit dem Statement
Code: Alles auswählen
extern syscall ?Append@CString@@QAEXPBD@Z:PTR

als externe Funktion deklariert. Der - soweit ich es übersehen kann - entscheidende Teil meiner MASM-Funktion ist nun
Code: Alles auswählen
   extern syscall ?Append@CString@@QAEXPBD@Z:PTR
   . . .
EncodeAsm PROC pTarget:DWORD, pFormatText:DWORD, ValueList:VARARG
   . . .
   PUSH   040h  ; der zu übergebende Wert (per C++-Argumentliste)
   MOV   ECX,pTarget   ; Zeiger auf die Instanz der Daten
   JMP   ?Append@CString@@QAEXPBD@Z
   . . .

Der Linker ist mit meinem Code zufrieden.
Der Aufruf geht allerdings jedesmal schief und endet mit einer Access Violation.

Hat jemand eine Idee, wo mein Fehler liegt?

Oder gibt es irgendwo eine allgemeinere Beschreibung, wie man eine C++-Klassenfunktion aufruft?

Vielen Dank vorab
Manni-P
Manni-P
Member
 
Beiträge: 11
Registriert: Freitag 6. Februar 2004, 10:04

Beitragvon Manni-P » Freitag 11. März 2005, 09:55

Schnell noch ein Nachtrag:

Es funktioniert auch mit C-Funktionen nicht, die ich mit C++ (deklariert als extern "C") übersetze.

Der Linker beendet sein Werk ohne Fehlermeldung.
Die vom Linker generierte Sprungadresse ist jedoch vollkommen falsch.

mfg
Manni-P
Manni-P
Member
 
Beiträge: 11
Registriert: Freitag 6. Februar 2004, 10:04

Beitragvon Marwin » Samstag 12. März 2005, 17:42

Hallo Manni-P,

wäre es auch möglich, dass die Zugriffsverletzung nicht durch die JMP-Anweisung, sondern beim zurückkehren von der Append-Methode verursacht wird? Das würde ich für möglich halten, da du die C++ Methode nicht per CALL sondern per JMP aufrufst.l


Grüße,
Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon Manni-P » Sonntag 13. März 2005, 09:51

Hallo Marwin,

leider ist die JMP-Anweisund nicht das Problem.

Ich hatte auch schon vorher - wie es sich gehört - die CALL-Anweisung verwendet und im Assembler Step-by-Step das Programm ausgeführt. Das JMP/CALL führt zu einer seltsamen (wahrscheinlich nicht initialisierten) Adresse noch im Adressraum der gebundenen Applikationen; der nächste Schritt ist dann die Zugriffsverletzung.

mfg
Manni-P
Manni-P
Member
 
Beiträge: 11
Registriert: Freitag 6. Februar 2004, 10:04

Beitragvon Manni-P » Montag 14. März 2005, 11:56

Hallo miteinander,

einen wesentlichen Teil des Problems habe ich lösen können, indem ich für die Deklaration der externen Funktion PROTO anstelle von EXTERN verwendet habe.

Alle Aufrufe von C- und C++-Funktionen (wenn man die sehr spezielle Art der Parameterübergabe bei C++ berücksichtigt) funktionieren jetzt prächtig.

Also -- Problem ist eigentlich gelöst. :rolleyes: :rolleyes:

Aber weil ich nun ein neugieriger Mensch bin, habe ich versucht, dem ursprünglichen Problem auf den Grund zu gehen und festgestellt, dass -- bei Verwendung von EXTERN -- alle Referenzen auf die externe Adresse indirekt interpretiert wurden und daher natürlich zu einer vollkommen falschen effektiven Adresse geführt haben. Ursache meines Problems ist offensichtlich eine falsche Anwendung der Anweisung EXTERN und darin der Angabe des Qualifiers für das externe Symbol.
Bisher hatte ich die Anweisung EXTERN für eine C-Funktion mit folgenden Varianten geschrieben:
Code: Alles auswählen
    EXTERN    CFktName:DWORD
    EXTERN    CFktName:PTR
    EXTERN    CFktName:FAR PTR

Aber weder DWORD noch PTR sind die korrekten Qualifier.

Wo sind die möglichen Qualifier beschrieben? - Ich habe die Dokumentation durchgesehen; die Qualifier werden bei allen möglichen Anweisungen als Parameter erwähnt aber nirgends (?) beschrieben.

mfg
Manni-P
Manni-P
Member
 
Beiträge: 11
Registriert: Freitag 6. Februar 2004, 10:04


Zurück zu MASM32-Package

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron