RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : OS/2-DDE-WINOS/2


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : Igor Vashkevich
To : Dmitry Ban
Subj : OS/2-DDE-WINOS/2

> Приведи код, как ты это делаешь.

Привожу:
typedef struct {
HWND hwnd; char App[31], Topic[31]; PID pid; TID tid;
} ServerT;
MRESULT EXPENTRY MainDlg(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
PSZ szData, szApp = "ICOMWDRV", szTopic = "System";
static USHORT i;
CONVCONTEXT context; PDDEINIT pDDEinit; PDDESTRUCT pDDEdata;
static char S[255];
static USHORT nServer; static ServerT Server[100];

ULONG mem;

switch (msg) {
case WM_INITDLG : {
WinSendDlgItemMsg(hwnd, List, LM_DELETEALL, 0, 0);
nServer = 0;
return 0;
}
case WM_DDE_INITIATEACK : { char S[255];
pDDEinit = (PDDEINIT)mp2;
strncpy(Server[nServer].App, pDDEinit->pszAppName, 30);
strncpy(Server[nServer].Topic, pDDEinit->pszTopic, 30);
Server[nServer].App[30] = Server[nServer].Topic[30] = 0;
Server[nServer].hwnd = (HWND)mp1;
WinQueryWindowProcess(Server[nServer].hwnd, &Server[nServer].pid,
&Server[nServer].tid);
sprintf(S, "%s %s %0X %0X.%0X",
Server[nServer].App, Server[nServer].Topic,
Server[nServer].hwnd, Server[nServer].pid,
Server[nServer].tid);
ShowMessage(hwnd, S);
nServer++;
break;
}

case WM_DDE_DATA : {
ShowMessage(hwnd, "data in");
pDDEdata = (PDDESTRUCT)mp2;
DosGetSharedMem(pDDEdata, PAG_READ | PAG_WRITE);
szData = (BYTE *)(pDDEdata+(pDDEdata->offabData));
ShowMessage(hwnd, szData);
break;
}

case WM_DDE_ACK : {
pDDEdata = (PDDESTRUCT)mp2;
for (i = 0; i < nServer; i++) if (Server[i].hwnd == (HWND)mp1) break;
if (i < nServer) {
sprintf(S, "%s %s DDE_ACK %0X",
Server[i].App, Server[i].Topic, pDDEdata->fsStatus);
ShowMessage(hwnd, S);
} else ShowMessage(hwnd, "DDE_ACK from unknown server");
break;
}

case WM_SYSCOMMAND : {
switch (SHORT1FROMMP(mp1)) {
case IDM_INITIATE : {
WinSendMsg(hwnd, WM_SYSCOMMAND, MPFROM2SHORT(IDM_CLOSE, 0), 0);
ShowMessage(hwnd, "Initialisation...");
context.cb = sizeof(CONVCONTEXT);
context.fsContext = 0;
WinDdeInitiate(hwnd, szApp, szTopic, &context);
ShowMessage(hwnd, "Initialisation complete.");
break;
}
case IDM_CLOSE : {static USHORT i;
ShowMessage(hwnd, "Closing");
for (i = 0; i < nServer; i++)
WinDdePostMsg(Server[i].hwnd, hwnd, WM_DDE_TERMINATE, NULL,
DDEPM_RETRY);
DosSleep(10L);
nServer = 0;
break;
}
/*****************
Вот это и есть злополучный запрос, на который нет ответа. Я пытался передать имя Item как атом (это, вроде бы соответствует мелкомягкому механизму) - результат тот же!
******************/
case IDM_DATA : {

DDESTRUCT *buf;

DosAllocSharedMem(&buf, NULL, sizeof(DDESTRUCT) + 31,
PAG_COMMIT | PAG_WRITE | OBJ_GIVEABLE | OBJ_TILE);
DosGiveSharedMem(buf, Server[0].tid,
PAG_WRITE | PAG_READ | PAG_COMMIT);
buf->usFormat = DDEFMT_TEXT;
buf->fsStatus = 0;
buf->offszItemName = sizeof(DDESTRUCT);
strcpy((char *)(buf + buf->offszItemName), "SysItems");
buf->cbData = 0;

WinDdePostMsg(Server[0].hwnd, hwnd, WM_DDE_REQUEST,
(MPARAM)buf, DDEPM_RETRY);
break;
}
}
break;
}
case WM_COMMAND : {
if (SHORT1FROMMP(mp1) == DID_CANCEL)
WinSendMsg(hwnd, WM_SYSCOMMAND, MPFROM2SHORT(IDM_CLOSE, 0), 0);
break;
}
}
return WinDefDlgProc(hwnd, msg, mp1, mp2);
}


Mon 03 Dec 2001 18:39 Mozilla/4.61 [en] (OS/2; I)




Programmed by Dmitri Maximovich, Dmitry I. Platonoff, Eugen Kuleshov.
25.09.99 (c) 1999, RU/2. All rights reserved.
Rewritten by Dmitry Ban. All rights ignored.