Hallo Forum
Ich hatte in meinem Programm den Aufruf "GetPhysicallyInstalledSystemMemory" verwendet und muss diese Software nun auf einem alten Windows-XP auch zum Laufen bringen. Leider wurde dieser Befehl damals noch gar nicht unterstützt.
Jetzt wollte ich schlau sein, und hab einfach diesen Befehl dynamisch geladen:
CMyApp::InitInstance() {
...
m_pfn_GPIMem = NULL;
m_hKernel32 = LoadLibrary(_T("KERNEL32.DLL"));
if (m_hKernel32) {
m_pfn_GPIMem = (PFN_GPIMem) GetProcAddress(m_hKernel32,"GetPhysicallyInstalledSystemMemory");
}
...
unsigned __int64 pim;
if (m_pfn_GPIMem) m_pfn_GPIMem(&pim);
...
if (m_hKernel32) FreeLibrary(m_hKernel32);
}
Somit würde auf der XP-Maschine dieser Befehl ganz einfach nicht zur Verfügung stehen (m_pfn_GPIMem ist Null) und auf den normalen Win7 und Win10 Systemen sollte das passen.
Tut es aber nicht: Bei Win-XP wird die Prozedur nicht geladen und alles ist gut, bei Win7 und Win10 crasht die Maschine beim Aufruf der Funktion (wohlbemerkt, handelt es sich dabei um embedded Windows Versionen). Was mach ich hier falsch? Liegt das am KERNEL32?
Ich hab auch noch eine Fehlermeldung beim Debuggen:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Was heißt das?
Grüße
FireHeart