6

Windows プログラミングは初めてで、Windows シェル API 関数の存在を確認する最良の方法を見つけようとしています。Windows7 の新しいタスクバー機能を使いたいです。

https://msdn.microsoft.com/en-us/library/dd378460%28VS.85%29.aspx#custom_jump_lists

しかし、以前のバージョンの Windows でプログラムを使用できるようにしたいと考えています。関数がエンド ユーザー システムで呼び出せるかどうかを知る簡単な方法はありますか。私はC++でプログラミングしています。

4

8 に答える 8

11

関数の種類によって異なります。

プレーンな (非 COM) 関数の場合、唯一の方法はLoadLibraryandを使用することGetProcAddressです。どちらかが失敗した場合、OS にその機能がないことがわかります。既存の関数シグネチャを複製する関数ポインターの関数ポインター型宣言を記述するのは面倒ですが、VC++2010 ではdecltypeそのために使用できます。例えば:

HMODULE user32 = LoadLibraryW(L"user32");
if (user32 != NULL)
{
    auto messageBoxW = reinterpret_cast<decltype(MessageBoxW)*>(GetProcAddress(user32, "MessageBoxW"));
    if (messageBoxW != NULL)
    {
        messageBoxW(HWND_DESKTOP, L"Hello!", NULL, MB_OK);
    }
}

ただし、多くのシェル API は、COM コンポーネントとインターフェイスを介して公開されています。それらのケースは異なります。まったく新しいコンポーネントを扱う必要がある場合があります。egIApplicationDestinationsは Win7 の新しいインターフェイスであり、それを実装するコクラスも新しいものです。そのような場合は、 を実行しCoCreateInstanceて戻り値を確認するだけで済みます。REGDB_E_CLASSNOTREGこれは、そのようなコクラスがシステムに登録されていないことを意味します (事実上、サポートされていません)。

ただし、新しい OS バージョンでは、既存のコクラスに新しいインターフェイスが導入されることがあります。例としては、Win7 で新しく導入されたものですが、Win95 を実装してさかのぼるITaskbarList3既存のコクラスで提供されています。ITaskbarListそのような場合は、最初に最も基本的なインターフェイスのコクラスをインスタンス化し、次に を使用QueryInterfaceして新しいインターフェイス バージョンを取得し、 の戻り値をチェックしてサポートされていないことを検出する必要がありますE_NOINTERFACE

于 2009-07-15T04:55:51.453 に答える
3

LoadLibraryGetProcAddressは友達になります。

また、このチュートリアルもご覧ください

于 2009-07-15T04:05:24.597 に答える
2

これにはMSDNが最適だと思います。関数のドキュメントに関するすべての MSDN ページには、どのバージョンの Windows がこの関数をサポートしているかを示すセクションが最後に含まれています。

例として、 GetModuleHandleのドキュメントを確認してください。これにはRequirementsという名前のセクションが含まれており、その下にMinimum Supported ClientおよびMinimum Supported Serverというフィールドがあります。

ただし、関数の存在を動的に確認する場合は、 LoadLibraryおよびGetProcAddressを使用してこれを行うことができます。

于 2009-07-15T04:05:07.657 に答える
1

私は現在の解決策に同意しません。かなりの量の判読不能なコードになってしまいます。

より適切な方法は、Windows 7 専用のカスタム DLL で機能をラップすることです。他のシステムの場合は、同じ機能を実装する別のバージョンの DLL を提供してください。多くの場合、これはノーオペレーションになる可能性があります。たとえば、タスクバーの拡張機能を設定する関数は、古い Windows バージョンでは機能しません。

これらの DLL 間の動的切り替えは、MSVC の遅延読み込み機能を使用して行われます。EXE でカスタム フックを使用して、DLL の最初の関数が呼び出されたときに正しい DLL バージョンを選択できます。この時点で、Windows 7 で実行しているかどうかがわかります。

于 2009-07-15T11:34:03.820 に答える
0

新しい機能を動的にロードして呼び出すには、LoadLibrary と GetProcAddress を使用する必要があります。

于 2009-07-15T04:05:04.070 に答える
0

はい、実行時にライブラリ内の関数の存在をいつでもチェックして、適切なアクションを実行できます。LoadLibrary および GetProcAddress API を確認してください。 http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx

于 2009-07-15T04:05:40.370 に答える
0

対象の OS (Win 95 など) で関数が使用できない場合にビルド ブレークを得るためにコンパイル時に調べたい場合は、NTDDI_VERSION、_WIN32_WINNT、WINVER に記載されているマクロを定義できます。

機能が利用できない場合 (Win7 より古い OS 上の JumpLists など) にアプリを正常に動作させたい場合は、LoadLibrary/GetProcAddress を組み合わせて、探している機能が利用可能かどうかを判断する必要があります。

于 2009-07-15T04:07:32.783 に答える
0

LoadLibararyライブラリ ハンドルGerProcAddressを取得し、関数へのポインターを取得するために使用します。現在の OS でサポートされていない機能については、ERROR_CALL_NOT_IMPLEMENTEDからエラーが発生しGetLastErrorます。

于 2009-07-15T04:49:38.050 に答える