在不同计算机上建立客户端应用程序和服务器应用程序之间的对话类似于在同一台计算机上的客户端和服务器之间建立对话。区别在于客户端指定计算机和DDE共享,而不是应用程序和主题。
第一步是让服务器通过调用DdeInitialize函数向DDEML注册。此调用需要指向应用程序定义的DDE回调函数DdeCallback的指针。服务器还通过调用DdeNameService功能注册DDE服务器支持的服务名称。
DWORD g_idInst;
BOOL MyDdeShareInit( LPTSTR lpszServer, PFNCALLBACK DdeCallback )
{
HSZ hszService;
char ServerBuf[MAX_COMPUTERNAME_LENGTH+8];
//注册服务器应用程序。
if(DdeInitialize(
& g_idInst,
(PFNCALLBACK)DdeCallback,
APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS |
CBF_FAIL_REQUESTS | CBF_FAIL_EXECUTES,
0L
) != DMLERR_NO_ERROR )
return FALSE;
//检查是否指定“\\\\ server”或只是“server”。
if( lpszServer[0] == '\\' )
wsprintf( ServerBuf, "%s\\NDDE$", lpszServer );
else wsprintf( ServerBuf, "\\\\%s\\NDDE$", lpszServer );
//注册服务名称。
hszService = DdeCreateStringHandle( g_idInst, ServerBuf, 0 );
DdeNameService(
g_idInst,
hszService,
0,
DNS_REGISTER
);
DdeFreeStringHandle( g_idInst, hszService );
return TRUE;
}
以下示例显示如何调用MyConnect函数来初始化计算机ServerA上的服务器应用程序的DDEML:
//应用程序提供的回调函数。
HDDEDATA回调DdeCallback(ITYPE UINT,UINT IFMT,HCONV hConv,
HSZ hsz1,hsz2 HSZ,HDDEDATA HDAT,dwData1 DWORD,DWORD dwData2)
{
开关(键入)tl
{
case XTYP_CONNECT:
//验证连接主题。
...
return (HDDEDATA) TRUE;
...
默认:
return (HDDEDATA) 0;
}
}
MyDdeShareInit( "ServerA", DdeCallback );
与任何DDE对话一样,客户端和服务器应用程序必须合作建立对话。对于网络DDE,客户端必须具有计算机名称和共享名称。然后,客户端使用DdeConnect功能建立网络DDE对话。
HCONV g_hConv;
BOOL MyConnect( LPSTR lpszServer, LPTSTR lpszTopic )
{
HSZ hszServer, hszTopic;
char ServerBuf[MAX_COMPUTERNAME_LENGTH+8];
//注册客户端应用程序。
if(DdeInitialize(
& g_idInst,
(PFNCALLBACK)DdeCallback,
APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS |
CBF_FAIL_REQUESTS | CBF_FAIL_EXECUTES,
0L
) != DMLERR_NO_ERROR )
return FALSE;
//检查是否指定“\\\\ server”或只是“server”。
if( lpszServer[0] == '\\' )
wsprintf( ServerBuf, "%s\\NDDE$", lpszServer );
else wsprintf( ServerBuf, "\\\\%s\\NDDE$", lpszServer );
hszServer = DdeCreateStringHandle(g_idInst, ServerBuf, 0);
hszTopic = DdeCreateStringHandle(g_idInst, lpszTopic, 0);
if( (g_hConv = DdeConnect(g_idInst,
hszServer,
hszTopic,
NULL )
) == 0 )
return FALSE;
DdeFreeStringHandle( g_idInst, hszServer );
DdeFreeStringHandle( g_idInst, hszTopic );
return TRUE;
}
以下示例显示如何调用此函数连接到计算机ServerA上的DDE共享MyDdeShare $:
//应用程序提供的回调函数。
HDDEDATA回调DdeCallback(ITYPE UINT,UINT IFMT,HCONV hConv,
HSZ hsz1,hsz2 HSZ,HDDEDATA HDAT,dwData1 DWORD,DWORD dwData2)
{
开关(键入)tl
{
...
默认:
return (HDDEDATA) 0;
}
}
MyConnect( "ServerA", "MyDdeShare$" );