Выполнение команды
Помимо передачи данных возможно такое взаимодействие между клиентом и сервером, когда клиент передает серверу команды в виде текстовой строки, а сервер их исполняет. Вообще говоря, этот механизм можно реализовать с помощью рассмотренных нами ранее транзакций XTYP_POKE и XTYP_REQUEST, однако существует специально предназначенная для передачи команд транзакция XTYP_EXECUTE. Вот соответствующие параметры, передаваемые функции обратного вызова:
Параметр | Значение |
hsz1 | Идентификатор строки, содержащей имя раздела |
hsz2 | Идентификатор строки, содержащей имя сервиса |
Процесс передачи команды очень напоминает процесс передачи данных серверу через транзакцию XTYP_POKE.
Вначале необходимо при помощи функции DdeCreateDataHandle создать блок памяти, содержащей текстовую строку команды. Отличие заключается в том, что параметр hszItem должен быть указан как NULL:
hData = DdeCreateDataHandle (idInst, szCmdString, lstrlen(szCmdString) + 1, 0L, NULL, wFmt, 0);
Затем с помощью функции DdeClientTransaction серверу посылается транзакция XTYP_EXECUTE:
if(hData != NULL) hData = DdeClientTransaction((LPBYTE)hData, -1, hConv, hszItem, wFmt, XTYP_EXECUTE, 1000, &dwResult);
Для того чтобы получить доступ к командной строке, обработчик транзакции XTYP_EXECUTE, расположенный в функции обратного вызова сервера, должен использовать функцию DdeAccessData:
BYTE FAR* WINAPI DdeAccessData( HDDEDATA hData, // идентификатор блока памяти DWORD FAR* pcbDataSize); // указатель на переменную, // в которую будет записан размер блока памяти
Эта функция возвращает указатель на начало области памяти, содержащей команду.
После успешного выполнения команды функция обратного вызова сервера должна вернуть значение DDE_FACK. Если команда не поддерживается, нужно вернуть значение DDE_FNOTPROCESSED. В том случае, когда сервер может выполнить команду позже (потому что занят, например, выполнением другой команды), функция обратного вызова должна вернуть значение DDE_FBUSY.
Клиент может проверить результат выполнения передачи команды, если проанализирует содержимое двойного слова, на которое указывал параметр lpdwResult перед вызовом функции DdeClientTransaction. Например, если в этом слове установлен бит DDE_FBUSY, можно попробовать повторить посылку команды позже.