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 功能来知道什么方法和东西被神奇地注入了这个神奇的神秘对象,我会更好。我能想到的唯一想法就是学习旧方法并从旧的两个分离的 ATL 类型世界中学习所有可以调用的东西,然后以某种方式学习将它们组合起来。

简而言之,我正在寻找实际使用其中一个属性数据库类实例(变量)所需了解的最低语法,因为它们是由向导在新的 MFC 应用程序中生成的。下面显示的实例是 MFC 文档类的成员,CMFCApplication2Set m_MFCApplication2Set并被声明为 MFC 文档类中的字段。

我尝试过的是使用这个“无类型对象”。该对象似乎有很多数据字段 (m_X),并且只有一种方法显示在 IDE 代码完成中,称为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.h文件,您可以查看并查看转发给编译器的真实C++ 代码。

属性将被替换的基类、映射BEGIN_COLUMN_MAP等替换。属性源代码很紧凑,但该功能已被弃用,并且查看扩展代码应该很容易(如有必要)剥离属性并将扩展代码直接复制到源代码中. 使用 DB 属性很容易,而使用 COM 属性更难,因为内部依赖关系最复杂。

于 2013-03-05T20:13:11.003 回答