Bass.dll - dynamiczne ładowanie biblioteki i import funkcji.

0

Pisałem już o tym w innym wątku, ale zakładam osobny. Gdy statycznie ładuję funkcje z biblioteki bass.dll to działają mi wszystkie zaimportowane funkcje. Gdy zaś ładuję bass.dll dynamicznie (przez LoadLibrary) i importuję funkcje przez GetProcAddress to działają elegancko wszystkie funkcje oprócz „Bass_Init” i „Bass_ErrorGetCode”. Muszę kombinować, że albo tę pierwszą albo tę drugą muszę nadal importować statycznie żeby nie było błędu przy próbie ich wywołania. Gdy zaś próbuję wywołać obie na raz gdy były obie zaimportowane dynamicznie to mam błąd. Nie rozumiem tego. Czy ktoś z forumowiczów wie o co tu może chodzić?

0

Dodam jeszcze, że gdy do projektu dodałem unit dynamic_bass.pas, który znalazłem jako część dystrybucji Bass2.4.7 a który ładuje dynamicznie wszystkie funkcje i procedury z bass.dll, to wszystko działa. A biblioteka ładowana jest w ten sam sposób jak opisałem powyżej.

0

Z jakiegoś powodu prawdopodobnie wskaźniki na te funkcje nie zostają prawidłowo zainicjalizowane. Wykonaj sprawdzenie po wyjściu z GetProcAddress czy nie zwraca Ci nulla.

Druga sprawa, jeśli nie zwraca nulla, pozostaje opcja debugowania. Jeśli posiadasz binarki bass skompilowane z informacjami dla debuggera sprawa będzie prosta. Breakpoint na miejsce wywołania felernej funkcji a potem "step into".

W innym przypadku zostaje Ci podejrzenie CPU i wykonywanie kodu krok po kroku. Również powinieneś dojść do sedna problemu w ten sposób.

0

Nie wiem co można tutaj doradzić. Jeśli dasz radę, to uploaduj tutaj proszę wszystkie pliki projektu wrwz z exekiem i dllką/ami. To się spojrzy skoro wersja dllki jest ok. Nic nie reversowałeś w niej i na pewno nie ma literówek ani pomieszwnia wielkości liter w nazwach funkcji. Do tego są wywoływane ze spodziewanymi parametrami według dokumentacji, dllka jest w odpowiedniej ściežce. A do tego, co najważniejsze stosujesz konwencje wywołań cdecl i nie masz jakiejś własnej metody na ładowanie eksportów, typu jakieś inne fragmenty kodu dla GetProccessAddr, coś jak w libVLC. To według mnie wszystko powino działać. Zrezztą na logikę, skoro moduł dynamic działa bez problemów, to dlaczego nie chcesz go użyć? Zawsze można sobie zmienić pewne niuanse w jego kodzie. Jak ścieżka do dllki, dodać własną obsługę błędów, czy po zmianach scalić z modułem dllloader.pas, który wysłałem Tobie w poprzednim wątku. Ja tsk robiłem i działa mi ok.

Edit: przeanalizuj sobie kod projektu, dołączonego w zipie do tego posta. Powinno Tobie nieco to pomoc.

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