情報: ActiveX データ オブジェクト (ADO) を使用して VC + + の #import 経由で

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:169496
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
概要
Visual C で #import ディレクティブの新しい強力なメカニズムを提供しています。OLE サーバーを操作します。ActiveX データ オブジェクト (ADO) を使用すると、#import でのデータの取得を簡略化できます。ここでは何について説明します。ADO と #import を利用しなければなりません。
詳細

前に、任意のクラス作成 #import でインスタンス化します。

クラスのインスタンスを作成する前に、OLE を初期化することが重要です。#import によって作成します。たとえば、#import スマート ポインターの宣言、OLE を初期化し、スマートのインスタンスを作成次のコードは、安全であります。ポインター:

   // Declare smart pointer of Recordset    _RecordsetPtr     p;   void main( void )   {      // Initialize OLE.      ::CoInitialize(NULL);      // Instantiate smart pointer.      HRESULT hr = p.CreateInstance( __uuidof( Recordset ) );      ...   }				
ただし、次のサンプル コードは安全ではなく、未処理の生成例外。グローバル スマート ポインター p を宣言して (インスタンス化コンス トラクターでは、特定の uuid を渡すこと。)

// Declare & instantiate smart pointer of Recordset    _RecordsetPtr     p( __uuidof( _Recordset ) );   void main( void )   {      // Initialize OLE      ::CoInitialize(NULL);      ...   }				
P は、グローバル変数であるので、CoInitialize をされる前にインスタンス化されました。これまでに main() が呼び出されます。これは、次のコード スニペットに修正できます。
struct InitOle {      InitOle()  { ::CoInitialize(NULL); }      ~InitOle() { ::CoUninitialize();   }    } _init_InitOle_;   // Declare & instantiate smart pointer of Recordset    _RecordsetPtr     p( __uuidof( _Recordset ) );   ...				
InitOle 構造体のインスタンスが宣言し、インスタンスの前に p、また、初期化の OLE のコンス トラクターではそのため。せず、このような種類の緊急時に、次のエラー メッセージを表示されます。
未処理の例外を [プログラム] (KERNEL32。DLL): 0XE06D7363
Microsoft C の例外です。

#Import の実装を解決します。

お使いのプログラムでは、ADO を正しく起動することが重要ですか持つことができます。コンパイラ エラー。Msado10.dll、MSADO15.dll が #import を使用するには、次のコードを示します。

   #import <msado15.dll>            \    no_namespace                     \   rename( "EOF", "adoEOF" )				

エラー処理

ADO は、ADO のメソッドから返される HRESULT でエラーが発生可能性があります、#import の生成されたクラス、および発生した例外を取得することができます。いずれかの条件は、ADO の Errors コレクションがいることがあります。するには取得、Errors コレクションには、有効な接続オブジェクト必要があります。詳細については、マイクロソフト サポート技術、次の資料を参照してください。

169498 #Import で抽出から ADO で vc++ 情報: エラー情報

ADO と Dbdaoint.h

(#Import) から ADO と DAO または DAO SDK で、同じ実装ファイルを次のように混在させるしようとしています。

  #include <afxdao.h>  // MFC DAO   // -or-  #include <dbdao.h>   // DAO SDK  #import <msado15.dll> no_namespace ...				

次の 6 つのエラーが生成されます。

エラー C2011: 'EditModeEnum': 'enum' を再入力
エラー C2011: 'LockTypeEnum': 'enum' を再入力
エラー C2011: 'FieldAttributeEnum': 'enum' を再入力
エラー C2011: 'DataTypeEnum': 'enum' を再入力
エラー C2011: 'ParameterDirectionEnum': 'enum' を再入力
エラー C2011: 'RecordStatusEnum': 'enum' を再入力
しばらくの間は非常には、ほぼ同じで、実際の値では、各コンテンツ列挙型とは異なる ADO で必要な ~ 何が必要です。DAO では。この問題を回避するには、いくつかのオプションがあります。

  • 別の ADO と DAO のコード別の .cpp ファイルにします。さを保持します。#import または # を含む<afxdao.h bdao.h="">内の別々 の実装ファイルとしても</afxdao.h>
  • 名前空間を作成するのには、#import ステートメントを変更します。ADO を生成します。これが持つ意味を参照、ように、2 つの関数で ADO オブジェクトを参照するときの名前空間下。1 つ目は、関数内で排他的 ADO を使用する方法を示しています。2 番目に示す ADO と DAO のオブジェクトの組み合わせと一致する方法します。これです。ADO の ADO 名前空間を明示的に参照することによってのみ可能クラスまたは列挙型を使用します。

       #include <afxdao.h>      #import <msado15.dll>                            \               rename_namespace("AdoNS") rename( "EOF", "adoEOF" )      void ADOOnly( void )      {          using namespace AdoNS;          _RecordsetPtr   prs;          // Generates Compile Errors:          CDaoRecordset   rs;      }      void MixAdoAndDao( void )      {          AdoNS::_RecordsetPtr  prs;          // Compiles just fine          CDaoRecordset   drs;      }						
Dissecting とを使用して Msado105.tlh/Msado15.tli--------------------------------------------

2 つのファイル、Msado105.tlh および Msado15.tli で Msado15.dll が含まれているタイプ ライブラリの #import を生成します。.Tlh ファイルの構造は次のように分類できます。
  • 前方参照と Typedef
  • スマート ポインターの Typedef と宣言
  • タイプ ライブラリのアイテム
それぞれについて、以下で説明します。

前方参照と Typedef

構造体を使用して前方参照または Typedef を作成します。__declspec(uuid("...")) はデュアル インターフェイス、インターフェイスの GUID は、CoClass がタイプ ライブラリで定義されています。

   ...   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))   /* dual interface */ _Connection;   ...   struct __declspec(uuid("00000275-0000-0010-8000-00aa006d2ea4"))   /* interface */ ICADOConnection;   ...   struct /* coclass */ Connection;   ...				
