RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> > Приведи код, как ты это делаешь. > > Привожу: > 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); > } >
_, _, _,
/ \ (_ / ~ )
\ / , ) / /
~ ~ ~~~
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.