Objektum átadása Delphi EXE és Delphi DLL között
2020-07-08T15:11:18+02:00
2020-07-10T14:29:46+02:00
2022-08-11T20:55:30+02:00
csanesz
Sziasztok!

A következő problémába ütköztem.
A program amit használok, Delphi 7-ben készült.
Ebben vannak osztályok, amikben tárolva van egy struktúra.
Mivel a Delphi 7-ben még nincs GenericList, így gondoltam, hogy egy DLL segítségével ami Delphi 10.3-ban készül feldolgozom, majd visszaadom.

Van erre valamilyen megoldás, hogy nem egy számot vagy szöveget adok át, hanem egy osztályt, vagy objektumot?
Ha minden igaz, akkor valami memóriacímre kell hivatkozni, hogy ki tudja olvasni az adatokat?
Esetleg valahogy át kellene alakítani valami Stream vagy Variant formára?

Előre is köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Ez csak akkor lenne használható ha a dll is D7-ben lenne.
A 10.3 meg a D7 TClass TObject nem egyforma, ezért ez így nem működik.

Lehetséges megoldás a dll-el interface-en keresztül cserélni az adatot.
Pl. van az exe-ben egy TMemoryStream ebből a TStreamAdapter-rel létrehozol egy
IStream-et és azt adod át a dll-nek.


Ha csak a generic list miatt akarsz dll-t csinálni akkor jobb megoldás, ha
a TList-ből származtatsz saját típusos listákat.
Az csak pár egyszerű rutin.
Mutasd a teljes hozzászólást!

  • A dll-ek és az exe futás közben egyetlen közös kódot alkotnak, közös memóriával. Nincs "átadás", függvény/eljáráshívások vannak, a háttérben meg mutatók.
    Ki kéne próbálnod, hogy egyre bonyolultabb Delphi 10-es rutinokat sikeresen meg tudsz-e hívni 7-esből. Először adj vissza egy fix számot, 123, majd két paraméterként kapott szám összegét, fix stringet, paraméterként kapott stringeket összefűzve, fix struktúrát, paraméterként kapott struktúrákból összállított új struktúrát, majd jöhet az objektumozás. Ha már megvan, hogy meddig megy gond nélkül, akkor lehet elgondolkodni rajta, hogy az mire elég. A Delphi 10-es kód közben belül használjon Delphi 10-es API-kat, pl. az említett listába tárolja el a paramétereket, és a listán keresztül szülje meg a visszaadott eredményt.
    Mutasd a teljes hozzászólást!
  • Van erre valamilyen megoldás, hogy nem egy számot vagy szöveget adok át, hanem egy osztályt, vagy objektumot?

    Igen, a paramétert osztálynak vagy objektumnak deklarálod.  Szerintem a D7 is tudja:

    procedure ClassParameter(CParam: TClass); procedure ObjectParameter(OParam: TObject);
    Mutasd a teljes hozzászólást!
  • Ez csak akkor lenne használható ha a dll is D7-ben lenne.
    A 10.3 meg a D7 TClass TObject nem egyforma, ezért ez így nem működik.

    Lehetséges megoldás a dll-el interface-en keresztül cserélni az adatot.
    Pl. van az exe-ben egy TMemoryStream ebből a TStreamAdapter-rel létrehozol egy
    IStream-et és azt adod át a dll-nek.


    Ha csak a generic list miatt akarsz dll-t csinálni akkor jobb megoldás, ha
    a TList-ből származtatsz saját típusos listákat.
    Az csak pár egyszerű rutin.
    Mutasd a teljes hozzászólást!
  • Van a Delphi 10.3-ban olyan deszerializáció, ami a 7-ben szerializált elemeket 10.3-es formában adja vissza? Ha nincs, akkor ez a stream-es irány nem nagyon fog műkdöni, de próbáld ki!
    Mutasd a teljes hozzászólást!
  • Generic list miatt én tutira nem csinálnék 10.3-as dll-t. A D7-hez is van tobjectlist, ami ugyanazt csinálja, "csak" a kód kevésbé elegáns a sok typecast miatt. Esetleg csinálj saját leszármazottakat a tobjectlist-ből a saját osztályaid részére.
    Vagy portold át az egészet az új Delphi alá.
    Mutasd a teljes hozzászólást!
  • Köszönöm, megoldottam TList-el.
    Mutasd a teljes hozzászólást!
abcd