W win11 nie ładuje się plik dll

0

W win10 wszystko było ok. Biblioteki umieszczałem w katalogu exe i wszystko działalo. W win11 wyświetla się komunikat " Nie można załadować biblioteki dll". Ten komunikat to wyjątek wołany przy błędzie załadowania. Biblioteki są w katalogu exe i ładowane są dynamicznie na podstawie nazwy biblioteki pobieranej z bazy danych.
Poproszę o konsultację...

2

Proponuję sprawdzić:

  1. oprogramowanie antywirusowe
  2. zależności ładowanych bibliotek
  3. czy biblioteki i aplikacja są skompilowane na tą samą platformę (32bit lub 64bit)
0

ad 1. Nie miałem nigdy żadnych kłopotów a używałem tylko Windows Defendera.
ad 2. Nie mam żadnych programów i narzędzi do debugowania problemu. Win11 to świeży jeszcze ciepły zakup.
ad 3. Na 100% oba są 32 bitowe używałem tylko Delphi2007 (bo ja dziadek i emeryt już jestem :) ) Zresztą na win10 64bity, działał.

Czy ktoś byłby uprzejmy potrafił i mógłby zbadać problem. Mogę udostępnić link do zainstalowania programu.

0

Zrób sobie program testowy, exe wrzuć do katalogu z tym programem (tam gdzie jest to dll, którego nie możesz załadować) i spróbuj w tej testowej aplikacji załadować bibliotekę za pomocą LoadLibrary. Jeśli walnie błędem, to podaj informacje na jego temat (użyj GetLastError aby otrzymać kod błędu).

andrzej.kmicic napisał(a):

ad 3. Na 100% oba są 32 bitowe używałem tylko Delphi2007 (bo ja dziadek i emeryt już jestem :) ) Zresztą na win10 64bity, działał.

Jest jakiś sensowny powód, dla którego nadal trzymasz się wersji 32-bitowych?

0

Jeśli chodzi o ustalenie zależności biblioteki to poszukaj w necie (np tu).

furious programming napisał(a):

Zrób sobie program testowy, exe wrzuć do katalogu z tym programem (tam gdzie jest to dll, którego nie możesz załadować) i spróbuj w tej testowej aplikacji załadować bibliotekę za pomocą LoadLibrary. Jeśli walnie błędem, to podaj informacje na jego temat (użyj GetLastError aby otrzymać kod błędu).

Obawiam się, że GetLastError może nie być precyzyjny w tym przypadku. Jednakże, jeśli połączysz bibliotekę statycznie (poprzez import funkcji, a nie LoadLibrary) z testowym programem to przy odrobinie szczęścia windows sam krzyknie w komunikacie błędu o jaką bibliotekę chodzi (dodatkowo można sprawdzić log).

andrzej.kmicic napisał(a):

ad 3. Na 100% oba są 32 bitowe używałem tylko Delphi2007 (bo ja dziadek i emeryt już jestem :) ) Zresztą na win10 64bity, działał.

Jest jakiś sensowny powód, dla którego nadal trzymasz się wersji 32-bitowych?

Delphi 2007 chyba inaczej nie potrafi.

0
michalgw napisał(a):

Obawiam się, że GetLastError może nie być precyzyjny w tym przypadku.

Przy ładowaniu biblioteki za pomocą LoadLibrary, jedyną formą uzyskania informacji jest właśnie GetLastError.

Jednakże, jeśli połączysz bibliotekę statycznie (poprzez import funkcji, a nie LoadLibrary) z testowym programem to przy odrobinie szczęścia windows sam krzyknie w komunikacie błędu o jaką bibliotekę chodzi (dodatkowo można sprawdzić log).

Żadna różnica w jaki sposób dll jest używane, bo za jej załadowanie odpowiada dokładnie ten sam loader (będący częścią systemu operacyjnego). A ten w poszukiwaniu zadanej biblioteki wykonuje od jednego do dwunastu kroków.

Przydałoby się poznać pełną i oryginalną treść błędu oraz w jaki sposób błąd ten został zgłoszony — czy jest to customowa treść wyciągnięta z logów, czy oficjalny komunikat systemu. Poza tym nadal nie wiadomo czy ta biblioteka jest ładowana statycznie czy dynamicznie, więc z fusów wróżyć można co najwyżej.

Delphi 2007 chyba inaczej nie potrafi.

Dlatego pytam, bo jeśli nie musi to być 32-bitowa wersja, to czas pobrać świeżą wersję i porzucić architekturę, która od półtorej dekady jest nieaktualna.

0

Różnica polega na tym, że jeśli brakuje biblioteki dll, która jest statycznie połączona, to przy próbie uruchomienia aplikacji system wywali komunikat błędu z nazwą brakującej biblioteki i doda odpowiedni wpis do dziennika zdarzeń.
image

W przypadku ładowania dynamicznego przez LoadLibrary to programista musi obsłużyć taką sytuację.

P.S.
Jeśli to świeży system to podejrzewam brak jakiegoś starego MSVCRT.

0
furious programming napisał(a):

