Trochę historii - Delphi XE2

0

Witam,

Muszę ostatni pogrzebać w projekcie napisanym w Delphi XE2 i napotkałem na dziwny problem.
Ogólnie dzieje się tak w głownej apce, ale i także w stworzonej na prędce do testów.
Chodzi o to, że głowna apka jest kompilowana w Runtime Package, ale żeby było ciekawiej, to te Runtime Package też są inne i zawierają w sobie inne paczki.
Np.xxSystem.bpl zawiera w sobie rtl, vcl itd itp, xxTMS.bpl zawiera paczki TMS UI, xxSDAC zawiera paczki SDACa i tak dalej i tak dalej.
Problem jest taki, że gdy głowna aplikacja jest kompilowana to jest ok, ale gdy zostaje zbuildowana to te bplki "magicznie" zmieniają się na pliki exe. Oczywiście to nie są exe tylko bplki, ale mają takie rozszerzenie a apka głowna wymaga tych z rozszerzeniem exe. Niby działa, ale jakoś to nie jest za eleganckie.

Zeby odtworzyć to wystarczy stworzyć aplikacje VCL dla Windows z samą pustą formą. Ustawić w parametrach projektu Packages->Runtime Packages-> Link with runtime packages na TRUE, a w Runtime packages wpisać xxSystem.
Utworzyć projekt package xxSystem.bpl, wywalić wszystko z requires, dodać unit, w którym wpisać uses vcl.forms; i zbudować paczkę. Wywali błędem żeby dodać rtl i vcl, ale robimy cancel. I paczka jest zbudowana.

Teraz wchodzimy w pierwszą apkę i KOMPILUJEMY ją. Robi się wszystko poprawnie i apka działa też poprawnie (tak samo po przeniesieniu na maszynę bez delphi).
Natomiast gdy zrobimy BUILD apka się buduje, buduje się też paczka xxSystem, ale tworzy się także xxSystem.exe. I od tego momentu apka głowna wymaga tego xxSystem.exe.
xxSystem.exe i xxSystem.bpl to te same pliki tylko generowane z inną nazwą.

Pytanie, czy ja coś źle robię? Czy to odkryty po latach (przynajmniej przeze mnie) błąd/przypadłość XE2.
Czy ktoś się z tym spotkał i wie jak temu zaradzić? Rozdzielanie projektów i kompilacja/budowanie osobno nic nie daje. Zawsze zbudowanie apki podstawowej daje ten sam efekt.

Od razu mówie, sprawdziłem na używanym do dzisiaj XE7 - problem ten nie występuje - zawsze jest plik BPL.
Sprawdziłem też na 11 i tam tak samo - zawsze jest plik BPL.
Nie mam na tyle cierpliwości żeby pobierać XE3 i sprawdzać jak to tam wygląda.

pozdrawiam,
Przemek O.

1
Przemek O. napisał(a):

Witam,

Muszę ostatni pogrzebać w projekcie napisanym w Delphi XE2 i napotkałem na dziwny problem.

To Cię oświecę - ten "problem" sprawiłeś sobie sam i dotyczy każdej wersji Delphi.

Ogólnie dzieje się tak w głownej apce, ale i także w stworzonej na prędce do testów.
Chodzi o to, że głowna apka jest kompilowana w Runtime Package, ale żeby było ciekawiej, to te Runtime Package też są inne i zawierają w sobie inne paczki.
Np.xxSystem.bpl zawiera w sobie rtl, vcl itd itp, xxTMS.bpl zawiera paczki TMS UI, xxSDAC zawiera paczki SDACa i tak dalej i tak dalej.

Nie ma czegoś takiego jak xxxSystem.bpl, ale jest RTLXXX.BPL i to w tej paczce zawarty jest Runtime Library.

Problem jest taki, że gdy głowna aplikacja jest kompilowana to jest ok, ale gdy zostaje zbuildowana to te bplki "magicznie" zmieniają się na pliki exe. Oczywiście to nie są exe tylko bplki, ale mają takie rozszerzenie a apka głowna wymaga tych z rozszerzeniem exe. Niby działa, ale jakoś to nie jest za eleganckie.

