如何用MFC调用存储过程

青稞 2010-02-02 12:27:46
我用VS2008的MFC,通过ADO访问SQL2005数据库,
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
HRESULT hResult;
hResult = m_pConnection.CreateInstance(__uuidof(Connection));
if (SUCCEEDED(hResult))
{
m_pConnection->ConnectionTimeout = 5;///设置超时时间为5秒

hResult = m_pConnection->Open((_bstr_t)"Driver={SQL Server};Server=192.168.3.222,81\\SQLEXPRESS;Database=GovSysCheck;UID=GovCheck2;PWD=123456","","",adModeUnknown);
}

接下来想调用这样一个存储过程:
DECLARE @id as int;
exec @id=spAddtbRepository(?,?,?,?)//这个数据库那边写好了,我只要传参数进去就好了..
select @id as id
主要是取得ID..
我怎么样调用这个存储过程..
...全文
345 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
青稞 2010-02-03
  • 打赏
  • 举报
回复
有人回答么??谢谢??
青稞 2010-02-03
  • 打赏
  • 举报
回复
谢谢楼上的答复,我在研究,但我想知道我上面的代码出了什么问题呢??
青稞 2010-02-03
  • 打赏
  • 举报
回复
有人知道么??指点下..在线等..急用!
  • 打赏
  • 举报
回复
mark
青稞 2010-02-03
  • 打赏
  • 举报
回复
存储过程是以下的:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[spAddtbRepository]--插入知识库信息
@RepositoryID numeric OUT, --知识点ID
@RepositoryCategoryID numeric, --类型编号
@RepositoryForRevisionyID numeric, --知识库版本ID
@ParentRepositoryID numeric, --上级ID
@Level int, --1级最高,依次递增
@SerialNumber int, --在同一父ID下的序号
@ShortText nvarchar(256), --内容简写
@FullText nvarchar(2048), --内容
@Hint nvarchar(2048), --提示信息,第二版新增,满足用户需求
@Remark nvarchar, --备注 在用户完成时,如果未完成该项,则提示警告用户完成该项
@QuestionOrAnswer int, --问题答案1:问题;2:答案;3:问题答案兼有
@Symbol nvarchar(256), --标识符
@LastVersionRepositoryID numeric --上一个版本对应ID

AS
DECLARE @ret AS INT;
BEGIN
SET NOCOUNT ON
SET @ret = 0;
BEGIN TRY
INSERT INTO tbRepository(RepositoryCategoryID, RepositoryForRevisionyID,
ParentRepositoryID, [Level], SerialNumber, ShortText, [FullText], Hint, Remark,
QuestionOrAnswer, Symbol, LastVersionRepositoryID)
VALUES(@RepositoryCategoryID, @RepositoryForRevisionyID,
@ParentRepositoryID, @Level, @SerialNumber, @ShortText, @FullText, @Hint, @Remark,
@QuestionOrAnswer, @Symbol, @LastVersionRepositoryID)
SELECT @ret = @@IDENTITY
END TRY
BEGIN CATCH
SET @ret = 0;
END CATCH

SET @RepositoryID = @ret;
RETURN @ret;
END


VC里面我这样写的:
m_pCommand->CommandText = _bstr_t("spAddtbRepository");
m_pCommand->CommandType = adCmdStoredProc;
m_pCommand->Parameters->Refresh();

int iRet = 0;
_ParameterPtr pParaReturnID;
pParaReturnID = m_pCommand->CreateParameter( _bstr_t("@ret"), adInteger, adParamReturnValue, sizeof(int), iRet);
m_pCommand->Parameters->Append(pParaReturnID);

_ParameterPtr pParaID;
pParaID = m_pCommand->CreateParameter( _bstr_t("@RepositoryID"), adNumeric, adParamOutput, sizeof(int), treeNode->iID);
m_pCommand->Parameters->Append(pParaID);

