На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Establishing a Network DDE Conversation



Establishing a conversation between a client application and a server application on different computers is similar to establishing a conversation between a client and server on the same computer. The difference is that the client specifies a computer and a DDE share, rather than an application and a topic.

The first step is for the server to register with the DDEML by calling the DdeInitialize function. This call requires a pointer to the application-defined DDE callback function DdeCallback. The server also registers the service name that the DDE server supports by calling the DdeNameService function.

DWORD g_idInst;

BOOL MyDdeShareInit( LPTSTR lpszServer, PFNCALLBACK DdeCallback )
{
HSZ hszService;
char ServerBuf[MAX_COMPUTERNAME_LENGTH+8];

// Register the server application.
if( DdeInitialize(
&g_idInst,
(PFNCALLBACK) DdeCallback,
APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS |
CBF_FAIL_REQUESTS | CBF_FAIL_EXECUTES,
0L
) != DMLERR_NO_ERROR )
return FALSE;

// Check if "\\server" or just "server" is specified.

if( lpszServer[0] == '\\' )
wsprintf( ServerBuf, "%s\\NDDE$", lpszServer );
else wsprintf( ServerBuf, "\\\\%s\\NDDE$", lpszServer );

// Register the service names.
hszService = DdeCreateStringHandle( g_idInst, ServerBuf, 0 );
DdeNameService(
g_idInst,
hszService,
0,
DNS_REGISTER
);

DdeFreeStringHandle( g_idInst, hszService );
return TRUE;
}


The following example shows how you could call the MyConnect function to initialize DDEML for the server application on computer ServerA:

// Application-supplied callback function.
HDDEDATA CALLBACK DdeCallback( UINT iType, UINT iFmt, HCONV hConv,
HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2 )
{
switch( iType )
{
case XTYP_CONNECT:
// Validate topic for connection.
...
return (HDDEDATA) TRUE;
...
default:
return (HDDEDATA) 0;
}
}

MyDdeShareInit( "ServerA", DdeCallback );


As with any DDE conversation, the client and server applications must cooperate to establish a conversation. For network DDE, the client must have the computer name and the share name. The client then uses the DdeConnect function to establish a network DDE conversation.

HCONV g_hConv;

BOOL MyConnect( LPSTR lpszServer, LPTSTR lpszTopic )
{
HSZ hszServer, hszTopic;
char ServerBuf[MAX_COMPUTERNAME_LENGTH+8];

// Register the client application.
if( DdeInitialize(
&g_idInst,
(PFNCALLBACK) DdeCallback,
APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS |
CBF_FAIL_REQUESTS | CBF_FAIL_EXECUTES,
0L
) != DMLERR_NO_ERROR )
return FALSE;

// Check if "\\server" or just "server" is specified.

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;
}


The following example shows how you could call this function to connect to the DDE share MyDdeShare$ on computer ServerA:

// Application-supplied callback function.
HDDEDATA CALLBACK DdeCallback( UINT iType, UINT iFmt, HCONV hConv,
HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2 )
{
switch( iType )
{
...
default:
return (HDDEDATA) 0;
}
}

MyConnect( "ServerA", "MyDdeShare$" );



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Устанавливающий Сетевой Разговор DDE



Устанавливающий разговор между приложением клиента и приложение сервера в других компьютерах подобное устанавливать разговора между клиентом и сервером в том же компьютере. Различие - в том, что клиент определяет компьютер и акция DDE, а не приложение и тема.

Первый шаг - для сервера регистрироваться с DDEML вызывая функцию DdeInitialize. Этот вызов требует указатель в определенную прикладную функцию возврата DDE DdeCallback. Сервер также регистрирует имя услуги, что сервер DDE поддерживает вызывая функцию DdeNameService.

DWORD g_idInst;

BOOL MyDdeShareInit( LPTSTR lpszServer, PFNCALLBACK DdeCallback )
{
HSZ hszService;
символ ServerBuf[MAX_COMPUTERNAME_LENGTH+8];

// Зарегистрируйте приложение сервера.
если( DdeInitialize( &g_idInst, (PFNCALLBACK) DdeCallback, APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS | CBF_FAIL_REQUESTS | CBF_FAIL_EXECUTES, 0L
) != DMLERR_NO_ERROR ) обратная ЛОЖЬ;

// Чек если "\\сервера" или просто "сервер" определен.

если( lpszServer[0] == '\\' ) wsprintf( ServerBuf, "%s\\NDDE$", lpszServer );
еще wsprintf( ServerBuf, "\\\\%s\\NDDE$", lpszServer );

// Зарегистрируйте имена услуги.
hszService = DdeCreateStringHandle( g_idInst, ServerBuf, 0 );
DdeNameService( g_idInst, hszService,
0,
DNS_REGISTER
);

DdeFreeStringHandle( g_idInst, hszService );
возвращайтесь ВЕРНО;
}


Следующий пример показывает как Вы могли бы назвать функцию MyConnect, чтобы инициализировать DDEML для приложения сервера в компьютере ServerA:

// Функция возврата поставленного Приложения.
HDDEDATA CALLBACK DdeCallback( UINT iType, UINT iFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2 )
{
ключ( iType )
{
случай XTYP_CONNECT:
// Подтвердите тему для связи.
...
возврат ИСТИНЫ (HDDEDATA);
...
по умолчанию:
возврат (HDDEDATA) 0;
}
}

MyDdeShareInit( "ServerA", DdeCallback );


Как и любой разговор DDE, клиент и приложения сервера должны сотрудничать, чтобы устанавливать разговор. Для сети DDE, клиент должен иметь компьютерное имя и акционерное имя. Клиент затем использует функцию DdeConnect, чтобы устанавливать сетевой разговор DDE.

HCONV g_hConv;

BOOL MyConnect( LPSTR lpszServer, LPTSTR lpszTopic )
{
HSZ hszServer, hszTopic;
символ ServerBuf[MAX_COMPUTERNAME_LENGTH+8];

// Зарегистрируйте приложение клиента.
если( DdeInitialize( &g_idInst, (PFNCALLBACK) DdeCallback, APPCLASS_STANDARD | CBF_FAIL_SELFCONNECTIONS | CBF_FAIL_REQUESTS | CBF_FAIL_EXECUTES, 0L
) != DMLERR_NO_ERROR ) обратная ЛОЖЬ;

// Чек если "\\сервера" или просто "сервер" определен.

если( lpszServer[0] == '\\' ) wsprintf( ServerBuf, "%s\\NDDE$", lpszServer );
еще wsprintf( ServerBuf, "\\\\%s\\NDDE$", lpszServer );

hszServer = DdeCreateStringHandle(g_idInst, ServerBuf, 0);
hszTopic = DdeCreateStringHandle(g_idInst, lpszTopic, 0);

если( (g_hConv = DdeConnect(g_idInst, hszServer, hszTopic, НЕДЕЙСТВИТЕЛЬНЫЙ )
) == 0 )
обратная ЛОЖЬ;

DdeFreeStringHandle( g_idInst, hszServer );
DdeFreeStringHandle( g_idInst, hszTopic );

возвращайтесь ВЕРНО;
}


Следующий пример показывает как Вы могли бы назвать эту функцию, чтобы подключать к акции DDE MyDdeShare$ в компьютере ServerA:

// Функция возврата поставленного Приложения.
HDDEDATA CALLBACK DdeCallback( UINT iType, UINT iFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2 )
{
ключ( iType )
{
...
по умолчанию:
возврат (HDDEDATA) 0;
}
}

MyConnect( "ServerA", "MyDdeShare$" );



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz