Announcement

Collapse
No announcement yet.

Zugriff auf Delphi2 DLL mit Delphi6 Programm nicht möglich ?

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

  • Zugriff auf Delphi2 DLL mit Delphi6 Programm nicht möglich ?

    In einer DLL befindet sich folgende function:

    function GetVersionNr:Integer
    begin
    GetVersionNr := 2;
    end;

    Die Funktion wird wie folgt aufgerufen:

    procedure TFormMain.Button1Click(Sender: TObject);
    var
    Handle: THandle;
    Ausdrucken:TAusdrucken;
    Wert:Integer;
    begin
    Handle := LoadLibrary('HNPDruck.DLL');
    if Handle <> 0 then
    begin
    Try
    @Ausdrucken := GetProcAddress(Handle, 'GetVersionNr');
    if @Ausdrucken <> nil then
    Wert := Ausdrucken;
    FreeLibrary(Handle);
    except
    on E: Exception do ShowMessage(E.Message);
    end;
    end;
    end;

    Der Aufruf der Funktion liefert den korrekten Wert.
    Wenn das aufrufende Programm allerdings beendet wird, tritt ein
    Run Time Error auf.

    Die DLL ist in Delphi 2.0 geschrieben !!! Der Grund dafür ist die
    nicht vorhandene Kompatiblität von Quickreport1 zu neueren Versionen
    (Oder gibts dafür eine andere Lösung). Deshalb wurden die teilweise
    sehr aufwendigen QRForms in eine DLL gepackt und diese DLL in
    Delphi 2.0 compiliert.

    Der Aufruf der DLL Funktionen hat jahrelang funktioniert. Es hat mit allen
    Windows Versionen funktioniert.

    Nun wird das aufrufende Programm mit Delphi6 compiliert. Nun tritt der
    Runtime Error auf.

    In allen Units steht Sharemem als erste Unit. Es gibt noch weitere
    Probleme mit der DLL, diese hier aufgeführte Funktion ist jedoch die
    einfachste.

    Die DLL statisch zu benutzen bringt keine Besserung.

    Wer weiß Rat ?

  • #2
    Ich bin mir nicht ganz sicher, aber schaue mal in der Doku von Delphi 2 nach, welchen Bereich Integer abdeckt und nehme bei Delphi 6 den äquivalenten Typ. Integer hat in Delphi 6 AFAIK einen größeren Bereich als in Delphi 2, ist also nicht kompatibel.<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo,
      was um Gottes Willen ist AFAIK ????
      Das kann schon sein, aber der erwartete Wert wird korrekt zurückgeliefert. Mit Delphi 5 hat noch alles funktioniert. Es funktioniert ja eigentlich auch alles, nur das aufrufende Programm erzeugt beim Beenden eine Schutzverletzun

      Comment


      • #4
        AFAIK ist "soweit ich weiß"<p>
        Also, es gibt zwei Sachen, die ich versuchen würde:<br>
        1. Setze nach Verwendung Ausdrucken auf NIL und Handle auf 0. Ich hatte schon mal so ein ähnliches Problem, allerdings war beides mit Delphi 6 kompiliert. Es hat bei mir geholfen, auch wenn es bei lokalen Variablen eigentlich keinen Sinn macht.<p>
        2. Ansonsten lasse einfach dass FreeLibrary weg. Ich weiß aber nicht mehr, warum. Der Speicherbedarf ist verschwindend. Du solltest dann halt mit einer globaleren Variable Handle arbeiten:<br>
        <pre>
        IF DllHandleBeispiel = 0
        THEN DllHandleBeispiel := LoadDllDyn('Beispiel.dll');<br>

        function LoadDllDyn(DLLName: String): Integer;
        var dwError : Integer;
        begin
        Result := LoadLibrary(PChar(DLLName));
        IF Result = 0
        THEN
        begin
        dwError := GetLastError;
        MessageDlg(Format('Beim Laden von "%s" trat der Fehler: %d auf.',[DLLName, dwError]),mtError,[mbOK],0);
        end;
        end; //LoadDllDyn
        </pre>
        <br>
        Es hat irgendwas mit dem Speichermanager, also auch ShareMem, zu tun. Es gibt da wohl ein prinzipielles Problem bei der Freigabe von Speicher.<p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment


        • #5
          Danke, habe es ausprobiert, aber ohne Auswirkung

          Comment

          Working...
          X