DDE热连接OnAdvise

#include "stdafx.h"
#include "windows.h"
#include "ddeml.h"
#include "stdio.h"
 
#define NITEM 9							//定义ITEM的数量;
const char *pszItem[NITEM]={"Item1","Item2","Item3","Item4","Item5","Item6","Item7","Item8","Item9"};	//SERVER ITEM名称字符串数组;
DWORD idInst=0;
HSZ hszApp, hszTopic;
char szApp[] = "myapp";
char szTopic[] = "mytopic";
char szItem1[] = "R1C1";  char szDesc1[] = "A1 Contains: ";
char szItem2[] = "R2C1";  char szDesc2[] = "A2 Contains: ";
char szItem3[] = "R333";  char szDesc3[] = "R333 Contains: ";
 
HSZ hszItem[NITEM];								//Server ITEM字符串句柄;
 
HDDEDATA CALLBACK DdeCallback(UINT wType,UINT wFmt,HCONV hConv,HSZ Topic,HSZ Item,
	HDDEDATA hData,DWORD lData1,DWORD lData2)
{
	char tmp[255];
 
	if(wType==XTYP_ADVDATA && wFmt==CF_TEXT)
	{
		for(int I=0;I<NITEM;I++)
			if(Item==hszItem[I])
			{				 
				DdeGetData(hData,(PBYTE)tmp,255,0);//取得数据;			
				printf("%s - %s\n", pszItem[I],tmp);	
				break;
			}
	}
	return(0);
 
}
 
void DDEExecute(DWORD idInst, HCONV hConv, char* szCommand)
{
	HDDEDATA hData = DdeCreateDataHandle(idInst, (LPBYTE)szCommand,lstrlen(szCommand)+1, 0, NULL, CF_TEXT, 0);
	if (hData==NULL)   {
		printf("Command failed: %s\n", szCommand);
	}
	else    {
		DdeClientTransaction((LPBYTE)hData, 0xFFFFFFFF, hConv, 0L, 0,XTYP_EXECUTE, TIMEOUT_ASYNC, NULL);
	}
}
 
void DDERequest(DWORD idInst, HCONV hConv, char* szItem, char* sDesc)  
{  
	HSZ hszItem = DdeCreateStringHandle(idInst, szItem, 0);  
	HDDEDATA hData = DdeClientTransaction(NULL,0,hConv,hszItem,CF_TEXT,XTYP_REQUEST,5000 , NULL);  
	if (hData==NULL)  
	{  
		printf("Request failed: %s\n", szItem);  
	}  
	else  
	{  
		char szResult[255];  
		DdeGetData(hData, (unsigned char *)szResult, 255, 0);  
		printf("%s=%s\n", sDesc, szResult);  
	}  
 
	//改进,增加的两行  
	DdeFreeStringHandle(idInst,hszItem);  
	DdeFreeDataHandle(hData); //关键  
}  
 
void DDEPoke(DWORD idInst, HCONV hConv, char* szItem, char* szData)
{
	HSZ hszItem = DdeCreateStringHandle(idInst, szItem, 0);
	DdeClientTransaction((LPBYTE)szData, (DWORD)(lstrlen(szData)+1),hConv, hszItem, CF_TEXT,XTYP_POKE, 3000, NULL);
	DdeFreeStringHandle(idInst, hszItem);
}
 
int main(int argc, char* argv[])
{
 
	char szCmd1[] = "mycommand";
 
	char szItem3[] = "R3C1";  char szData3[] = "Data from DDE Client";
	char szCmd2[] = "mycommand2";
 
	//DDE Initialization
 
	UINT iReturn;
	iReturn = DdeInitialize(&idInst, (PFNCALLBACK)DdeCallback, APPCLASS_STANDARD | APPCMD_CLIENTONLY, 0 );
	if (iReturn!=DMLERR_NO_ERROR)
	{
		printf("DDE Initialization Failed: 0x%04x\n", iReturn);
		Sleep(1500);
		return 0;
	}
 
	//Start DDE Server and wait for it to become idle.
	/*HINSTANCE hRet = ShellExecute(0, "open", szTopic, 0, 0, SW_SHOWNORMAL);
	if ((int)hRet < 33)
	{
	printf("Unable to Start DDE Server: 0x%04x\n", hRet);
	Sleep(1500); DdeUninitialize(idInst);
	return 0;
	}
	Sleep(1000);
	*/
	//DDE Connect to Server using given AppName and topic.
 
	HCONV hConv;
	hszApp = DdeCreateStringHandle(idInst, szApp, 0);
	hszTopic = DdeCreateStringHandle(idInst, szTopic, 0);
	hConv = DdeConnect(idInst, hszApp, hszTopic, NULL);
	DdeFreeStringHandle(idInst, hszApp);
	DdeFreeStringHandle(idInst, hszTopic);
	if (hConv == NULL)
	{
		printf("DDE Connection Failed.\n");
		Sleep(1500); DdeUninitialize(idInst);
		return 0;
	}
 
	for(int I=0;I<NITEM;I++)
		hszItem[I]=DdeCreateStringHandle(idInst,pszItem[I],0);
 
	//Execute commands/requests specific to the DDE Server.
	//DDEExecute(idInst, hConv, szCmd1);
	DDERequest(idInst, hConv, szItem1, szDesc1); 
	DDERequest(idInst, hConv, szItem2, szDesc2);
	char *item="dddd";
	char *itemDesc="你好";
	DDERequest(idInst, hConv, item, itemDesc); 
	DDEPoke(idInst, hConv, szItem3, szData3);
	DDEExecute(idInst, hConv, szCmd2);
 
	for(int I=0;I<NITEM;I++)
		DdeClientTransaction(NULL,0,hConv,hszItem[I],CF_TEXT,XTYP_ADVSTART,
		TIMEOUT_ASYNC,NULL);
 
 
	BOOL bRet;
	MSG msg;
 
	while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
	{
		if (bRet == -1)
		{
			// handle the error and possibly exit
		}
		else
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
 
	//DDE Disconnect and Uninitialize.
	DdeDisconnect(hConv);
	DdeUninitialize(idInst);
 
	Sleep(3000);
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值