Ale co tu jest mało eleganckiego?
BPL to taki DLL tylko z odrobiną cukru, dzięki czemu łatwiej się tym wszystkim zarządza i używa.
Można sobie np. bezkarnie przekazywać referencję na obiekty, nie ma zdublowanych RTL, itd. itp.
Wada jest jedna - to działa tylko w Delphi, a więc kod dostarczony w BPL zadziała tylko i wyłącznie w Delphi/Builder pod warunkiem, że wszystkie BPL i EXE są kompilowane w tej samej wersji kompilatora.

Zeby odtworzyć to wystarczy stworzyć aplikacje VCL dla Windows z samą pustą formą. Ustawić w parametrach projektu Packages->Runtime Packages-> Link with runtime packages na TRUE, a w Runtime packages wpisać xxSystem.
Utworzyć projekt package xxSystem.bpl, wywalić wszystko z requires, dodać unit, w którym wpisać uses vcl.forms; i zbudować paczkę. Wywali błędem żeby dodać rtl i vcl, ale robimy cancel. I paczka jest zbudowana.

Tak, ale paczka jest zbudowana w ten sposób że wszystkie moduły które są wymagane przez daną paczką, nie będą ładowane z innych BPL (np. SysUtils), a zostaną wkompilowane w Twoją BPLkę.
I to zadziała, ale naprawdę trzeba wiedzieć co się robi, ponieważ dany moduł może występować tylko i wyłącznie w jednej BPLcem, której używa Twoja aplikacja.
A więc nie możesz mieć tego samego modułu w dwóch różnych BPL, których używa Twoja aplikacja w runtime.

A więc jeśli zrobiłeś to co zrobiłeś, a potem używasz swojej packi i równocześnie np. paczki xxSDAC, która też używa modułu SysUtils to skończy się to błędem, ponieważ ten moduł jest zawarty w RTLXXX.BPL, której to paczki wymaga (w definicji paczki sdac w sekcji requires jest podana paczka rtl.bpl) xxSDAC.BPL.

Teraz wchodzimy w pierwszą apkę i KOMPILUJEMY ją. Robi się wszystko poprawnie i apka działa też poprawnie (tak samo po przeniesieniu na maszynę bez delphi).
Natomiast gdy zrobimy BUILD apka się buduje, buduje się też paczka xxSystem, ale tworzy się także xxSystem.exe. I od tego momentu apka głowna wymaga tego xxSystem.exe.

A na pewno te profile kompilacji są identyczne pod kątem konfiguracji kompilacji ?

xxSystem.exe i xxSystem.bpl to te same pliki tylko generowane z inną nazwą.

Pytanie, czy ja coś źle robię?

Raczej na pewno.

Czy to odkryty po latach (przynajmniej przeze mnie) błąd/przypadłość XE2.

Nie sądzę.

Czy ktoś się z tym spotkał i wie jak temu zaradzić?

Trzeba wiedzieć jak to działa, żeby tego używać.
A więc jak ze wszystkim.

Rozdzielanie projektów i kompilacja/budowanie osobno nic nie daje. Zawsze zbudowanie apki podstawowej daje ten sam efekt.

Nie wiem co to znaczy "rozdzielanie projektów".

Od razu mówie, sprawdziłem na używanym do dzisiaj XE7 - problem ten nie występuje - zawsze jest plik BPL.
Sprawdziłem też na 11 i tam tak samo - zawsze jest plik BPL.

Stawiam na inną konfigurację kompilacji w różnych IDE.

Nie mam na tyle cierpliwości żeby pobierać XE3 i sprawdzać jak to tam wygląda.

pozdrawiam,

Mogę Ci pomóc Przemek, tylko nie wiem kiedy ;-)

0

@wloochacz:

Ciebie To się tutaj nie spodziewałem :) Przeglądając chwilę przed wstawieniem posta to forum nie znalazłem znajomych ksyw z dawnych czasów :) Ale też nie szukałem jakoś dokładnie.

To Cię oświecę - ten "problem" sprawiłeś sobie sam i dotyczy każdej wersji Delphi.

Hmm...

Nie ma czegoś takiego jak xxxSystem.bpl, ale jest RTLXXX.BPL i to w tej paczce zawarty jest Runtime Library.

Ojtam ojtam. Chodzi o to, że standardowe paczki bpl są wkompilowane w jedną paczkę, żeby się za dużo plików nie walało po katalogu. To czy to ma sens, czy nie - to całkiem inna historia.

