Uruchomienie programu łączącego się z bazą MySQL wymaga dostępu do biblioteki libmysql.dll

0

Mam error przy uruchomieniu programu

Cannot load libmysql.dll library (error code 6), The
libmysql.dll library may be missing from the system path or
you may have an incompatible version of the library installed.

to znaczy
Nie można załadować biblioteki libmysql.dll (kod błędu 6).
libmysql.dll może brakować w ścieżce systemowej lub
może być zainstalowana niekompatybilna wersja biblioteki.

Umieściłem plik w katalogu debug/ aplikacji, ale to nic nie pomaga.
Umieściłem w Windows\System32. Też nic to nie daje. Dodałem zmienną środowiskową. Nie wiem jaka nazwa tej zmiennej. Uruchomiłem system nic nie zmienia. Mógłby ktoś mi wyjaśnić. Chciałem zrobić aplikacje z bazą MYSQL.

2

Dlaczego zakładasz, że jakaś generyczna biblioteka dll musi być kompatybilna z Pascalem ?

3

Pascal/Delphi jest dość podobny, z grubsza są pewne różnice, kiedyś np. nie było zero terminated stringów.

Bibliotekę można na 3 sposoby załadować.

Ja bym to zrobił tak, pierwsze:
jak na windowsie jesteś wypadało by sprawdzić eksporty tej biblioteki jak nazywają się funkcje czy np. nazwy nie są np. name mangling z C++.
Pod windowsem można na przykład zrobić dumpbin.exe /exports libmysql.dll

Drugie odpaliłbym jakiś disassembler i zobaczył, jaki call convention jest akurat zastosowany w danej bibliotece, fastcall, stdcall, cdecl, jest to ważne bo funkcję trzeba z daną konwencją wywołać.
Można np. jakiś program z C podejrzeć jak wywołuje daną funkcję, czasem gdzieś wygooglujesz jak poszukasz.
Jeśli jest fastcall to parametry do funkcji będą umieszczone w rejestrach jeśli stdcall to stos itp.

Następnie jeśli to windows używasz np. LoadLibrary na libmysql.dll potem zwrócony uchwyt używasz żeby dostać daną funkcję GetProcAddress z danym uchwytem i nazwą funkcji.

Nazwy funkcji masz z eksportów libmysql.dll tym dumpbin, możesz też z dokumentacji do C tej biblioteki po prostu patrzeć na nazwę funkcji i parametry.

Bierzesz jakiś example z C, za pomocą GetProcAddress wyciągasz wszystkie adresy funkcji jakie są potrzebne.
Dajesz im makrem preprocesora odpowiednią konwencje wywołań fastcall/stdcall/cdecl.

Normalnie uruchamiasz i jak jakieś błędy będą.
To debugerem najlepiej GDB/x64dbg, breakpoint dajesz przed wywołaniem funkcji, po prostu patrzysz jak są parametry wrzucane przed wywołaniem funkcji z tej biblioteki, ogólnie patrzysz gdzie się wywaliło, jaki był problem jeśli jakiś wystąpi.

Jeśli jakaś funkcja będzie przyjmować stringa, to musisz przekazać zero-terminated string, czyli stringa kończącego się z zerem inaczej gdzieś ci się wywali program błędem i nie podajesz obiektu, a zwykły adres tablicy w pamięci do tego ciągu znaków.

0

@pawelo31: jakiego komponentu używasz do komunikacji z bazą danych?

0
robertz68 napisał(a):

@pawelo31: jakiego komponentu używasz do komunikacji z bazą danych?

Standardowo FDConnection1
Dodałem biblioteke komponentem FDPhysMySQLDriverLink1 i działa. Nie musi być w katalogu gdzie program.

0

zainstaluj jak normalny człowiek klienta mysqla - jest w instalce

1

@pawelo31

  • zwóć uwagę na to że DLL może być 32/64 bit podobnie jak aplikacja moze byc 32/64bit
  • DLL moze mieć zależność czasami potrzeba kilka DLL , to co napisał @abrakadaber to bardzo dobra rada
  • można użyć https://github.com/lucasg/Dependencies aby prześledzić zaleznosci DLL , może masz namotane w PATH i ładujesz zupełnie inne DLL
1

@GodOfCode.:

A jak (nawet shackowana jakimiś modlitwami przy pełni księżyca) DLL ma się skomponowac z ekosystemem komponentów Delphi ?

0

Szukałem informacji na YouTube i zrobiłem jak ten Pan i działa. Dodatkowo na DirectAdminie baza była nie widzialna z zewnątrz. Ustawiłem ją odpowiednio i teraz program się łączy.
Jest jeszcze jeden problem bo dodałem jeszcze jedno pole do tabeli przez phpmyadmina i żaden komponent je nie widzi. To pole musi być. Co można jeszcze z tym zrobić?

0
pawelo31 napisał(a):

Standardowo FDConnection1
Dodałem biblioteke komponentem FDPhysMySQLDriverLink1 i działa. Nie musi być w katalogu gdzie program.

Działa? Aha.
No to nie czytasz dokładnie komunikatów błędów.
Tam jest wyraźna sugestia aby dodać ten komponent lub dodać do uses odpowiedni moduł.
No, ale...

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