_ParameterPtr pParaCategoryID;
pParaCategoryID = m_pCommand->CreateParameter( _bstr_t("@RepositoryCategoryID"), adNumeric, adParamInput, sizeof(int), treeNode->iType);
m_pCommand->Parameters->Append(pParaCategoryID);

_ParameterPtr pParaRevisionyID;
pParaRevisionyID = m_pCommand->CreateParameter( _bstr_t("@RepositoryForRevisionyID"), adNumeric, adParamInput, sizeof(int), treeNode->iVersionID);
m_pCommand->Parameters->Append(pParaRevisionyID);

_ParameterPtr pParaParentRepositoryID;
pParaParentRepositoryID = m_pCommand->CreateParameter( _bstr_t("@ParentRepositoryID"), adNumeric, adParamInput, sizeof(int), treeNode->iParentID);
m_pCommand->Parameters->Append(pParaParentRepositoryID);

_ParameterPtr pParaLevel;
pParaLevel = m_pCommand->CreateParameter( _bstr_t("@Level"), adInteger, adParamInput, sizeof(int), treeNode->iLayID);
m_pCommand->Parameters->Append(pParaLevel);

_ParameterPtr pParaSerialNumber;
pParaSerialNumber = m_pCommand->CreateParameter( _bstr_t("@SerialNumber"), adInteger, adParamInput, sizeof(int), treeNode->iSortNO);
m_pCommand->Parameters->Append(pParaSerialNumber);

_ParameterPtr pParaShortText;
pParaShortText = m_pCommand->CreateParameter( _bstr_t("@ShortText"), adWChar, adParamInput, 128, _variant_t(treeNode->szSContents));
m_pCommand->Parameters->Append(pParaShortText);

_ParameterPtr pParaFullText;
pParaFullText = m_pCommand->CreateParameter( _bstr_t("@FullText"), adWChar, adParamInput, 128, _variant_t(treeNode->szContents));
m_pCommand->Parameters->Append(pParaFullText);

_ParameterPtr pParaHint;
pParaHint = m_pCommand->CreateParameter( _bstr_t("@Hint"), adWChar, adParamInput, 128, _variant_t(treeNode->szTipContents));
m_pCommand->Parameters->Append(pParaHint);

_ParameterPtr pParaRemark;
pParaRemark = m_pCommand->CreateParameter( _bstr_t("@Remark"), adWChar, adParamInput, 1, NULL);
m_pCommand->Parameters->Append(pParaRemark);

_ParameterPtr pParaQuestionOrAnswer;
pParaQuestionOrAnswer = m_pCommand->CreateParameter( _bstr_t("@QuestionOrAnswer"), adInteger, adParamInput, sizeof(int), 1);
m_pCommand->Parameters->Append(pParaQuestionOrAnswer);

_ParameterPtr pParaSymbol;
pParaSymbol = m_pCommand->CreateParameter( _bstr_t("@Symbol"), adWChar, adParamInput, 128, NULL);
m_pCommand->Parameters->Append(pParaSymbol);

_ParameterPtr pParaLastVersionRepositoryID;
pParaLastVersionRepositoryID = m_pCommand->CreateParameter( _bstr_t("@LastVersionRepositoryID"), adNumeric, adParamInput, sizeof(int), 1);
m_pCommand->Parameters->Append(pParaLastVersionRepositoryID);

m_pCommand->Execute(NULL, NULL, adCmdStoredProc);//总是报"多步OLEDB操作产生错误",请问是怎么回事呢??
lyserver 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fighttodeath 的回复:]
回来了..呵呵..
请问如何向数据库中插入一条数据,然后我就能马上获得这条数据的ID呢?(这个ID是自增长的..)
[/Quote]
可以在存储过程里实现。
INSERT INTO 表名 (字段列表) VALUES (值列表)
//以记录集方式返回ID
SELECT MAX(ID) FROM 表名
//以RETURN参数形式返回ID
SELECT nID=MAX(ID) FROM 表名
RETURN nID
//定义一个OUTPUT类型的参数,以OUTPUT参数形式返回ID
SELECT outputID = MAX(ID) FROM 表名
lyserver 2010-02-02
  • 打赏
  • 举报