Zrób sobie program testowy, exe wrzuć do katalogu z tym programem (tam gdzie jest to dll, którego nie możesz załadować) i spróbuj w tej testowej aplikacji załadować bibliotekę za pomocą LoadLibrary. Jeśli walnie błędem, to podaj informacje na jego temat (użyj GetLastError aby otrzymać kod błędu).

andrzej.kmicic napisał(a):

ad 3. Na 100% oba są 32 bitowe używałem tylko Delphi2007 (bo ja dziadek i emeryt już jestem :) ) Zresztą na win10 64bity, działał.

Jest jakiś sensowny powód, dla którego nadal trzymasz się wersji 32-bitowych?

Taki mam plan B czyli zrobić aplikację testową i wsadzić ją do katalogu programu w win11. Delphi2007 mam tylko w Win10.

Program oryginalny właśnie ładuje bibliotekę z pomocą LoadLibrary. Biblioteka ta zawiera formularz z kontrolką edytora synedit, pobiera kilkaset stringów sql z serwera i po wciśnięciu przycisku wprowadza je do bazy lokalnej. Tak się dzieje w win10. W win11 tylko obsługuje błąd "Nie można załadować biblioteki dlll". Ten komunikat to własny komunikat.
Dlaczego trzymam się 32 bitów? Chyba z biedy 😀 a poważnie to w darmowej wersji nie mogę zainstalować dla przykładu jvc czy jvcl. A napakowałem tego bez pojęcia. Przeróbka to syzyfowa praca a już nie udostępniam programu. Programista jest na emeryturze. Chcę tylko pomóc wiernym użytkownikom którzy kupują sobie nowy sprzęt a tam babol w ich ulubionym programie.

0
andrzej.kmicic napisał(a):

Program oryginalny właśnie ładuje bibliotekę z pomocą LoadLibrary.

Jeśli używasz funkcji z Win32 API, to na miłość boską obsługuj błędy tych funkcji. 😉

Przy okazji, jak już dodasz obsługę błędów, to podrzuć cały fragment kodu, tak abyśmy wiedzieli jaki konkretnie kod testujesz.

W win11 tylko obsługuje błąd "Nie można załadować biblioteki dlll". Ten komunikat to własny komunikat.

W jaki sposób ten komunikat wyświetlasz? Jakiś MessageBox? Logi? Skąd konkretnie się ten komunikat bierze? Jakiś mały fragment kodu na pewno by się przydał.

Dlaczego trzymam się 32 bitów? Chyba z biedy 😀 a poważnie to w darmowej wersji nie mogę zainstalować dla przykładu jvc czy jvcl. A napakowałem tego bez pojęcia. Przeróbka to syzyfowa praca a już nie udostępniam programu.

Spoko, czyli trzymamy się Delphi 2007 i 32 bitów.

1

może po prostu nie masz INNYCH bibliotek, która ta ładowana potrzebuje, np. klienta do bazy albo jakieś redisy

0

Aż wstyd mi pisać. Pierwotną przyczyną było to że prawdopodobnie w instalacji w bazie danych nazwa biblioteki była z przecinkiem zamiast kropki komunikat się zmienił ale biblioteka nie działała. Usunąłem biblioteki i komunikat wrócił na poprzedni, Wniosek znaczy że w ogóle nie widział bibliotek z powodu tej kropki. Ale to nie wszystko po zmianie z przecinka na kropkę komunikat się zmienił na brak procedury wejścia. Więc przekompilowałam bibliotekę i ona zamiast 1.5MB wypluła 2.2MB. Nie wiem czy przyczyną zmiany rozmiaru nie była sławna aktualizacja Win10 ??? (22H2 czy jakoś tak). Dlaczego raptem wypluł o 700Kb większą bibliotekę. Ważne że ona wreszcie działa. Dziękuję i przepraszam za kłopot, uwagi były celne i zmusiły mnie do wysiłku. Jak młodzieniaszek zarwałem noc i teraz idę spać...

pozdrawiam Wojtek albo jak kto woli "andrzej.kmicic"

0

System do wielkości pliku nie ma nic, prawdopodobnie wcześniej skompilowałeś bibliotekę w trybie Release a teraz Debug . Release powinno być w docelowej aplikacji. Spróbuj to zmienić na Release i zobacz czy nową załaduje. Inną przyczyną zmiany wielkości biblioteki (jeżeli nic nie zmieniałeś w kodzie) może być to że była ona kompilowana w innej wersji Delphi a wtedy możliwe jest że użyłeś czegoś co korzysta z jakiejś biblioteki BPL Delphi a te w każdej wersji maja inne nazwy (z numerem wersji) ale nawet gdyby zmienić nazwę to się nie zładują. Nie wiem jak w Delphi 2007 (już nie pamiętam) ale w nowszych to Project -> Options -> Packages -> Runtime Packages tam zobacz czy nie ma przypadkiem zaznaczone "Link with runtime packages" zarówno dla Debug jak i Release .

0

Napiszę tak - pobierać nazwy plików dll do wczytania z zewnętrznego źródła i nie sprawdzać przed wczytaniem czy w ogóle taki plik istnieje (i jak nie istnieje to to sygnalizować userowi i zapisywać do logu) to jak dla mnie mocny fackup...

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