So rufen Sie eine kernel32.dll Funktion GetTickCount() mit LoadLibrary(..) in C++
Ich bin auf der Suche nach einer Funktion, um die Zeit in Millisekunden, die auf eine windows-Maschine. Im wesentlichen möchte ich nennen, das WinAPI Funktion GetTickCount(), aber ich bin stuck on "mit LoadLibrary(...) n call-GetTickCount () - Funktion" Teil..
Suchte ich in jedem forum n es gegoogelt, aber überall haben die Menschen verwendet, die unvollständige codes, die nicht kompilieren..Kann jemand schreiben Sie eine kurze Beispiel-Programm zu laden kernel32.dll und rufen GetTickCount() zur Anzeige der Uhrzeit in Millisekunden?
Bitte schreiben Sie code, der kompiliert!
Warum denken Sie, sollten Sie rufen
LoadLibrary
? kernel32.dll
bereits geladen ist in jedem Windows-Prozess, die Sie nie brauchen, um es zu laden selbst.InformationsquelleAutor Rushil Paul | 2011-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht laden
kernel32.dll
wird, ist es bereits geladen, in jedem Prozess. UndGetTickCount
gibt es in jeder version von Windows, so dass Sie nicht brauchenGetProcAddress
um zu sehen, ob es existiert. Alles, was Sie brauchen, ist:Einer dynamischen Belastung Beispiel (da
winmm.dll
ist nicht vorinstalliert):Habe ich erfolgreich kompiliert und ausgeführt wird in diesem Beispiel, die mit Visual Studio 2010-Eingabeaufforderung, kein spezieller compiler-oder linker-Optionen sind erforderlich.
Sicher, aber ich werde mich ändern, um Ihr Beispiel zu
timeGetTime
so macht es Sinn, darüber zu sprechen laden der Bibliothek.InformationsquelleAutor Ben Voigt
Die sehr erste, was Sie tun sollten deklarieren Sie eine Funktion, die Zeiger-Typ, der kompatibel mit der exportierten Funktion. Immer diese Recht kritisch ist und die größten Chancen für den Betrieb in Schwierigkeiten. Schauen Sie genau auf die Deklaration der Funktion zu gelangen:
Nächsten, mit LoadLibrary und GetProcessAddress erhalten die Funktion-Zeiger-Wert. Man muss immer umgewandelt den Rückgabewert von GPA, um die Funktions-pointer-Typ. Wie diese:
Fehler-Möglichkeits-hier sind der Pfad zu der DLL. Ich musste das nicht angeben, weil kernel32.dll gespeichert in c:\windows\system32 ein Verzeichnis, das immer im Suchpfad. Das ist in der Regel nicht der Fall für Ihre eigenen DLL. Nur speichern Sie es in demselben Verzeichnis wie die Haupt-EXE-Datei können Sie angeben, nur die DLL-Dateinamen statt des kompletten Pfades. Überprüfen Sie die Dokumentation für SetDllDirectory() für die hintergrund-info.
Und der name der exportierten Funktion. Es war wieder mal einfach hier die Windows-API-Funktionen exportiert werden, mit der nicht ergänzten Namen. Das ist in der Regel nicht der Fall für Ihre eigenen DLL-Exporte exportiert werden können, mit einem führenden Unterstrich, "@nn" postfix oder einen entstellten Namen, wenn Sie nicht deklarieren Sie die Funktion mit extern "C" und der C++ - compiler. Um den realen Namen verwenden Dumpbin.exe /exports auf die DLL. Beachten Sie auch, dass GetProcAddress verwendet ein const char*, im Gegensatz zum rest der Windows-API, die verwendet Unicode-Zeichenfolgen. Keine L-Präfix, für das string-literal.
Dann Sie es nennen, das ist einfach:
Wenn Sie die Funktion Zeiger Typ-Deklaration falsch, dann Sie stürzt möglicherweise ab, Ihr Programm mit einer AV, bekommen bizarre-Funktion Ergebnisse oder eine unausgewogene stack.
InformationsquelleAutor Hans Passant
Sie nicht haben, um. Kernel32.dll geladen wird in jedem x86-Prozess unter Windows. Sie haben nur, um den Kopf, damit es funktioniert - der compiler lädt es für Sie.
Eine andere Datei, die ebenfalls den Namen
kernel32.dll
aber in einem anderen Verzeichnis geladen wird, in die 64-bit-Prozesse.InformationsquelleAutor Puppy
[kernel32.dll] geladen wird, in jedem Prozess, weil es die
ExitProcess
Funktion...Alles, was Sie tun müssen, ist, gehören
<windows.h>
- und call -GetTickCount
.Cheers & hth.,
InformationsquelleAutor Cheers and hth. - Alf