接続などのすべてのインタ フェースは、複数の実装があります。これは、タイプのライブラリでは、依存していますを ADO ほとんどインターフェイスはデュアルですがコクラスまたはインターフェイスを実装します。

スマート ポインターの TypeDef 宣言

インタ フェース、デュアル インターフェイスのスマート ポインターが宣言され、インターフェイスの使用を大幅に効率化します。
   ...   _COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));   ...   _COM_SMARTPTR_TYPEDEF(ICADOConnection, __uuidof(ICADOConnection));   ...				
コクラス接続のスマート ポインターが宣言されていないことに注意してください。インターフェイスです。

タイプ ライブラリのアイテム

これも typelib の定義されている列挙型が含まれていますスマート ポインターのタイプ ライブラリ アイテムの実装。

enum CursorTypeEnum   {      adOpenUnspecified = -1,      adOpenForwardOnly = 0,      adOpenKeyset = 1,      adOpenDynamic = 2,      adOpenStatic = 3   };   ...   struct __declspec(uuid("00000274-0000-0010-8000-00aa006d2ea4"))   _Connection : _ADO   {      //       // Property data.      //       _declspec(property(get=GetConnectionString,                         put=PutConnectionString))      _bstr_t ConnectionString;      ...      //       // Wrapper methods for error-handling.      //       _bstr_t GetConnectionString ( );      void PutConnectionString (          _bstr_t pbstr );      ...      //       // Raw methods provided by interface.      //       virtual HRESULT __stdcall get_ConnectionString (          BSTR * pbstr ) = 0;      virtual HRESULT __stdcall put_ConnectionString (          BSTR pbstr ) = 0;      ...   };				
上記のコードでは、declspec にはプロパティのデータ セクションを使用してください。get 宣言し、メソッドの ConnectionString を記述します。ラッパー メソッドこれらのメソッドをラップする、#import によって、作成方法を説明し、成功しない場合、_com_error 例外が発生します。生セクションのメソッドによって呼び出される実際のメソッドを宣言、インターフェイスです。

GetConnectionString または PutConnectionString を呼び出すことができませんでしたが、実際には不要。ConnectionString プロパティであるためと次のように参照してください。

   bstrConnect = SysAllocString( L"DSN=AdoDemo;UID=admin;PWD=sa" );   p->ConnectionString = bstrConnect;				


GetConnectionString/PutConnectionString の実際の実装をすることができます。Msado15.tli ファイル内に見つかりません。

コード内で接続オブジェクトを使用するときに使用します定義されたデュアル インターフェイスのスマート ポインターのインスタンスMsado15.tlh としては、次のようにします。

   _ConnectionPtr p;   bstrConnect   HRESULT           hr = S_OK;   _ConnectionPtr    pConn;   hr = pConn.CreateInstance( __uuidof( Connection ) );      if( !FAILED( hr ) )         hr = pConn->Open( L"pubs", L"sa", L"" );				


ここ pubs で ODBC データ ソースです。

#import、Release() を明示的に呼び出す

#Import の利点は、QueryInterface、AddRef の処理には、自動的に解放します。ただし、呼び出しを開始する場合Release() 明示的に、問題を手動で作成できます。

_Com_ptr_t 内では、メンバー変数、m_pInterface です。#Import であるため、非常にオブジェクトとシン ラッパー、その区別を m_pInterface ものではありません。実際に、その参照をカウントすることがなく、だけデクリメントとリリース実際にオブジェクトを破棄します。明示的に呼び出すことによって (): がなくリリースします。it - #import バランスを非常に明示的に呼び出し元の AddRef() に喜んでを試みます興味深い副作用を作成します存在しないオブジェクトを解放し。動作がクラッシュします。

最適なアドバイスは、AddRef() いない (または少なくとも不要に) して、公開しないでください。
関連情報
  • 内部 Com でデール Rogerson ISBN 1-57231-349-8
  • OLE COM オブジェクトを付属していますビューアー (Oleview.exe)、Visual C では、タイプ ライブラリの内容を調べることで。
  • Visual C のオンライン ドキュメント #import で検索。
詳細については、マイクロソフト サポート技術記事を表示するのには以下の記事番号をクリックしてください。
182389 ファイル: Adovcbm.exe ADO 1.5 では、#import と Getrows/ブックマーク
184968 ファイル: 使用してを示します Adovcsp.exe ストアド プロシージャを ADO
186387 サンプル: COM からの ADO インターフェイス Ado2atl.exe を取得します。
181733 ファイル: Adovcbtd.exe #import を使用した UpdateBatch および CancelBatch
166112 PRB: ADO と #import を使用すると、EOF と矛盾
168354 情報: 基になる OLE、ole DB プロバイダー エラー ADO を通じて公開されます。
s_mfc

警告: この記事は自動翻訳されています

プロパティ

文書番号:169496 - 最終更新日: 12/04/2015 17:09:35 - リビジョン: 5.0

  • kbnosurvey kbarchive kbinfo kbdatabase kbcode kbusage kbmt KB169496 KbMtja
フィードバック