web-dev-qa-db-ja.com

RegSvr32終了コードのドキュメント?

RegSvr32.exe COMサーバーを登録し、次の終了コードを取得します。

0-適切に登録する場合DLL Com Server

3-偽の登録を試みるときDLL Com Server(.DLLに名前が変更された単純なテキストファイル)

4-Com Serverではなく、単純なDLLを登録しようとしたとき

質問:可能なすべての終了コードとその意味の公式(または非公式ですが良い)の説明はどこにありますか?

SO見つけました このトピック 終了コードはWindowsシステムエラーコードと同じであると書かれていますが、不正なファイルを登録しようとすると、コード= 3 = ERROR_PATH_NOT_FOUND、および非COM DLL-4 = ERROR_TOO_MANY_OPEN_FILES?私にとっては論理的に聞こえません。

27
ALZ

終了コードは文書化されていません。ドキュメントは次のとおりです。

ただし、バージョンREGSVR32.EXEのソースコードはVisual Studio 2008に同梱されています。これにより、バージョンが4.0.0になるため、Windowsに同梱されているバージョン6のレポートとは異なります。

クイックルックはこれらを示します:

#define FAIL_ARGS   1 // Invalid Argument
#define FAIL_OLE    2 // OleInitialize Failed
#define FAIL_LOAD   3 // LoadLibrary Failed
#define FAIL_ENTRY  4 // GetProcAddress failed
#define FAIL_REG    5 // DllRegisterServer or DllUnregisterServer failed.

ソースコードを読むと、どのような状況でも上記以外のコードが返され、成功した場合はゼロが返されることが示唆されます。

戻りコードの違いは、GetProcAddressに達すると、常に5を返すのではなく、呼び出す関数から終了コードを返すことだと思われます。

理想的には、より便利な終了コードを取得するためにGetLastErrorを使用しますが、現在は終了コード2〜4に依存するツール(サードパーティのインストールプログラムなど)が多すぎて、変更するには遅すぎます。

MSDNのRaymond Chenのブログの さまざまなregsvr32終了コードの意味 も参照してください。

37
Ben

Visual Studioは、実際にはRegSvr32ユーティリティのソースであるMFCサンプルを同梱して出荷していましたが、終了コードを収集するためにそれを行ったことを覚えています。

FAIL_ARGS   1
FAIL_OLE    2
FAIL_LOAD   3
FAIL_ENTRY  4  // Not ERROR_TOO_MANY_OPEN_FILES but as expected "could not resolve 
               // DLLRegisterServer" as your using an invalid DLL
FAIL_REG    5

私はサンプルを見つけることができませんが、抽出したものをGoogleで検索すると、次のようになります: http://support.Microsoft.com/kb/207132 一致するコードがあるため、そのKBのように見えますデモコードもRegSvrから取得しました。各障害コードの背後にある理由を解決するのは簡単です。

13
Alex K.

ベンの答えは正しいですが、エラーコード3も結果として与えられることに注意してください

  • .DLLが見つかりませんでした
  • .DLLは別のプロセスによってロックされており、読み取ることができませんでした
  • プロセスにはファイルを開くための十分な権限がありませんでした。たとえば、必要なときに管理者権限で実行されていない(Cドライブ上の特定のファイルまたは共通ファイルを使用)

> #define FAIL_LOAD 3 // LoadLibrary Failed

少し曖昧に感じますが、LoadLibraryは特定のDLL内で参照されるDLLを意味します。 Depends などのアプリケーションを使用すると、欠落しているものを含むすべての参照を見つけることができます。参照の欠落が常にエラーコード3になるわけではないことに注意してください(DLLが実際にそれを使用しなかった場合)