1.定义全局变量 test9View.cpp
添加两个按钮,然后处理事件
2.
3.
4.在void CTest9View::Oninit() 函数的上面添加回调函数
#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);
}