回复
使用Parameter对象或者VARIANT类型的SAFEARRAY。
marrco2005 2010-02-02
  • 打赏
  • 举报
回复


_CommandPtr spCommand;


spCommand.CreateInstance( __uuidof( Command ) );
spCommand->ActiveConnection = m_pConnection;
spCommand->CommandText = _bstr_t("spAddtbRepository");
spCommand->CommandType = adCmdStoredProc;

// 下面的代码是创建存储过程的参数
// 根据你的实际情况进行修改
_ParameterPtr spParam;
spParam = spCommand->CreateParameter( _bstr_t("@param1"), ADODB::adLongVarChar, ADODB::adParamInput, strProgramCode.GetLength() + 1);
BSTR bstr = strProgramCode.AllocSysString();
spParam->Value = _variant_t( bstr );
::SysFreeString(bstr);
spCommand->Parameters->Append( spParam );
//
_ParameterPtr spParam1;
spParam1 = spCommand->CreateParameter( _bstr_t("@param2"), ADODB::adLongVarChar, ADODB::adParamInput, strChnID.GetLength() + 1);
bstr = strChnID.AllocSysString();
spParam1->Value = _variant_t( bstr );
::SysFreeString(bstr);
spCommand->Parameters->Append( spParam1 );

// 执行存储过程
_RecordsetPtr pRet = spCommand->Execute( NULL, NULL, adCmdStoredProc );
青稞 2010-02-02
  • 打赏
  • 举报
回复
回来了..呵呵..
请问如何向数据库中插入一条数据,然后我就能马上获得这条数据的ID呢?(这个ID是自增长的..)
青稞 2010-02-02
  • 打赏
  • 举报
回复
_variant_t vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
_variant_t vtEmpty2(DISP_E_PARAMNOTFOUND, VT_ERROR);

m_pCommand->CommandText = _bstr_t("spAddtbRepository");
m_pCommand->CommandType = adCmdStoredProc;

_ParameterPtr pParaID;
pParaID = m_pCommand->CreateParameter( _bstr_t("@RepositoryID"), adNumeric, adParamOutput, sizeof(int));
pParaID->Value = _variant_t( treeNode->iID );
m_pCommand->Parameters->Append(pParaID);
//
_ParameterPtr pParaCategoryID;
pParaCategoryID = m_pCommand->CreateParameter( _bstr_t("@RepositoryCategoryID"), adNumeric, adParamInput, sizeof(int));
pParaCategoryID->Value = _variant_t(treeNode->iType);
m_pCommand->Parameters->Append(pParaCategoryID);

_ParameterPtr pParaFullText;
pParaFullText = m_pCommand->CreateParameter( _bstr_t("@FullText"), adLongVarWChar, adParamInput, 256);
pParaFullText->Value = _variant_t(treeNode->szContents);
m_pCommand->Parameters->Append(pParaFullText);

m_pRecordset= m_pCommand->Execute( &vtEmpty, &vtEmpty2, adCmdStoredProc );//运行到这里直接爆掉..
青稞 2010-02-02
  • 打赏
  • 举报
回复
执行这个后spAddtbRepository,怎么取得添加记录的ID呢?(这个ID是数据库自增长的)
其实spAddtbRepository主要是insert语句的,我想insert后,取得这条ID。
ls2141 2010-02-02
  • 打赏
  • 举报
