频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

应用MFC开发高级应用程序

来源:pcvc.net 作者:苟建兵 出处:巧巧读书 2007-09-28 进入讨论组
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 下一页 

  2、在MFC中使用DDEML

  对于典型的MFC应用程序,主框架窗口类(CMainFrame)只有一个实例,因此可以使用静态成员函数作为回调函数,从而实现DDE机制。具体的代码片段如下:

  (1) 在CMainFrame类中声明如下静态成员:

static CMainFrame* pThis;
static DWORD idInst;
static HDDEDATA CALLBACK EXPORT DdeCallback(UINT,UINT,HCONV,HSZ,HSZ, HDDEDATA,DWORD,DWORD);

  (2) 在类的创建代码(OnCreate())中作如下说明:

pThis=this;
lpDdeCallback=MakeProcInstance((FARPROC)DdeCallback,hInstance);
if(DdeInitialize(&idInst,(PFNCALLBACK)lpDdeCallback,CBF_FAIL_EXECUTES | CBF_SKIP_REGISTRATIONS|CBF_SKIP_UNREGISTRATIONS,0L))
{
 AfxMessageBox("不能初始化DDE服务","错误");
 DestroyWindow();
}

  (3) 回调函数实现如下:

HDDEDATA FAR PASCAL _export CMainFrame::DdeCallback(UINT iType,UINT iFmt, HCONV hConv,HSZ hsz1,HSZ hsz2,HDDEDATA hData,DWORD dwData1,DWORD dwData2)
{
char szBuffer[16];
int i;

switch(iType)
{
 case XTYP_CONNECT: //hsz1=topiv, hsz2=service
  return (HDDEDATA)TRUE;//TRUE;
 case XTYP_ADVSTART: //hsz1=topic, hsz2=item
 case XTYP_REQUEST:
 case XTYP_ADVREQ:
 case XTYP_POKE: //hsz1=Topic, hsz2=item, hData=data
 case XTYP_ADVSTOP:
 return NULL;
}
}

  3、避免变量类型冲突

  如果在MFC应用直接使用DDEML服务,那么该MFC应用在编译时将会遇到变量类型HSZ重复定义错误。经过追踪发现,错误在于在DDEML.H对HSZ作了如下定义:

  DECLARE_HANDLE32(HSZ);

  而在AFXEXT.H(通过stdafx.h引入)中对HSZ又作了如下说明:

  typedef BPSTR FAR* HSZ; // Long handle to a string
  
  两个定义一个为32位整数,一个为BASIC字符串指针,当然会发生编译器不能作变量类型转换的错误。实际上,将HSZ声明为BASIC字符串指针主要用于在MFC应用中使用VBX控制。要改正这一错误,就必须保证不要在同一个代码模块中使用DDEML和VBX支持,通过将使用DDEML和VBX的代码分开,并在使用DDEML代码的模块中最开头定义如下编译器宏就可以解决上述问题:

  #define NO_VBX_SUPPORT通告:http://www.qqread.com/vc/d199731.html 更多文章 更多内容请看Wlan组网----家庭专题专题,或进入讨论组讨论。
上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章