Nach der Umstellung vom Windows SDK für Vista auf das von Windows 7 zeigte das Installationsprogramm von SpeedCommander unter Windows XP und Vista beim Start plötzlich folgende Meldung an:
—————————
setup.exe – Einsprungpunkt nicht gefunden
—————————
Der Prozedureinsprungpunkt “K32GetModuleFileNameExW” wurde in der DLL “KERNEL32.dll” nicht gefunden.
—————————
OK
—————————
Der Grund dafür ist, dass mit Windows 7 alle Funktionen der PSAPI.DLL in den Kernel gewandert sind. Wenn man nun für Windows 7 kompiliert, dann werden alle Funktionsnamen auf die entsprechenden Kernelfunktionen gemappt. Die Implementierung findet man in der psapi.h:
// // Give teams a choice of using a downlevel version of psapi.h for an OS versions. // Teams can set C_DEFINES=$(C_DEFINES) -DPSAPI_VERSION=1 for downlevel psapi // on windows 7 and higher. We found that test code needs this capability. // #ifndef PSAPI_VERSION #if (NTDDI_VERSION >= NTDDI_WIN7) #define PSAPI_VERSION 2 #else #define PSAPI_VERSION 1 #endif #endif #if (PSAPI_VERSION > 1) #define EnumProcesses K32EnumProcesses #define EnumProcessModules K32EnumProcessModules #define EnumProcessModulesEx K32EnumProcessModulesEx #define GetModuleBaseNameA K32GetModuleBaseNameA #define GetModuleBaseNameW K32GetModuleBaseNameW #define GetModuleFileNameExA K32GetModuleFileNameExA #define GetModuleFileNameExW K32GetModuleFileNameExW ...... #endif
Die Kernelfunktionen existieren aber nur ab Windows 7. Auf älteren Systemen können sie beim Programmstart nicht aufgelöst werden und es erfolgt eine Fehlermeldung.
Zur Abhilfe definiert man einfach vor dem Einbinden der psapi.h den entsprechenden Kompatibilitätsschalter:
#define PSAPI_VERSION 1
Nun werden die Funktionen nicht mehr gemappt und wie bisher gewohnt in der PSAPI.DLL gesucht.







