}

return ( hddedata )dde_fack;

}

return 0;

}

本例中dde回调函数要处理的dde项目不止一个,任意一个dde项目的值发生变化时,回调函数都会被自动调用一次,具体实现时只需要用if语句对hsz1和hsz2进行逐一比较即可处理所有的项目。缓冲区ptele1101用于存储通过以太网发送到板型仪的数据,下文中将详细介绍。

上面介绍的方法用于从dde服务器中获取mb+网上的数据,那么如何将数据写入到mb+网呢,同样还是使用ddeml库中提供的方法,具体如下:

ddepoke(idinst,hconv4,szwidth,text(“1020”));

//写数据到mb+,设置宽度为1020mm

ddepoke为自定义函数,具体实现为:

void ddepoke(dword idinst, hconv hconv, tchar* szitem, tchar*

szdata)

{

hsz hszitem=ddecreatestringhandlew(idinst,szitem,cp_winunicode);

ddeclienttransaction((lpbyte)unicodetoansi(szdata),(dword)(lstrlenw(szdata)+1),hconv,

hszitem,cf_text,xtyp_poke,3000,null);

ddefreestringhandle(idinst,hszitem);

}

(3) 与以太网交换数据,这里使用的是socket协议。前面提到了缓冲区ptele1101,这里存储的是要传送到板型仪的数据。这是一个结构指针,定义如下:

typedef struct

{

teleheader msgheader; //消息头

tele1101block1 msgblock1; //消息第一部分

tele1101block2 msgblock2; //消息第二部分

tele1101block3 msgblock3; //消息第三部分

} tele1101, *ptele1101;

ptele1101 ptele1101;

这其中teleheader、tele1101block1、tele1101block2和tele1101block3也分别是一个结构,这里就不详述了。

本实例中使用另外一个线程来处理以太网的数据交换,这样不会中断处理dde数据的过程。

dword dwthreadid;

thread=createthread(null,0,(lpthread_start_routine )

sockthread,null,0,&dwthreadid);

sockthread为线程的过程函数,具体实现如下:

void sockthread()

{

int i=0;

tchar buf[256];

initwinsock();//初始化socket

//创建并设置协议类型,地址和端口

socket socksrv=socket(af_inet,sock_stream,0);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr=htonl(inaddr_any);

addrsrv.sin_family=af_inet;

addrsrv.sin_port=htons(5001);

//绑定并监听端口

bind(socksrv,(sockaddr*)&addrsrv,sizeof(sockaddr));

listen(socksrv,5);

sockaddr_in addrclient;

int len=sizeof(sockaddr);

while (1) //程序正常运行时,始终接收连接请求

{

sockconn=accept(socksrv,(sockaddr*)&addrclient,&len);

zeromemory(buf,sizeof(buf));

__try

{

while (1) //连接建立后每50秒交换一次数据