view中使用dde

1.定义全局变量 test9View.cpp
#include <DDEML.H>
#define  NITEM 2 //item 数量

const char szApp[]="view";
const char szTopic[]="tagname";
const char *pszItem[NITEM]={"test2","test3"};

int count=0;

HCONV hConv=0;//会话句柄
HWND hWnd;//窗口句柄
DWORD idInst=0;//ddeml实例句柄
HANDLE hInst;//实例句柄

HSZ hszApp=0;//server 服务字符串句柄
HSZ hszTopic=0;//server目录字符串句柄
HSZ hszItem[NITEM];//server item字符串句柄

BOOL bConnect;//建立连接标志

添加两个按钮,然后处理事件

2.
void CTest9View::Oninit() 
{
	// TODO: Add your command handler code here
	
	hWnd=m_hWnd;
	if (DdeInitialize(&idInst,//ddeml实例句柄,用于之后的DdeCreateStringHandle函数的参数
		(PFNCALLBACK)DdeCallBack,
		APPCMD_FILTERINITS|
		CBF_FAIL_EXECUTES|
		CBF_FAIL_SELFCONNECTIONS|
		CBF_SKIP_CONNECT_CONFIRMS|
		CBF_FAIL_POKES,
		0))
	{
		MessageBox("dde server init failed");
	//	return(FALSE);
	}
	
	hInst=AfxGetApp()->m_hInstance;
	hszApp=DdeCreateStringHandle(idInst,szApp,0);//创建server目录字符串句柄
	hszTopic=DdeCreateStringHandle(idInst,szTopic,0);//创建server 服务字符串句柄
	for (int i=0;i<NITEM;i++)
	{
		hszItem[i]=DdeCreateStringHandle(idInst,pszItem[i],0);//创建server item字符串句柄
	}
	
	//hszItem[0]---pszItem[0]----test2
	//hszItem[1]---pszItem[1]----test3
	
	
bConnect=FALSE;
}

3.
void CTest9View::Onconnect() 
{
	// TODO: Add your command handler code here
	if (!bConnect)//如果未连接,则建立连接
	{
		hConv=DdeConnect(idInst,hszApp,hszTopic,NULL);//连接dde
		if (hConv)
		{DWORD dwResult;
		bConnect=TRUE;
		for (int i=0;i<NITEM;i++)
		{
			DdeClientTransaction(NULL,0,hConv,hszItem[i],CF_TEXT,
				XTYP_ADVSTART,TIMEOUT_ASYNC,&dwResult);		
			//为每个数据项hszItem[i] 生成热连接型会话
			//当数据项发生变化时,服务器程序会立即将变化后的数据发送给客户程序。
			//hConv :会话句柄
			//hszItem[i] :server item字符串句柄
		}
		}
	}
}

4.在void CTest9View::Oninit() 函数的上面添加回调函数
//因为是建立的热连接,所以当数据项发生变化时,服务器程序会立即将变化后的数据发送给客户程序,此时操作系统自动调用这个函数DdeCallBack
//此时从DdeCallBack函数里面取得数据即可
HDDEDATA CALLBACK DdeCallBack(
							  UINT wType,UINT wFmt,HCONV hConv,HSZ Topic,HSZ item,
							  HDDEDATA hData,DWORD IData1,DWORD IData2)
{
	//HCONV hConv,server 服务字符串句柄
	//HSZ Topic,server目录字符串句柄
	//HSZ item,server item字符串句柄
	//HDDEDATA hData,对应于item的内容
	
	int i;
	char tmp[255];
	switch (wType)
	{
	case XTYP_ADVSTART:
	case XTYP_CONNECT: 
		return((HDDEDATA)TRUE);
	case XTYP_ADVDATA:
		for (i=0;i<NITEM;i++)//有NITEM个数据项
		{	
			if (item==hszItem[i])
				//从参数item取得server item字符串句柄
			{
				DdeGetData(hData,(PBYTE)tmp,255,0);
				//从参数hdata取得数据到tmp
				switch(i)
				{
				case 0:
				//	SetDlgItemText(hWnd,IDC_STATIC2,tmp);
					TRACE("case 0:%s",tmp);
					break;
				case 1:
				//	SetDlgItemText(hWnd,IDC_STATIC3,tmp);
					TRACE("case 1:%s",tmp);
					break;
				}
			}
		}
	}
	return(0);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值