C++ błędy ładowania procedur z DLL 5832 13

O temacie

Autor Wonski

Zaczęty 18.10.2015 roku

Wyświetleń 5832

Odpowiedzi 13

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

C++ błędy ładowania procedur z DLL
2015-10-18, 13:14(Ostatnia zmiana: 2015-10-18, 14:26)
Witam,
Mam niecodzienny problem z DLL.
Wczoraj normalnie piszę kod, normalnie zapisuję pracę i wyłączam komputer.

Dzisiaj odpalam, kompiluję i aplikacja wywala błąd.
Trochę dziwne bo nic w pliku nie modyfikowałem.

Trochę pogrzebałem w pliku, wszędzie gdzie się dało dałem warunki sprawdzające czy wszystko się poprawnie wczytało i oto co udało mi się dowiedzieć.

Sam kod odpowiedzialny za linkowanie biblioteki do apki zwraca wartość niezerową (czyli biblioteka ładuję się poprawnie do apki):
HINSTANCE hInstDLL = LoadLibrary("KeyLogDll.dll");
if (hInstDLL != NULL)
MessageBox(0, "Biblioteka dołaczona pomyślnie", NULL, MB_OK);

Natomiast wartość zerową (czyli błąd) zwraca pobranie procedury z dll. Co jest jak już mówiłem cholernie dziwne bo nic przy tym kodzie nie zmieniałem:
procedura_dll = (mojaprocedura) GetProcAddress(hInstDLL, "hack_dll");
Sam kod tej procedury w pliku dll wygląda tak:
void hack_dll()
{
hack = SetWindowsHookEx(WH_KEYBOARD, procedure_test, g_hInst, 0);
if (hack == NULL)
MessageBox(0, "hak źle założony", NULL, MB_OK);
}

Czyli po prostu zakładanie haka globalnego.
Dodam, że ten MessageBox nawet się nie wyświetla.. zresztą nic dziwnego skoro kod odpowiedzialny za ładowanie tej procedury zwraca wartość zerową.

Nie mam pojęcia czym to może być spowodowane. Zmieniałem rodzaj kompilacji z debug na relase i na odwrót. Usuwałem pliki, kopiowałem kod do innego projektu i nic.. ciągle to samo.
 


Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Coś ifotos nawala..
Funkcja zwraca:

GetProcessId failed with error 6: Nieprawidłowe dojście.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Kurde to tak się da linkować DLLki w cpp? Ja je zawsze wrzucałem do folderu z exe i banglało :F
 
Popisuje się ciągle menda jedna...

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

C++ błędy ładowania procedur z DLL
#4 2015-10-19, 17:30(Ostatnia zmiana: 2015-10-19, 18:01)
No są 2 rodzaje linkowania. Dynamiczne i statyczne.
Moje jest dynamiczne, Twoje zapewne statyczne :D

Post połączony: 2015-10-19, 17:55
Dobra oto co udało mi się zrobić.
Skopiowałem kod projektu do innego nowego projektu i tym razem wszystko "działa", (wcześniej po tym samym zabiegu nie działało)
Problem jest natomiast taki, że hak działa, mówiąc kolokwialnie, jak pojebany, tzn. raz się aktywuje raz nie. Raz aktywuje  się poprawnie wyświetlając messageboxa  i nie przepuści dalej komunikatu, innym razem zadziała i przepuści komunikat dalej mimo ustawionego return 1.
Dla jednej litery zadziała dla drugiej nie....
Co to są za cyrki?
Dlaczego kod mimo, że jest poprawny to robi co chce?

