windows - Stop med at kigge efter indgangspunktet i kørsel i en DLL

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en applikation, der kører på Windows 2003, Windows 2008 og Windows Small Business Server.


Der er et vinduesopkald, som jeg laver for at genstarte systemet. Alle de kaldte opkald kommer fra advapi32.dll


InitiateSystemshutdown - Dette er fint i Windows 2003 og Windows 2008, men af ​​en eller anden grund ikke fungerer i Windows Aurora


InitiateShutdown - da ovenstående opkald ikke virker i windows aurora, brugte vi dette opkald og minimum understøttede OS til dette opkald er Windows 2008


Nu mangler min applikation i Windows 2003, da InitiateShutDown ikke findes i advapi32.dll på Windows 2003


Jeg får en fejl i at finde proceduren adgangspunkt for Initiateshutdown i advapi32.dll


Jeg har allerede lavet en betingelse også, så de korrekte funktionskald kaldes med hensyn til Windows-versionen.


Er der mulighed for at stoppe med at kigge efter adgangspunktet i dll'en, når applikationen lanceres. Tilstanden sikrer, at det korrekte funktionsopkald hedder?


ELLER


Jeg burde spørge Microsoft, hvorfor det gamle kald InitiateSystemshutdown ikke fungerer korrekt?

Bedste reference


Du skal bruge GetProcAddress og angive dine præprocessorvariabler for den tidligere version af Windows. Se http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx#setting\_winver\_or\_\_win32\_winnt[2]


Dybest set bør du:



  1. Indstil WINVER til den tidligste version af Windows, du skal understøtte, så du ikke ved et uheld bruger noget nyere.

  2. Nogle API-opkald og definitioner vil ikke fungere længere (som InitiateShutdown i dit tilfælde) i din kode, fordi de ikke er inkluderet i header-filer. For disse skal du bruge dem dynamisk. Typisk bruger du GetProcAddress API og bruger en 'typedef' til at definere funktionens signatur (da det ikke er i overskriftsfilerne du 'inkludere mere'). Et eksempel er her: http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx. I dit tilfælde vil du bruge API'en InitiateShutdown i stedet for den givne GetNativeSystemInfo. Hvis opkaldet til GetProcAddress mislykkes, kan du antage, at API'en ikke understøttes på den version af Windows. [3]


Andre referencer 1


I stedet for at eksplicit kalder den funktion i din kode (sådan at din app ikke lykkes, hvis funktionen ikke kan hentes fra den forventede DLL), kald det implicit via LoadLibrary og GetProcAddress.


Lav en 'LoadLibrary' på advapi32.dll. Og så ring GetProcAddress til 'InitiateShutdown'. Mangler yndefuldt, hvis funktionen ikke eksisterer, skal du ellers kaste den til en passende funktionspeger og
påberåbe det.


typedef DWORD (WINAPI *InitiateSystemShutdownTypeA) (char*, char*, DWORD, DWORD, DWORD);
typedef DWORD (WINAPI *InitiateSystemShutdownTypeW) (wchar\_t*, wchar\_t*, DWORD, DWORD, DWORD);

InitiateShutdownTypeA func = NULL;
HMODULE hMod = LoadLibrary("advapi32.dll"); 
if (hMod)
    func = (InitiateShutdownTypeA)GetProcAddress("InitiateShutdownW");

if (func)
    func(pwszMachineName, pwszMessage, dwGracePeriod, dwFlags, dwReason);