現在オフラインです。再接続するためにインターネットの接続を待っています

OLE コントロール登録エラーの原因

サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。
概要
Visual C++ の [ツール] メニュー、CDK (Control Development Kit) に含まれているテスト コンテナ、Visual C++ に含まれている regsvr または regsvr32 アプリケーションを使用して、OLE コントロールを登録できます。コントロールの登録でエラーが発生した場合は、この資料を参考に、問題のトラブルシューティングを行ってください。
詳細
上記の OLE コントロールの登録方法では、基本的にすべて同じ技法が使用されています。LoadLibrary() を呼び出してコントロールをメモリに読み込み、GetProcAddress() を呼び出して DllRegisterServer() 関数のアドレスを取得し、DllRegisterServer() を呼び出してコントロールを登録します。

コントロールの登録が失敗する原因

  • 1 つ以上の必要な OLE DLL が、設定されているパスにありません。OLE コントロールの配布方法と、配布に必要な DLL に関する説明は、CDK と同じディレクトリにある Shipctrl.wri ファイルに記載されています。
  • コントロールが OLE DLL 以外の DLL を読み込み中で、その DLL がパスにありません。コントロールがメモリに読み込まれるときに、インポート ライブラリによって暗黙的に読み込まれた DLL も読み込まれます。これらの DLL のいずれかがパスにない場合、コントロールが正常に読み込まれず、登録は失敗します。
  • 1 つまたは複数の DLL のバージョンが適切ではありません。コンピュータにインストールされている DLL よりも新しいバージョンの DLL でコントロールがビルドされている場合、コントロールが正常に読み込まれず、登録は失敗します。
  • 古いバージョンの Ocd25.lib にリンクされています。コントロールで MFC データベース クラスを使用している場合、リンク先の Ocd25.lib ファイルのバージョンに問題がある場合があります。
  • OLE コントロールが Novell サーバーのリモート ドライブ上にあります。この場合、.ocx ファイルへのアクセス許可が原因で、コントロールが読み込まれないことがあります。.ocx ファイルへのアクセス許可が、読み取り専用、共有アクセスに設定されていることを確認します (このアクセス許可は、実行可能ファイルの一般的な設定です)。

トラブルシューティング方法

考えられる原因のいずれにも該当しない場合は、次の方法を使用します。

  1. Visual C++ でコントロール プロジェクトを読み込み、デバッグ セッションの実行可能ファイルを OLE コントロール テスト コンテナ (Tstcon16.exe または Tstcon32.exe) に設定します。(デバッガで) テスト コンテナを開始すると、テスト コンテナにデバッグ情報が含まれていないという警告が表示されます。この警告を無視して続行します。
  2. テスト コンテナからコントロールを登録します。OLE コントロール DLL または依存する DLL からのデバッグ出力を監視します。16 ビット アプリケーションを実行している場合は、DBWIN プログラムを実行してデバッグ出力を表示します。

    DLL デバッグ セッションの実行可能ファイルを設定する方法については、Books Online の「DLL のデバッグ」を参照してください。
もう 1 つの方法として、プログラムからコントロールを登録することもできます。最初に、ダイアログ ベースのアプリケーションと OLE オートメーションを選択して、MFC AppWizard アプリケーションを作成します。コントロールを登録するためのコードが正常に動作するように、OLE オートメーションを有効にして OLE が初期化されるようにします。CWinApp 派生クラスには、次のような初期コードを含む関数 InitInstance() があります。
BOOL CTestregApp::InitInstance(){   // Initialize OLE libraries   if (!AfxOleInit())   {      AfxMessageBox(IDP_OLE_INIT_FAILED);      return FALSE;   }				
ここで、次のコード セグメントを追加します。このコードにより、LoadLibrary()、GetProcAddress()、および DllRegisterServer からのリターン コードをチェックできます。
#ifdef _WIN32    HINSTANCE hDLL = LoadLibrary("some.ocx");    if(NULL == hDLL)    {        // See Winerror.h for explaination of error code.        DWORD error = GetLastError();        TRACE1("LoadLibrary() Failed with: %i\n", error);        return FALSE;    }    typedef HRESULT (CALLBACK *HCRET)(void);    HCRET lpfnDllRegisterServer;    lpfnDllRegisterServer =            (HCRET)GetProcAddress(hDLL, "DllRegisterServer");    if(NULL == lpfnDllRegisterServer)    {        // See Winerror.h for explaination of error code.        DWORD error = GetLastError();        TRACE1("GetProcAddress() Failed with %i\n", error);        return FALSE;    }    if(FAILED((*lpfnDllRegisterServer)()))    {        TRACE("DLLRegisterServer() Failed");        return FALSE;    }#else // 16-bit    HINSTANCE hDLL = LoadLibrary("regtest.ocx");    if(HINSTANCE_ERROR > hDLL)    {        // See LoadLibrary() help for explaination of error code.        TRACE1("LoadLibrary() Failed with: %i\n", hDLL);        return FALSE;    }    typedef HRESULT (CALLBACK *HCRET)(void);    HCRET lpfnDllRegisterServer;    lpfnDllRegisterServer =            (HCRET)GetProcAddress(hDLL, "DllRegisterServer");    if(NULL == lpfnDllRegisterServer)    {        // See GetProcAddress() help for explaination of error code.        TRACE("GetProcAddress() Failed");        return FALSE;    }    if(FAILED((*lpfnDllRegisterServer)()))    {        TRACE("DLLRegisterServer() Failed");        return FALSE;    }#endif				
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 140346 (最終更新日 2003-12-01) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
kbinf 1.51 1.52 1.52b 2.00 2.10 2.20 2.50 2.51 2.52 3.00 3.10 3.20 4.00
プロパティ

文書番号:140346 - 最終更新日: 09/16/2004 10:12:26 - リビジョン: 2.1

  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
  • kbcode kbctrl kbtshoot KB140346
フィードバック