Tutaj kod źródłowy procedury haka i funkcji która go wywołuje:
LRESULT CALLBACK procedure_test(int code, WPARAM wParam, LPARAM lParam)
{
    if (code > HC_ACTION)
    {
        MessageBox(0, "test haka", "info", MB_OK);
        return 1;
    }
        return CallNextHookEx(0, code, wParam, lParam);
}
void hack_dll()
{
    hack = SetWindowsHookEx(WH_KEYBOARD, procedure_test, g_hInst, 0);
    if (hack == NULL)
    {
        MessageBox(0, "hak zle założony", NULL, MB_OK);
    }
}
Wg tego wszystko powinno działać tak jak działało wcześniej, zanim rozpocząłem ten wątek na forum.
Po naciśnięciu dowolnego klawisza klawiatury, powinien się wyświetlać messagebox i sam komunikat powinien być "zjadany" przez haka, tzn nie powinien być przekazywany dalej do pętli komunikatów głównej aplikacji.
No po prostu cyrki.....
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Albo masz problem z wywołaniem albo masz kilka wątków i problemy z synchronizacją. :D Nic innego nie przychodzi mi do głowy.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Nie tworzyłem żadnych dodatkowych wątków, choć mam w planach. Aplikacja z tego co widzę ma tylko jedną instancję i tylko ona korzysta z dll.

Nie wiem o co chodzi... Masz może jakiś pomysł jak to rozwiązać? Albo jeszcze lepiej.. skąd to się wzięło? Bo jak na razie wynika, ze samo z siebie :D
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Użyj debugera i zastaw pułapki. Być może twoja funkcja nie wyłapuje wszystkiego, tylko jakaś inna funkcja. Być może dowiesz się dlaczego tak się dzieje.

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
W logach debugera nie widać by cokolwiek było wykonywane niewłaściwie.

Dziwne..
W samej funkcji haka MessageBox podmieniłem na Beep(50, 50) i słyszę, że zostaje wykonana faktycznie dla każdego klawisza, na każdym oknie, również dla return 1 funkcja poprawnie nie przekazuje komunikatu dalej.

Zamieniłem znowu Beep na MessageBox i działa poprawnie. o_0
Zalinkowałem nową bibliotekę DLL do starego projektu i w starym projekcie również wszystko "nagle" działa poprawnie. Komedia...

Czyli mogę wnioskować, że albo to wina IDE albo samej DLL. Bardziej bym się skłaniał ku błędom przy kompilacji, choć i tutaj mam wątpliwości.
Pozostaje mi tylko poznać dokładną genezę tego syfu, bo jeżeli tak ma być cały czas to robię przerzutkę z c++ do javy :D. A w najlepszym razie zmieniam IDE (choć visual studio to raczej profesjonalny program).

Ciekawe czy jutro rano znowu wyskoczą jakieś kwiatki.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Możliwe że miałeś lub masz jakieś śmieci w projekcie. Albo po prostu nie zamykałeś okna dialogowego, a MessageBox blokuje inne akcje dopóki nie zamkniesz okna (albo i nie, nie jestem tego pewien :D).

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
No są 2 rodzaje linkowania. Dynamiczne i statyczne.
Moje jest dynamiczne, Twoje zapewne statyczne :D
DLL jest zawsze dynamiczne. LIB jest statyczne.
 
Popisuje się ciągle menda jedna...

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
No tak :d
Myślałem o dołączaniu *.a do pliku :D

Ty mówisz, że nie linkujesz tylko wrzucasz do folderu gdzie masz *.exe i od tak możesz sobie je wywoływać? Bez żadnej deklaracji?
Nie rozumiem.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
No są 2 rodzaje linkowania. Dynamiczne i statyczne.
Moje jest dynamiczne, Twoje zapewne statyczne :D
DLL jest zawsze dynamiczne. LIB jest statyczne.
DLL jest biblioteką dynamiczną, ale można ją zaimportować statycznie (wtedy biblioteka jest łączona z programem i od razu wczytywana) lub dynamicznie (jest wtedy oddzielnym fragmentem programu i wczytywana dopiero wtedy, kiedy jest potrzebna, stąd ich nazwa).

Ty mówisz, że nie linkujesz tylko wrzucasz do folderu gdzie masz *.exe i od tak możesz sobie je wywoływać? Bez żadnej deklaracji?
Nie rozumiem.
Używa zapewne dyrektywy #include.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
ale #include jest tylko od headerów :F. Ale może w moim przypadku ładowanie dynamicznych bibliotek załatwiają malutkie biblioteki statyczne. Jak używam obcych bibliotek, to zawsze takie są.
 
Popisuje się ciągle menda jedna...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry