Was wird benötigt:- Modifizierbarer Clientsource
- Spaß am Coden
Vorwort
Du willst also die Nonplusultra Version verwenden und hast definitiv die richtige Entscheidung getroffen!
Die Logik hinter dem Ganzen
Wenn du eine Datei in Notepad++ oder einem anderen Editor bearbeitest und
diese Abspeicherst ändert sich automatisch das Änderungsdatum der Datei.
Dies machen wir uns zu nutze und Vergleichen über die bereits
implementierte OnUpdate-Methode (eine Methode die in jeder M2-Python-Klasse
vorhanden ist und mehrmals in der Sekunde ausgeführt wird) ob das
Änderungsdatum der Datei von dem beim Injecten gespeichertem
Änderungsdatum abweicht.
! Bitte beachten bevor du dein Maul aufmachst !
Mir ist sehr wohl bewusst das ich die Informationen über das
Änderungsdatum der Datei auch über Python abrufen könnte.
Guess what - ES FUNKTIONIERT NICHT!
Aus diesem Grund habe ich eine neue Methode für die app-Klasse
geschrieben.
Diese nutzt die in der Windows API implementierte Funktion
GetFileAttributes(ExA)
Diese Funktion frägt die Dateiattribute unserer Python Datei ab und speichert
diese in einem DATA-struct ab.
Aus dieser Struktur nutzen wir dann die
"LastWriteTime", welche ebenfalls eine aus zweien Teilen (low-order und
high-order im Format DWORD) bestehende Struktur ist. Dem ist so weil die
Zahl eine 64-bit Zahl ist.
Da ich jedoch denke, dass dieses Tool nur zum
entwickeln benutzt wird habe ich das ganze mal ignoriert und trotzdem die
beiden Teile (low+high) addiert.
Neuere Compiler haben mit Addition und
Subtraktion kein großes Problem mehr, bei Multiplikation und Subtraktion ist
das ganze dann weitaus komplizierter, da die 32bit Arithmetik für
Multiplikation und Subtraktion schneller ist und es dadurch zu dem ein oder
anderen Performanceproblem kommen könnte.
Habe euch in den Spoiler mal reingepackt wie Der VS Compiler das Problem
gelöst hat.
(64-bit Mulitplikation in diesem Fall - Für die kompletten Nerds hier)
PHP Code:
_allmul PROC NEAR
A EQU [esp + 4] ; stack address of a
B EQU [esp + 12] ; stack address of b
mov eax,HIWORD(A)
mov ecx,HIWORD(B)
or ecx,eax ;test for both hiwords zero.
mov ecx,LOWORD(B)
jnz short hard ;both are zero, just mult ALO and BLO
mov eax,LOWORD(A)
mul ecx
ret 16 ; callee restores the stack
hard:
push ebx
A2 EQU [esp + 8] ; stack address of a
B2 EQU [esp + 16] ; stack address of b
mul ecx ;eax has AHI, ecx has BLO, so AHI * BLO
mov ebx,eax ;save result
mov eax,LOWORD(A2)
mul dword ptr HIWORD(B2) ;ALO * BHI
add ebx,eax ;ebx = ((ALO * BHI) + (AHI * BLO))
mov eax,LOWORD(A2) ;ecx = BLO
mul ecx ;so edx:eax = ALO*BLO
add edx,ebx ;now edx has all the LO*HI stuff
pop ebx
ret 16 ; callee restores the stack
Naja.. Weiter im Kontext - Ich schweife ab..
Die addierten beiden Zahlen werden dann als PyObject returned und somit sind diese dann in Python nutzbar.
Code:
PyObject * appGetFileDifference(PyObject * poSelf, PyObject * poArgs)
{
char *szFileName;
if (!PyTuple_GetString(poArgs, 0, &szFileName))
{
return Py_BuildException();
}
WIN32_FILE_ATTRIBUTE_DATA fileAttr = { 0 };
bool result = GetFileAttributesExA(szFileName, GetFileExInfoStandard, &fileAttr);
return PyLong_FromLongLong(fileAttr.ftLastWriteTime.dwHighDateTime + fileAttr.ftLastWriteTime.dwLowDateTime);
}
Vergesst hierbei auf keinen Fall die Methode auch als eine solche zu definieren!
Code:
{ "GetFileDifference", appGetFileDifference, METH_VARARGS },
Wenn ihr das getan habt seid ihr mit der Sourcemodifikation durch.
Compilen und die neue .exe verwenden. (Der Compiler wird euch vermutlich
nen Fehler zwecks BOOL und bool auswerfen. Diesen könnt ihr einfach ignorieren,
da es sich wieder nur um nen kleines Performanceproblemchen handelt.)
Nun zum Python Teil.
Ladet euch als erstes meine loginInfo Datei für die Nonplusultra Variante runter (ist ziemlich
unaufgeräumt, falls jemand Lust hat die unbenutzten Variablen zu entfernen
nur zu - kommt dann auch in die Special Thanks ;3)
Öffnet die Datei nun in Notepad++ oder in einem Editor eurer Wahl.
Relativ am Anfang der Datei solltet ihr folgendes Finden:
Diese zwei Werte solltet ihr verändern. Zum einen müsst ihr den Pfad zur
Datei angeben und dann den Namen des zu ladenden Moduls angeben.
Der Name des Moduls entspricht dem Namen eurer GUI-Klasse.
Beispiel:
Sobald ihr das getan habt müsst ihr noch dafür sorgen das meine Datei
irgendwie in euren Client geladen wird. Am einfachsten natürlich über die
logininfo.py welche ihr einfach in das Root-Directory (den Hauptordner)
eures Clients verschieben könnt. Die Datei wird dann, wenn nicht in der
intrologin.py unterbunden beim Start mitgeladen.