C++ GetModulePath nie znajduje pliku podawanego w argumencie funkcji

Dzień dobry.

Pisząc moda do Gta V napotkałem problem, którego w żaden sposób nie jestem wstanie rozwiązać. Otóż funkcją do tego przeznaczoną GetModulePath() pobieram ścieżkę głównego katalogu. Zapisuje ją do zmiennej typu std::string. Potem w drugiej zmiennej (Nie wiem po co ale jakoś tak) też typu std::string wpisuję nazwę wtyczki, którą muszę załadować. A potem.

HMODULE plugin = LoadLibraryA((path + plugin_name).c_str()); próbuje załadować tę wtyczkę. Oczywiście tworzę warunek if(!plugin) w którym jest MessageBox,  który mnie informuje, ze ładowanie tej wtyczki się nie powiodło. Czy ktoś z Was miał kiedyś tak, że pomimo podawania poprawnej ścieżki do biblioteki nie chciała ona się załadować? Czy byliście wstanie rozwiązać ten problem, a jak tak to w jaki sposób? Podkreślam, ze odtworzenie dźwięku w ten sposób jest możliwe, tylko wtyczki się nie ładują. Byłbym wdzięczny za wszelkie odpowiedzi.

Pozdrawiam!

Jaki argument przyjmuje funkcja loadlibrarya ? Ten null na końcu nie psuje ci tego stringa ? Gdy wpiszesz na sztywno ścieżkę jako argument funkcja działa ? 

https://msdn.microsoft.com/en-us/library/ms684175

Jesteś pewien, że path + plugin_name tworzy poprawną ścieżkę do pliku dll?

Czy plik dll ma właściwy format (32bit / 64bit)?

Po wywołaniu LoadLibrary sprawdź kod błędu funkcją GetLastError https://msdn.microsoft.com/en-us/library/ms679360

Co oznacza dany kod błędu możesz wyszukać w https://msdn.microsoft.com/en-us/library/ms681381 albo użyć funkcji FormatMessage https://msdn.microsoft.com/en-us/library/ms679351 do pobrania tekstu komunikatu błędu od systemu.

 

PS. Ustaw odpowiedni temat; aż się dziwię, że moderator nie zwrócił Ci wcześniej uwagi.

Nie mogę na sztywno wprowadzić ścieżki.

Co do tego ma format dllki? Przecież w programie 64 bitowym podobno można ładować wtyczki 32 bitowe i 64 bitowe i działają one tak, jak powinny.

Hmm, sprawdzę te informacje.

Interesujące. Po użyciu

DWORD msg = GetLastError();

ScriptHookV mi się wysypuje, więc niczego pożytecznego się nie dowiedziałem. nawet MessageBox-a nie wyświetlił :/. GetModulePath zwraca poprawną ścieżkę, czy raczej path + plugin_name. sprawdzałem MessageBoxem.

Tutaj chodzi o to, że Asi Loader w ScriptHookV ładuje mi moją wtyczkę, która dajmy na to nazywa się test.asi. A ja dodatkowo w tej wtyczce potrzebuję załadować coś, co dajmy na to się nazywa plugin.dll. Podaje poprawną ścieżkę i jest błąd.

Dobra, GetLastError() nic nie wyrzuca. Już sam nie wiem co robić

Nie można (przynajmniej oficjalnie).

 

GetLastError nie powinien Ci wywalić programu. Spróbuj coś takiego:

HMODULE plugin = LoadLibraryA((path + plugin_name).c_str());
if(!plugin)
{
	char buf[20];
	sprintf(buf, "Blad: %u", GetLastError());
	MessageBoxA(NULL, buf, "LoadLibrary", MB_OK | MB_ICONERROR);
}

Funkcja sprintf jest w nagłówku cstdio http://www.cplusplus.com/reference/cstdio/sprintf/

 

0 jest.

zrobiłem tylko tablicę nieco większą bo 200

no i sprintf_s bo podobno sprintf może być niebezpieczna. Otrzymuje kod błędu 0. Wedłóg mnie to ejst NULL, no ale dobra.

0 oznacza brak błędu. Wywołałeś jakąś inną funkcję między wywołaniami LoadLibrary a GetLastError?

 

Jak się nie umie poprawnie używać to tak :wink:

Nie wywoływałem nic po LoadLibrary

Dobrze deklarowałem.

Hmmm… może destruktor tymczasowego stringa coś bruździł z last error.

std::string plugin_path = path + plugin_name;
HMODULE plugin = LoadLibraryA(plugin_path.c_str());
DWORD dwError = GetLastError();
if(!plugin)
{
	char buf[20];
	sprintf(buf, "Blad: %u", dwError);
	MessageBoxA(NULL, buf, "LoadLibrary", MB_OK | MB_ICONERROR);
}

 

Jeśli możesz, dolinkuj do projektu bibliotekę Shlwapi.lib, masz w niej funkcję PathFileExists. Za jej pomocą sprawdź, czy Twoje plugin_path prowadzi do pliku,

Poza tym, widzę, ze używasz winapi, LoadLibrary ma dwie wersje (ANSi i Unicode), a używasz wersji Ansi.  Wg mnie powinieneś używać LoadLibrary, a ustawienia projektu zrobią swoje.

 

std::string plugin_path = path + plugin_name;
if (PathFileExists(plugin_path.c_str())
{
    HMODULE plugin = LoadLibrary(plugin_path.c_str());
    if(!plugin)
    {
        DWORD dwError = GetLastError();
    	char buf[20];
    	sprintf(buf, "Blad: %d", dwError);
    	MessageBoxA(NULL, buf, "LoadLibrary", MB_OK | MB_ICONERROR);
    }
}

Sprawdzasz jaki był błąd kiedy stwierdzisz, ze uchwyt jest nullem. W innym wypadku nie ma sensu ;).

Tak, tego zdążyłem się domyślić :slight_smile:

I tak używał LoadLibraryA, więc wklepałem LoadLibraryA

Jak MessageBoxem wyświetlam ścieżkę, to się wyświetla poprawna, ale jeszcze to sprawdzę.

No dobra, sprawdziłem. Ścieżka wskazuje na plik, bo inaczej nie mogłoby być.

  1. Ta aplikacja nie jest poprawną aplikacją systemu win32.

Jak miałaby być, skoro windows jest 64 bitowy, gra jest 64 bitowa a wtyczka 32 bitowa?

Jak to załadować?

Nie możesz do 64-bitowego procesu załadować 32-bitowej biblioteki.

No to trudno.

W każdym razie dziękuję za pomoc.

A biblioteka jest Twoja czy może skądś ściągnięta?

Bo jeśli Twoja, to możesz skompilować ją pod 64bity :).