1

コンプライアンスシナリオで使用されているDLLがあります(詳細は関係ありません)。重要な点は、メインの実行可能オブジェクトがDLLのバージョン番号を表示する必要があるということです。私の解決策は、DLLに独自のバージョンを返す関数があることでした。つまり、独自のバージョンリソースから取得し、文字列として返します。

私のレビューアは、メインプログラムがDLLのバージョン番号を計算する必要があると言っています。彼は、DLLモジュールハンドルを取得し、それを使用してバージョンを抽出するためのコードを私にくれました。

私の質問は、どちらがより良いデザインであり、なぜですか?私の考えでは、OOの原則を使用して、DLLにバージョン番号を尋ねる必要があります。これを逆に行うと、メインプログラムはバージョン情報がどのように格納されているかを知る必要があり、したがって実装とより緊密に結合されます。

DLLからバージョン情報を抽出する方法を正確に知っていることに注意してください。私の質問は、これを行うコードの最適な場所についてです。

4

1 に答える 1

2

あなたが働いている環境を明確にできますか?今のところ、モジュールハンドルの取得についてはすでに説明したので、C ++を使用していて、いくつかのWin32関数(GetModuleHandle、LoadLibraryなど)の1つを呼び出していると仮定します。

まず第一に、私はあまりにも広い文脈でOOの原則を適用することに注意したいと思います。オブジェクト指向パラダイムは、ソフトウェアをより保守可能で理解しやすい方法で構造化するのに役立ちます。説明している問題は、アプリケーションの境界の外にまで及ぶ可能性があるように聞こえます。DLLなどの別のリソースに関する情報を取得する場合は、標準的なアプローチを使用してこれを実現し、コードが検査する必要のある項目から確実に分離されるようにすることを検討する必要があります。

DLLに関数を導入してバージョン番号をメインアプリケーションに返す場合、メインアプリケーションとそのバージョン情報を提供する必要のあるDLLとの間に緊密な結合が作成されます(基本的に、このための特注のAPIまたはインターフェイスを定義します)。 。

代わりに、プラットフォーム全体の標準機能を使用して情報を取得することを検討する必要があります。これにより、アプリケーションは、ハンドルを取得できるDLLをバージョン管理できるようになります。

dllのHMODULEがある(そしてC ++を使用している)と仮定して、次の関数を呼び出してバージョンを取得します...

GetModuleFileNameEx(これをまだ知らない場合にDLLのフルパスとファイル名を取得するため) http://msdn.microsoft.com/en-us/library/windows/desktop/ms683198(v=vs.85)。 aspx

このファイル名を使用して、

GetFileVersionInfoSize(MSDNでこれらを検索してください)

これにより、ファイルのバージョンメタデータに関するいくつかの重要な情報(ファイルに含まれている場合はどのくらいの情報)がわかります。この関数が成功したと仮定して、

GetFileVersionInfo

これにより、すべてのファイル情報メタデータがバッファに読み込まれ、

VerQueryValue

lpSubBlockパラメーターとして「\」を指定して、標準のファイル情報メタデータ(バージョン番号を含む)を取得します

上記の関数を使用すると、コードを記述して、コードがハンドルを取得できる任意のモジュールのバージョン番号を取得できます。

もちろん、C#を使用している場合、解決策ははるかに簡単です。お役に立てれば...

于 2012-09-06T10:44:11.073 に答える