Announcement

Collapse
No announcement yet.

Zugriff auf Delphi5 DLL mit Delphi7 Programm nicht möglich?

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

  • Zugriff auf Delphi5 DLL mit Delphi7 Programm nicht möglich?

    In einem unter Delphi 5 geschriebenen Programm sind diverse Funktionalitäten in separate DLLs ausgelagert.
    Die Routinen enthalten oft Zeiger auf Datenrekords.
    Diese können in der DLL gelesen bzw. geschrieben werden.

    Bis zu Delphi 5 hat das auch alles prima geklappt!

    Wenn ich jetzt aber das Hauptprogramm mit Delphi 7 kompiliere und eine Delphi5 DLL Routine aufrufe, so steht in zurückgegebenen Rekords Schrott!!!
    Das ganze sieht so aus als ob die Rekordstrukur des Programmes und der aufrufenden DLL nicht übereinstimmen.
    Wenn ich jetzt jedoch die DLL auch neu kompiliere, dann kann ich diese Delphi 7 DLL wieder problemlos aufrufen.

    Was hat Borland denn da an der Datenstruktur verändert?
    Problem könnte auch schon ab Delphi6 auftreten. (Habe ich übersprungen)

    Wer weiß darüber Bescheid?

  • #2
    Falls Du mit Records arbeitest must du dafür sorgen das das "Packen" der Records bei beiden kompilierungen gleich ist. Wahrscheinlich hat sich zwischen D5 und D7 die defaultmäßige "Packung" deines Records geändert.

    Such mal in der Delphi-Hilfe nach "packed" um weitere Infos zu bekommen

    Comment


    • #3
      Genau. Delphi 5 arbeitet standardmaessig mit 4 Byte Alignment. Ab Delphi 6 aber mit 8 Byte Alignment. Delphi 6 Packages enthalten z. B. {$ALIGN 8} was Delphi 5 nicht versteht.<br>
      Ein {$ALIGN 4} in den Sourcen, die die Records definieren sollte das Problem loesen

      Comment


      • #4
        Zuerst mal vielen Dank für die schnelle Hilfe!
        Bin dank Eurer Hilfe weitergekommen.

        Habe die DLLs unter Delphi 5 als "nicht ausgerichtet" kompiliert.
        Laut Delphi 7 Hilfe entspricht das dem Eintrag "1" unter Projektoptionen/Compiler ---> Ausrichtung von Recordfeldern.

        Da das nicht funktioniert hat, habe ich 2, 4 und 8 auch noch ohne Erfolg ausprobiert.

        Es funktioniert aber wenn ich in die Datei der Rekorddefinition zu Beginn ein {$ALIGN 1} einfüge!

        Ich dachte bisher das durch die Ausrichtung der Rekordfelder auf "1" alle Rekords im Projekt nicht ausgerichtet werden.
        Durch das Einfügen des {$ALIGN 1} jedoch nur die Rekords der betreffenden Datei nicht ausgerichtet werden.

        So wie es aussieht werden die Rekords unter Delphi 7 immer ausgerichtet. Das Einstellen unter Projektoptionen/Compiler auf "1" nützt da nichts!
        Ist das vielleicht ein Bug in Delphi 7.0?

        Vielen Dank nochma

        Comment


        • #5
          Einstellungen in den Projektoptionen wirken sich erst nach einem kompletten Neukompilieren aus ("Projekt erzeugen").
          <br>Uli

          Comment


          • #6
            Und wenn ich mein DLL in VC erstellen soll, was muss ich achten, so dass ein Delphi-Application auf meinem <B>Struc{} </B> zugreifen kann. Danke für die Inf

            Comment


            • #7
              Erst mal keine globalen Variablen benutzen. Delphi kann die nicht direkt zugreifen. Alles per Funktion machen.<br>
              In den C headern wird ueblicherweise das structure packing explizit per #pragma pack() gesetzt. Microsoft hat dafuer extra include files parat.<br>
              Es empfiehlt sich auf #pragma pack(1) zu gehen (ist auch in den Projektoptionen einstellbar). Die Pascal-Strukturen werden dann als packed record deklariert

              Comment

              Working...
              X