0

Windows 2003、Windows 2008、および Windows Small Business Server で動作するアプリケーションがあります。

システムを再起動するために行う Windows 呼び出しがあります。以下で説明するすべての呼び出しは、advapi32.dll からのものです。

InitiateSystemshutdown - Windows 2003 および Windows 2008 では問題ありませんが、何らかの理由で Wi​​ndows aurora では機能しません。

InitiateShutdown - 上記の呼び出しは Windows aurora では機能しないため、この呼び出しを使用しました。この呼び出しでサポートされる最小 OS は Windows 2008 です。

Windows 2003 の advapi32.dll に InitiateShutDown が存在しないため、アプリケーションを Windows 2003 で実行できません。

advapi32.dll で Initiateshutdown のプロシージャ エントリ ポイントが見つかりませんでした。

Windowsバージョンに関して適切な関数呼び出しが呼び出されるように、すでに条件も付けています。

アプリケーションの起動時に dll 内のエントリ ポイントの検索を停止する方法はありますか? この条件により、適切な関数呼び出しが確実に呼び出されるようになりますか?

また

古い呼び出し InitiateSystemshutdown が正しく機能しない理由を Microsoft に尋ねるべきですか?

4

2 に答える 2

2

GetProcAddress を使用して、以前のバージョンの Windows 用のプリプロセッサ変数を設定する必要があります。http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx#setting_winver_or__win32_winntを参照してください。

基本的に、次のことを行う必要があります。

  1. WINVER を、サポートする必要がある Windows の最も古いバージョンに設定して、誤って新しいバージョンを使用しないようにします。

  2. 一部の API 呼び出しと定義は、ヘッダー ファイルに含まれていないため、コード内で機能しなくなります (この場合の InitiateShutdown など)。これらについては、動的に使用する必要があります。通常、GetProcAddress API を使用し、"typedef" を使用して関数のシグネチャを定義します (インクルードするヘッダー ファイルには含まれていないため)。例は次のとおりです: http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx . あなたの場合、指定された GetNativeSystemInfo の代わりに InitiateShutdown API を使用します。GetProcAddress の呼び出しが失敗した場合は、API がそのバージョンの Windows でサポートされていないと見なすことができます。

于 2011-08-22T18:46:03.080 に答える
1

コードでその関数を明示的に呼び出すのではなく(期待されるDLLから関数を読み込めない場合にアプリの読み込みに失敗するように)、LoadLibraryとGetProcAddressを介して暗黙的に呼び出します。

advapi32.dllで「LoadLibrary」を実行します。次に、「InitiateShutdown」のGetProcAddressを呼び出します。関数が存在しない場合は正常に失敗します。存在しない場合は、適切な関数ポインターにキャストして呼び出します。

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);
于 2011-08-22T18:49:05.770 に答える