Ale co tu jest mało eleganckiego?
BPL to taki DLL tylko z odrobiną cukru, dzięki czemu łatwiej się tym wszystkim zarządza i używa.
Można sobie np. bezkarnie przekazywać referencję na obiekty, nie ma zdublowanych RTL, itd. itp.
Wada jest jedna - to działa tylko w Delphi, a więc kod dostarczony w BPL zadziała tylko i wyłącznie w Delphi/Builder pod warunkiem, że wszystkie BPL i EXE są kompilowane w tej samej wersji kompilatora.

Panie - nie ucz mnie podstaw. Chodzi o to, że dawno dawno temu, gdy to coś było stworzone to generowały się BPLki. Technicznie nie robi mi to różnicy czy to ma rozszerzenie BPL, EXE czy jakiekolwiek inne. Bardziej problem w tym, że po latach ten sam projekt przebudowywany w świeżo zainstalowanej XE2 robi tak że te BPLki są budowane do EXE. A ja nie chce przy okazji małej zmiany robić rewolucji.

Tak, ale paczka jest zbudowana w ten sposób że wszystkie moduły które są wymagane przez daną paczką, nie będą ładowane z innych BPL (np. SysUtils), a zostaną wkompilowane w Twoją BPLkę.
I to zadziała, ale naprawdę trzeba wiedzieć co się robi, ponieważ dany moduł może występować tylko i wyłącznie w jednej BPLcem, której używa Twoja aplikacja.
A więc nie możesz mieć tego samego modułu w dwóch różnych BPL, których używa Twoja aplikacja w runtime.

To jest jasne.

A więc jeśli zrobiłeś to co zrobiłeś, a potem używasz swojej packi i równocześnie np. paczki xxSDAC, która też używa modułu SysUtils to skończy się to błędem, ponieważ ten moduł jest zawarty w RTLXXX.BPL, której to paczki wymaga (w definicji paczki sdac w sekcji requires jest podana paczka rtl.bpl) xxSDAC.BPL.

Nie nie skończy się. To jest coś co działa, a nie coś nowego. xxSDAC.BPL nie ma w requires rtla :) I tak - za każdym razem przy kompilacji krzyczy że powinien być (zresztą nie tylko on).

A na pewno te profile kompilacji są identyczne pod kątem konfiguracji kompilacji ?

Nie powinny mieć niczego innego - w każdym przypadku świeże Delphi na świeżym obrazie systemu. A projekt ten sam. Test też ten sam.

Pytanie, czy ja coś źle robię?
Raczej na pewno.

No ja nie jestem do końca pewny. czysty system + czyste Delphi, w wersjach XE2, XE7 i D11 ten sam projekt testowy i tylko w pierwszym takie cuda się dzieją.
Poza tym w poszukiwaniach znalazłem jedno podobne zgłoszenie (tzn z podobnym efektem wyjściowym - zamiana bpl na exe na XE2) i żadne z proponowanych rozwiązań nie zadziałało.

Mogę Ci pomóc Przemek, tylko nie wiem kiedy ;-)

Wiesz, ogólnie to sam nie wiem czy się w to bawić. Mogę zawsze powiedzieć że nie mam czasu na bzdury i kopanie w historii, ale z drugiej strony klient to klient. Natomiast bardziej mnie zastanowił sam fakt takiego nieoczekiwanego zachowania Delphi, stąd moje pytanie.

pozdrawiam,
Przemek O.

0
Przemek O. napisał(a):

@wloochacz:

No ja nie jestem do końca pewny. czysty system + czyste Delphi, w wersjach XE2, XE7 i D11 ten sam projekt testowy i tylko w pierwszym takie cuda się dzieją.
Poza tym w poszukiwaniach znalazłem jedno podobne zgłoszenie (tzn z podobnym efektem wyjściowym - zamiana bpl na exe na XE2) i żadne z proponowanych rozwiązań nie zadziałało.

To podeślij ten testowy projekt dla XE2 i D11.
Zobaczymy.

0

Sorry że zamilkłem, ale że tak powiem bardzo, bardzo oględnie - olałem temat, więc nie zawracałem więcej głowy.
Dzięki za chęć pomocy!

1 użytkowników online, w tym zalogowanych: 0, gości: 1