1

Visual C++ 2012 で MFCApplication ウィザードを使用し、[属性付きデータベース クラスを生成する] をオンにすると、次のような特別な構文 (属性付き C++ クラス) を含むヘッダーが生成されます。

// MFCApplication2Set.h: interface of the CMFCApplication2Set class
//

#pragma once

// code generated on March-05-13, 9:26 AM

[
    db_source(L"Provider=SQLNCLI11.1;..."),
    db_table(L"dbo.tblEmployee")
]
class CMFCApplication2Set
{
public:
... big list of stuff that corresponds to the fields in your db table omitted ...
}

上記のヘッダーは、ほとんど空の実装ファイルに対応しています。

// MFCApplication2Set.cpp : implementation of the CMFCApplication2Set class
//

#include "stdafx.h"
#include "MFCApplication2.h"
#include "MFCApplication2Set.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCApplication2Set implementation

それが全体の実装クラスでした。次の点に注意してください。

A. 親クラス名がどこにも指定されていません。B. ここでは「Visual C++ マジック」が行われています。つまり、最新の C++ の初心者である私には戸惑います。 ここdb_sourceに文書化されていますが、文書はかなり薄いか、少なくとも私には不透明です。

質問:

  1. この構文を最初に見たときは戸惑いましたが、おそらくVisual C++のこの属性機能の変形であることがわかりました。それですよね?

  2. これらの生成された「属性付きデータベース クラス」オブジェクトをどのように使用するつもりですか? このドキュメンテーションを見つけましたが、そのドキュメンテーションを注意深く見ると、そのコード サンプルは人々に古い方法と新しい方法を示しており、IDE ではできないこの新しいオブジェクトの使用方法を知りたいことを教えてくれません。ドキュメントやコード補完機能があれば教えてください。また、CMFCApplication2Setウィザードによって生成されたクラスは、型やクラス名を参照していません。迷っています。なんらかの IDE 機能を使用して、この魔法のような謎のオブジェクトに魔法のように注入されたメソッドやものを知ることができれば、もっとうまくいくでしょう。私が考えることができる唯一の考えは、古い方法を学び、古い 2 つの別個の ATL 型の世界から呼び出すことができるすべてのものを学び、それらを組み合わせる方法を学ぶことです。

簡単に言えば、ウィザードによって新しい MFC アプリで生成される、これらの属性付きデータベース クラス インスタンスの 1 つである変数を実際に使用するために知っておく必要がある最小限の構文を探しています。以下に示すインスタンスは、MFC ドキュメント クラスのメンバーであり、MFC ドキュメント クラスCMFCApplication2Set m_MFCApplication2Set内のフィールドとして宣言されています。

私が試したのは、この「型指定されていないオブジェクト」を使用することです。このオブジェクトには多数のデータ フィールド (m_X) があり、IDE コード補完に表示されるメソッドは 1 つだけGetRowSetPropertiesです。なんらかの魔法やインジェクションが行われているおかげで、この生成された属性付きデータベース クラス (目に見えて何も継承していない) は、編集時とコンパイル時に私にとって完全な謎です。

これは、コンストラクターが実行されたときに自分自身を初期化したかどうかを確認するために、このことを調べようとしているところです。

BOOL CMFCApplication2Doc::OnNewDocument() {     if (!CDocument::OnNewDocument())        return FALSE;

        TRACE( m_MFCApplication2Set.m_AStringFieldName); // outputs NOISE.



    return TRUE; }

コンパイル時と編集時に、IDE は、何も継承しないこの「匿名」クラスに含まれる型について何の助けにもなりませんが、私が推測している属性を介したある種のインジェクションのために多くの秘密の力を取得します。デバッグ時に、この C++ クラスには多数のデータ フィールドがあることがわかりますが、それでも使用方法を理解するのには役立ちません。これらのいずれかを使用してデータベースからレコードセットを取得する最小限のコード サンプルは素晴らしいでしょう。

ここに画像の説明を入力

更新: 呼び出しOpenDataSourceは楽しいものです。コンパイルはされますが、IDE はそれが有効であるとは見なさないからです。それにもかかわらず、実行され、結果として 0 が返されますが、実際にはこのCThingyThatVisualStudioGaveYouThatYouDontKnowWhatItIsは初期化されません。

ここに画像の説明を入力

4

1 に答える 1

1

これは、属性付き C++ コードの非推奨の機能です。プリプロセッサはコードを展開し、属性を実際の基本クラスに置き換えます。これらの中間ファイルの生成を有効にすると、次のことがより明確になります。

ここに画像の説明を入力

ファイルが生成さXXX.mrg.cppれ、コンパイラに転送された実際のXXX.mrg.hC++ コードを確認して確認できます。

属性は、置換された基本クラス、マップBEGIN_COLUMN_MAPなどに置き換えられます。属性付きのソース コードはコンパクトですが、機能は推奨されておらず、拡張されたコードを調べると、(必要に応じて) 属性を取り除き、拡張されたコードをソースに直接コピーするのは簡単なはずです。 . 内部の依存関係が最も洗練されているため、DB 属性では簡単ですが、COM 属性ではより困難です。

于 2013-03-05T20:13:11.003 に答える