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

文書翻訳 文書翻訳
文書番号: 140346 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

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) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 140346 - 最終更新日: 2004年9月16日 - リビジョン: 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
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com