C Funktion aus Delphidatei aufrufen



  • Hallo zusammen,

    ich verwende in meinem Projekt Delphicode einer fertigen Klasse.
    Diese möchte ich jetzt um eine Kleinigkeit erweitern, damit beim Starten automatisch Daten in ein Formular geschrieben werden.
    Diesen Mechanismus verwende ich bereits in einigen C++ Klassen., deshalb die Frage, wie kann ich aus der Delphidatei eine C Funktion des selben Projektes aufrufen.
    Die Ansätze welche ich gefunden habe sind alle sehr alt (Delphi 1) und haben nicht wirklich funktioniert (lag eventuell auch an meinen Delphi Kenntnissen, links kann ich bei Bedarf posten).
    Ist dies überhaupt möglich?

    MfG Stephan



  • Wäre es nicht besser, deine Delphiklasse bietet einfach ein Event an und dein Projekt bindet sich dann an dieses Event und ruft dann die C-Funktion auf?

    Eine C-Funktion kannst du aber normal von Delphi aus aufrufen, indem du die Funktion als 'external' deklarierst: External Declarations



  • Th69 schrieb:

    Eine C-Funktion kannst du aber normal von Delphi aus aufrufen, indem du die Funktion als 'external' deklarierst: External Declarations

    So etwas habe ich bereits ausprobiert:
    test.c:

    int __stdcall test(int i)
    {
        i++;
        return i;
    }
    

    testU.pas:

    unit testU;
    
    interface
    {$L test.obj}
    procedure test(var x: Integer); stdcall; external;
    implementation
    
    end.
    

    Nun bekomme ich beim kompilieren der Delphidatei die Fehlermeldung: [DCC Fehler] testU.pas(5): E2065 Ungenügende Forward- oder External-Deklaration: 'test'
    Ich hab kein Plan was ich machen soll.

    MfG Stephan



  • Dann mußt du wohl die C-Funktion in eine eigene DLL auslagern und dann den Namen der DLL bei der Funktionsdeklaration angeben.



  • Man muß nicht unbedingt eine DLL verwenden, man kann sehr gut die .obj-Datei in ein Delphi-Unit hineinlinken.

    Der Grund für das Fehlschlagen dürfte sein, daß der C-Compiler (ich nehme an, du verwendest BCC oder MSVC) Funktionsnamen ein '_' anhängt. Du kannst deine Delphi-Funktionsdeklaration auf einen anderen Namen verweisen lassen, indem du eine name -Direktive anhängst (also name 'test_' ). Wenn das nicht hilft, wende TDUMP auf die .obj-Datei an, um zu sehen, was sie für Symbole exportiert.

    Allerdings passen die Signaturen deiner Funktionen nicht. var x: Integer übergibt das Argument per Referenz; außerdem hat deine C-Funktion einen Rückgabewert, die Prozedur in Delphi aber nicht. Ein C++-Linker schützt dich vor solchen Fehlern, weil er Symbolnamen dekoriert (name mangling), aber bei C-Code gibt es keine Namensdekoration, deshalb mußt du selber achtgeben.



  • Th69 schrieb:

    Dann mußt du wohl die C-Funktion in eine eigene DLL auslagern und dann den Namen der DLL bei der Funktionsdeklaration angeben.

    Das ist eigentlich nicht das was ich wollte 😢
    Wenn ich dies jedoch richtig verstanden habe müsste es jedoch auch irgendwie ohne DLL gehen.

    MfG Stephan


Log in to reply