Announcement

Collapse
No announcement yet.

C++ DLL in Delphi in subFunktion aufrufen.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C++ DLL in Delphi in subFunktion aufrufen.

    Hallo,
    Ich habe eine in c++ geschriebene DLL. Ich will eine Funktion aufzurufen. Alles funktioniert, wenn ich sie , z.b. in OnButtonClick() aufrufe, aber wenn die Funktion zuerst in der anderen Delphi Funktion aufgerufen wird, die weiter in OnButtonClick(), dann komme ich zur 'Zugriffsverletzung...'. Ich habe bemerkt, dass es passiert nur mit den Funktionen, die Eingangsparameter besitzen. Hier ist der Quelltext:

    C++
    extern "C" int __declspec(dllexport) _params(char *fn);

    Delphi:
    <pre>
    ...
    function _start(): Integer; stdcall; external 'DLlProject1.dll';
    function _params(fn: Pchar): Integer; stdcall; external 'DLlProject1.dll';
    ...
    //hier funktioniert
    procedure TForm1.btn1Click(Sender: TObject);
    var res: Integer;
    str: String;
    begin
    str := 'Dynamic call.';
    res := _params(Pchar(str));
    ShowMEssage(intToStr(res));
    end;
    //ab hier nicht mehr
    function TForm1.subFunction(): Integer;
    var str: String;
    begin
    str := 'Dynamic (subFunction)';
    subFunction := _params(PChar(str));
    end;
    procedure TForm1.btn2Click(Sender: TObject);
    var res: Integer;
    begin
    res := subFunction;
    ShowMEssage(intToStr(res));
    end;
    ....
    </pre>
    in der Funktion btn2Click wird ShowMessage nicht angezeigt, obwohl die DLL FUnktion intern richtig gelaufen ist. Etwas mit der Quitierung stimmt nicht.
    Danke.

  • #2
    Benutz doch mal das pre-Tag. Kann doch kein Schwin lesen sonst

    Comment


    • #3
      Ich war so frei, die Formatierung in der Frage etwas aufzubessern.

      Das Delphi-Programm importiert die DLL-Funktion mit der Aufruf-Konvention <b>stdcall</b>, aber <b>cdecl</b> würde zur Deklaration in der DLL passen. Siehe dazu die Delphi-Hilfeseite "<i>Aufrufkonventionen</i>"

      Comment


      • #4
        Hallo,

        Danke. Es hat geklappt

        Comment


        • #5
          Du kannst die Namen auch ohne _-Prefix deklarieren. <br>
          function start: Integer; cdecl; external 'DLlProject1.dll' name '_start'

          Comment

          Working...
          X