回复
。。路过 学习
VC++视频笔记资料 一、MFC的概念和作用   1、什么是MFC?      全称:Microsoft Foundation Class Library(微软基础类库)      1-MFC从硬盘存在形式来说就是一个库(静态MFC库、动态MFC库)      2-MFC从原理来说还是一个程序框架   2、为什么使用MFC?      基于框架编程,提高工作效率,减少开发周期,降低开发成本。 二、几个重要的头文件   afx.h--包含了MFC中绝大部分类的声明   afxwin.h--包含了afx.h和windows.h   afxext.h--提供了对扩展类的支持,例如:工具栏、状态栏...   附:以Afx...开头的函数,可以确定为MFC库中的一个全局函数;     以::...开头的函数,可以确定为Win32的API函数; 三、MFC应用程序的分类   1、使用MFC库制作自己的控制台程序     相比Win32控制台程序:     多了一个全局对象 CWinApp theApp     入口函数不同于以往的入口函数   2、使用MFC库制作自己的静态库程序   3、使用MFC库制作自己的动态库程序     1--使用MFC库制作自己的规则动态库(静/动态MFC库)     2--使用MFC库制作自己的扩展动态库     区别:规则库可以被所有程序调用,扩展库只能被支持MFC的程序调用   4、使用MFC库制作自己的窗口程序     1--单文档视图构架程序       CFrameWnd-框架窗口类,封装了关于框架窗口的操作       CWinApp-应用程序类,封装了关于程序流程的操作       CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)       CView-视图窗口类,封装了关于视图窗口的操作(绘图)      2--多文档视图构架程序       CMDIChildWnd-子框架窗口类,封装了关于子框架窗口的操作       CMDIFrameWnd-主框架窗口类,封装了关于主框架窗口的操作       CWinApp-应用程序类,封装了关于程序流程的操作       CDocument-文档类,封装了关于数据的操作(提取、转换、存储...)       CView-视图窗口类,封装了关于视图窗口的操作(绘图)     3--对话框构架程序       CWinApp-应用程序类,封装了关于程序流程的操作       CDialog-对话框窗口类,封装了关于对话框窗口的操作
第1章 MFC概述 1 1.1 MFC是一个编程框架 1 1.1.1 封装 1 1.1.2 继承 2 1.1.3 虚拟函数和动态约束 2 1.1.4 MFC的宏观框架体系 2 1.2 MDI应用程序的构成 3 1.2.1 构成应用程序的对象 3 1.2.2 构成应用程序的对象之间的关系 5 1.2.3 构成应用程序的文件 5 第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口的销毁 19 2.3 设备描述表 20 2.3.1 设备描述表概述 20 2.3.2 设备描述表在MFC中的实现 22 2.3.3 MFC设备描述表类的使用 24 2.4 GDI对象 25 第3章 CObject类 28 3.1 CObject的结构 28 3.2 CObject类的特性 30 3.3 实现CObject特性的机制 32 3.3.1 DECLARE_DYNAMIC等宏的定义 32 3.3.2 CruntimeClass类的结构与功能 35 3.3.3 动态类信息、动态创建的原理 38 3.3.4 序列化的机制 39 第4章 消息映射的实现 42 4.1 Windows消息概述 42 4.1.1 消息的分类 42 4.1.2 消息结构和消息处理 42 4.2 消息映射的定义和实现 44 4.2.1 MFC处理的三类消息 44 4.2.2 MFC消息映射的实现方法 45 4.2.3 在声明与实现的内部 46 4.2.3.1 消息映射声明的解释 47 4.2.3.2 消息映射实现的解释 49 4.2.4 消息映射宏的种类 51 4.3 CcmdTarget类 54 4.4 MFC窗口过程 55 4.4.1 MFC窗口过程的指定 56 4.4.2 对Windows消息的接收和处理 58 4.4.2.1 从窗口过程到消息映射 59 4.4.2.2 Windows消息的查找和匹配 60 4.4.2.3 Windows消息处理函数的调用 62 4.4.2.4 消息映射机制完成虚拟函数功能的原理 63 4.4.3 对命令消息的接收和处理 64 4.4.3.1 MFC标准命令消息的发送 64 4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 72 4.4.4.2 WM_NOTIFY消息及其处理: 73 4.4.4.3 消息反射 74 4.4.5 对更新命令的接收和处理 77 4.4.5.1 实现方法 77 4.4.5.2 状态更新命令消息 78 4.4.5.3 类CCmdUI 79 4.4.5.4 自动更新用户接口对象状态的机制 80 4.5 消息的预处理 82 4.6 MFC消息映射的回顾 83 第5章 MFC对象的创建 85 5.1 MFC对象的关系 85 5.1.1 创建关系 85 5.1.2 交互作用关系 86 5.2 MFC提供的接口 87 5.2.1 虚拟函数接口 87 5.2.2 消息映射方法和标准命令消息 91 5.3 MFC对象的创建过程 94 5.3.1 应用程序中典型对象的结构 94 5.3.1.1 应用程序类的成员变量 95 5.3.1.2 CDocument的成员变量 97 5.3.1.3 文档模板的属性 97 5.3.2 WinMain入口函数 99 5.3.2.1 WinMain流程 99 5.3.2.2 MFC空闲处理 101 5.3.3 SDI应用程序的对象创建 102 5.3.3.1 文档模板的创建 102 5.3.3.2 文件的创建或者打开 103 5.3.3.3 SDI边框窗口的创建 112 5.3.3.4 视的创建 115 5.3.3.5 窗口初始化 116 5.3.3.6 视的初始化 120 5.3.3.7 激活边框窗口(处理WM_ACTIVE) 121 5.3.3.8 SDI流程的回顾 122 5.3.4 MDI程序的对象创建 123 5.3.4.1 有别于SDI的主窗口加载过程 124 5.3.4.2 MDI子窗口、视、文档的创建 125 5.3.4.3 MDI子窗口的初始化和窗口的激活 127 第6章 应用程序的退出 131 6.1 边框窗口对WM_CLOSE的处理 131 6.2 窗口的销毁过程 135 6.2.1 DestroyWindow 135 6.2.2 处理WM_DESTROY消息 136 6.2.3 处理WM_NCDESTROY消息 136 6.3 SDI窗口、MDI主、子窗口的关闭 137 第7章 MFC的DLL 139 7.1 DLL的背景知识 139 7.2 调用约定 141 7.2.1 MFC的DLL应用程序的类型 142 7.3 DLL的几点说明 143 7.4 输出函数的方法 145 第8章 MFC的进程和线程 148 8.1 Win32的进程和线程概念 148 8.2 Win32的进程处理简介 148 8.2.1 进程的创建 148 8.2.2 进程的终止 149 8.3 Win32的线程 150 8.3.1 线程的创建 150 8.3.2 线程的终止 150 8.3.3 线程局部存储 151 8.4 线程同步 152 8.4.1 同步对象 152 8.4.2 等待函数 153 8.5 MFC的线程处理 154 8.5.1 创建用户界面线程 155 8.5.2 创建工作者线程 155 8.5.3 AfxBeginThread 155 8.5.4 CreateThread和_AfxThreadEntry 157 8.5.5 线程的结束 160 8.5.6 实现线程的消息循环 161 第9章 MFC的状态 163 9.1 模块状态 163 9.2 模块、进程和线程状态的数据结构 164 9.2.1 层次关系 164 9.2.2 CNoTrackObject类 166 9.2.3 AFX_MODULE_STATE类 166 9.2.4 _AFX_BASE_MODULE_STATE 169 9.2.5 _AFX_THREAD_STATE 169 9.2.6 AFX_MODULE_THREAD_STATE 171 9.3 线程局部存储机制和状态的实现 172 9.3.1 CThreadSlotData和_afxThreadData 173 9.3.1.1 CThreadSlotData的定义 173 9.3.1.2 CThreadSlotData的一些数据成员 174 9.3.1.3 _afxThreadData 175 9.3.2 线程状态_afxThreadState 176 9.3.3 进程模块状态afxBaseModuleState 178 9.3.4 状态对象的创建 180 9.3.4.1 状态对象的创建过程 180 9.3.4.2 创建过程所涉及的几个重要函数的算法 183 9.4 管理状态 184 9.4.1 模块状态切换 184 9.4.2 扩展DLL的模块状态 186 9.4.2.1 _AFX_EXTENSION_MODULE 187 9.4.2.2 扩展DLL的初始化函数 188 9.4.3 核心MFC DLL 190 9.4.4 动态链接的规则DLL的模块状态的实现 190 9.5 状态信息的作用 192 9.5.1.1 模块信息的保存和管理 192 9.5.2 MFC资源、运行类信息的查找 193 9.5.3 模块信息的显示 194 9.5.4 模块-线程状态的作用 196 9.5.4.1 只能访问本线程MFC对象的原因 196 9.5.4.2 实现MFC对象和Windows对象之间的映射 196 9.5.4.3 临时对象的处理 199 9.6 状态对象的删除和销毁 199 第10章 内存分配方式和调试机制 202 10.1 M内存分配 202 10.1.1 内存分配函数 202 10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC的文件类 210 11.2.1 CFile的结构 211 11.2.1.1 CFile定义的枚举类型 211 11.2.1.2 CFile的其他一些成员变量 212 11.2.1.3 CFile的成员函数 212 11.2.2 CFile的部分实现 213 11.2.3 CFile的派生类 215 第12章 对话框和对话框类CDialog 217 12.1 模式和无模式对话框 217 12.1.1 模式对话框 217 12.1.2 无模式对话框 218 12.2 对话框的MFC实现 219 12.2.1 CDialog的设计和实现 219 12.2.1.1 CDialog的成员变量 219 12.2.1.2 CDialog的成员函数: 219 12.2.2 MFC模式对话框的实现 220 12.2.2.1 MFC对话框过程 220 12.2.2.2 模式对话框窗口过程 221 12.2.2.3 使用原对话框窗口过程作消息的缺省处理 225 12.2.2.4 Dialog命令消息和控制通知消息的处理 226 12.2.2.5 消息预处理和Dialog消息 228 12.2.2.6 模式对话框的消息循环 229 12.2.3 对话框的数据交换 233 12.2.3.1 数据交换的方法 233 12.2.3.2 CDataExchange 234 12.2.3.3 数据交换和验证函数 236 12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 MFC工具条和状态栏 248 13.1 Windows控制窗口 248 13.2 MFC的工具条和状态栏类 249 13.2.1 控制窗口的创建 251 13.2.1.1 PreCreateWindow 251 13.2.1.2 控制条的窗口创建 253 13.2.2 控制条的销毁 259 13.2.3 处理控制条的位置 259 13.2.3.1 计算控制条位置的过程和算法 259 13.2.3.2 CFrameWnd的虚拟函数RecalcLayout 260 13.2.3.3 CWnd的成员函数RepositionBars 262 13.2.4 工具条、状态栏和边框窗口的接口 265 13.2.4.1 应用程序在状态栏中显示信息 265 13.2.4.2 状态栏显示菜单项的提示信息 268 13.2.4.3 控制条的消息分发处理 270 13.2.4.4 Tooltip 275 13.2.4.5 禁止和允许 279 13.2.4.6 显示或者隐藏工具栏和状态栏 285 13.2.5 泊位和漂浮 286 第14章 SOCKET类的设计和实现 288 14.1 WinSock基本知识 288 14.1.1 WinSock API 288 14.1.2 Socket的使用 290 14.2 MFC对WinSockt API的封装 291 14.2.1 CAsyncSocket 291 14.2.2 socket对象的创建和捆绑 292 14.2.3 异步网络事件的处理 296 14.3 CSocket 297 14.4 CSocketFile 299

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