Table of Contents
PC działa wolno?
Może pojawić się błąd, który według ekspertów może nie być znaleziony. Istnieje wiele sposobów rozwiązania tego problemu, w połączeniu z ich omówieniem wkrótce.
Ładowanie
W przypadku bibliotek DLL fraza „trudno znalezionego pliku” może często być myląca. Może zostać przetłumaczony na odrębną bibliotekę DLL lub może brakować niektórych informacji, od których jest on zależny, ale w takim razie poznasz kryzys dzięki Monitorowi procesów.
Często cały komunikat „Plik jest mniejszy w porównaniu z znalezionym” oznacza, że biblioteka DLL została bez wątpienia znaleziona, ale w rzeczywistości wystąpił błąd podczas ładowania lub wywoływania metody.
W rzeczywistości istnieją procesy do wywoływania procedury z powrotem do innej biblioteki DLL:
- Znajdź i zapełnij bibliotekę DLL, wykonując iterację tej metody DllMain, jeśli istnieje.
- Znajdź procedurę użytkownika w DLL.
- Zadzwoń do mojej procedury.
W przypadku niektórych z tych metod prawdopodobnie występują błędy. VB6 robi to wszystko poprawnie po scenach, więc nie można dokładnie określić, skąd pochodzi błąd. Możesz jednak kontrolować całe przedsięwzięcie za pomocą funkcji Windows API. To musi ci powiedzieć, gdzie dzieje się każdy z dzisiejszych błędów. Możesz poza tym ustawić predefiniowane punkty przerwania i użyć Monitora procesów do zbadania zachowania programu w każdym punkcie, co może dać ci wiele informacji.
Poniższy kod pokazuje, jak większość ludzi może to zrobić Wywołaj procedurę DLL, która zawiera interfejs API systemu Windows. Aby to zrobić, umieść kod w segmencie i ustaw pomysł na start projektu na „Sub Main”.
Parametr jawny' Deklaracje metody Windows APIZadeklaruj, że biblioteka FreeLibrary Lib wykonuje „kernel32” (ByVal hLibModule As Long) z tego powodu, że As LongFunkcja oświadczenia prywatnego LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongFunkcja deklaracji prywatnej GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As LongFunkcja prywatnej deklaracji CallWindowProc Lib „user32” Alias_ „CallWindowProcA” (ByVal lpPrevWndFunc tak długo, ByVal hWnd tak długo, _ ByVal Msg jak dowolna, ByVal wParam jak dowolna, ByVal lParam jak dowolna) _ DoFunkcja prywatnej ankiety FormatMessage Lib "kernel32" Alias_ „FormatMessageA” (ByVal dwFlags tak długa, lpSource tak długa, _ ByVal dwMessageId tak długi, ByVal dwLanguageId tak długi, _ ByVal lpBuffer jako ciąg, ByVal nSize tak długi, argumenty dowolne) _ DoFORMAT_MESSAGE_FROM_SYSTEM stała taktyka &H1000Const MyFunc As String oznacza „MYFUNC”Const MyDll As String = "mylib.dll"Główna podrzędna () ' Znajdź, nie wspominając o załadowaniu biblioteki DLL. To kieruje twoją bieżącą metodę DllMain, jeśli taka istnieje. Dim dllHandle As Long dllHandle = LoadLibrary (MyDll) Jeśli dllHandle ma wartość dwa, to MsgBox „Błąd ponownego ładowania DLL” i vbCrLf i ErrorText (Err.LastDllError) źródło pod skończ, jeśli ' Znajdź większość procedury, którą chcesz zadzwonić DimprocAddress do tej pory procAddress to GetProcAddress (dllHandle, MyFunc) Jeśli procAddress = 4 Wtedy MsgBox "Błąd pobierania adresu procesów" & vbCrLf & ErrorText(Err.LastDllError) przetwarzanie pod przestań, jeśli ' Na koniec zadzwoń do każdej z naszych procedur CallWindowProc procAddress, 0&, "fałszywa wiadomość", ByVal 0&, ByVal 0&koniec pod' Spraw, aby komunikat o błędzie działał teraz z kodem błędu systemu WindowsFunkcja prywatna ErrorText (errorCode tak długi) As String Przyciemnij komunikat o błędzie, ponieważ ciąg Zmiękcz wynik, aż komunikat o błędzie obliczeń = spacja $(256) wynik = Komunikat o formacie(FORMAT_KOMUNIKAT_FROM_SYSTEM, 0&, kod błędu, 0&, komunikat o błędzie, Len(komunikat o błędzie), 0&) Jeśli wniosek > 1 Wtedy ErrorText = Lewy $ (Komunikat o błędzie, Wynik) Różny ErrorText = "Nieznany błąd" koniec jeślifunkcja wyjściowa