Site Index - Feedback - Impressum |
| |||||||||
|
|
( Archiv ) | ( Neues Thema ) |
16.03.2005 |
DDE Source (10:25:52) | « ^ » |
Auf der Server-Seite:
#define INCL_WIN #include <os2.h> #include <string.h> /* Standard-biblioteker */ #include <stdlib.h> /* */ #include <memory.h> /* */ #include <stdio.h> /* */ #include <process.h> /* */ #define szClass "OX400" #define szTitel "DDE-Statement til Ekspedition" /* ----------------------------------------------------------------------- */ /* -- Variable ----------------------------------------------------------- */ /* ----------------------------------------------------------------------- */ /* ---------------------- */ HAB hab; /* Handle - Anchor Block */ HMQ hMQ; /* Handle - Message Queue */ HWND hwndFrame; /* Handle - frame */ HWND hwndClient; /* Handle - client */ CHAR szTemp[80]; /* ----------------------------------------------------------------------- */ /* -- Dan DDE-struktur --------------------------------------------------- */ /* ----------------------------------------------------------------------- */ PDDESTRUCT MakeDDESegment( HWND hwndDest, PSZ pszItemName, USHORT fsStatus, USHORT usFormat, PVOID pabData, USHORT usDataLen ) { PDDESTRUCT pddes; USHORT usItemLen; USHORT usTotalLen; SEL selBuf; SEL selShared; USHORT receiverPID; USHORT receiverTID; usItemLen = _fstrlen((char _far *)pszItemName) + 1; usTotalLen = sizeof(DDESTRUCT) + usItemLen + usDataLen; /* Opret DDE SEGMENT JOHNNY */ if( !DosAllocSeg( usTotalLen, &selBuf, SEG_GIVEABLE) ) { /* Konverter SELECTOR til en c-pointer og udfyld aralet JOHNNY */ pddes = SELTOPDDES(selBuf); pddes->cbData = usTotalLen; pddes->fsStatus = fsStatus; pddes->usFormat = usFormat; pddes->offszItemName = sizeof(DDESTRUCT); if( (usDataLen) && (pabData)) pddes->offabData = sizeof(DDESTRUCT) + usItemLen; else pddes->offabData = 0; /* Her bruges farstrcopy istedet for strcopy da arealet kan ligge langt væk, ITEMNAME er pænt nultermineret, defor strcopy(), mens det er op til den enkelte programmør at lave en pæn afslutning, og det kan vi ikke stole på at alle gør derfor memcopy() på data arealet JOHNNY */ _fstrcpy((char _far *)DDES_PSZITEMNAME(pddes), (char _far *)pszItemName); memcpy((char _far *)DDES_PABDATA(pddes), (char _far *)pabData, usDataLen); /* Spørg handle pointeren som vi fik i DDE-initiate, hvilken processid og threadid som i sin tid skabte handlen JOHNNY */ WinQueryWindowProcess(hwndDest, &receiverPID, &receiverTID); /* Giv den modtagende process adgang til SEGMENTET SELBUF JOHNNY */ if( !DosGiveSeg(selBuf, receiverPID, &selShared) ) { /* Lav endnu en c-pointer til segmentet som returneres og sende i DDE meddelelsen senere. Det er denne pointer som den modtagende handle benytter når den skal smage på dataene, da det ikke er selve data- arealet som sende til den modtagende handle men kun en c-pointer til det shared segment JOHNNY */ pddes = SELTOPDDES( selShared ); return (pddes); } } return (NULL); } /* ----------------------------------------------------------------------- */ /* -- Message-loop for main-vindue --------------------------------------- */ /* ----------------------------------------------------------------------- */ MRESULT EXPENTRY Msgloop( HWND hwnd , USHORT msg , MPARAM mp1 , MPARAM mp2 ) { HPS hPS; RECTL rectl; HWND servhWnd; int iRc; PDDESTRUCT prc; /* --------------------------------------------------------------------- */ switch(msg) { /* -- WM_Create -------------------------------------------------------- */ case WM_CREATE: WinPostMsg( hwnd, WM_USER, 0L, 0L ); break; /* -- WM_USER ---------------------------------------------------------- */ case WM_USER: iRc=WinDdeInitiate( hwnd, "EKSP", "ENGA" ); break; /* -- WM_DDE_INITIATE_ACK ---------------------------------------------- */ case WM_DDE_INITIATEACK: servhWnd = HWNDFROMMP( mp1 ); prc = MakeDDESegment( servhWnd, (PSZ)"EKSP", 0, DDEFMT_TEXT, (void*)szTemp, 24 ); iRc = WinDdePostMsg( servhWnd, hwnd, WM_DDE_EXECUTE, prc, TRUE ); WinPostMsg( hwnd, WM_DDE_TERMINATE, 0L, 0L ); /* This is the solution suggested according to point2 in the report of pmr38043 i.e "Application does the cleanup" DosFreeMem(mp2); */ break; /* -- WM_DDE_TERMINATE ------------------------------------------------- */ case WM_DDE_TERMINATE: WinPostMsg( hwnd, WM_CLOSE, 0L, 0L ); break; /* -- WM_PAINT --------------------------------------------------------- */ case WM_PAINT: hPS = WinBeginPaint(hwnd, 0, 0); WinQueryWindowRect(hwnd, &rectl); WinFillRect( hPS, &rectl, CLR_BACKGROUND); WinEndPaint(hPS); break; /* -- Default -------------------------------------------------------- */ /* default: return(WinDefWindowProc(hwnd, msg, mp1,mp2)); break; */ /* Not required to do this here : pmr38043 */ } /* This is the solution suggested according to point1 in the report of pmr38043 i.e "Allowing PM to do the cleanup" */ return(WinDefWindowProc(hwnd, msg, mp1,mp2)); } /* ----------------------------------------------------------------------- */ /* -- Start programmet --------------------------------------------------- */ /* ----------------------------------------------------------------------- */ void DDE_EKSP() { QMSG qmsg; SHORT rc; LONG ulFlag; if ( (hab = WinInitialize(0) ) == 0 ) return; if ( (hMQ = WinCreateMsgQueue(hab, 0)) == 0) return; rc = WinRegisterClass( hab , (PCH)szClass , (PFNWP)Msgloop , CS_CLIPCHILDREN | CS_SIZEREDRAW , 0 ); if ( rc == FALSE ) return; /* -- Sæt frame flags -------------------------------------------------- */ ulFlag = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINBUTTON | FCF_SIZEBORDER | FCF_NOBYTEALIGN ; /* -- Dan vindue ------------------------------------------------------- */ hwndFrame = WinCreateStdWindow( HWND_DESKTOP, 0 , &ulFlag, szClass, szTitel, WS_MINIMIZED, 0, 100, (HWND FAR *)hwndClient); /* -- Sæt vinduet aktivt ----------------------------------------------- */ WinSetActiveWindow( HWND_DESKTOP, hwndFrame ); /* -- Main loop -------------------------------------------------------- */ while(WinGetMsg(hab, (PQMSG)&qmsg, 0, 0, 0)) WinDispatchMsg(hab,(PQMSG)&qmsg); /* -- Luk vindue ------------------------------------------------------- */ WinDestroyWindow(hwndFrame); WinDestroyMsgQueue(hMQ); WinTerminate(hab); } void cdecl main() { USHORT usRc; CHAR szBuffer[255]; while( 1==1 ) { DDE_EKSP( ); for ( usRc = 0; usRc < 10000; usRc++ ) { strcpy( szBuffer, szBuffer ); } } } #define INCL_WIN #include <os2.h> #include <string.h> /* Standard-biblioteker */ #include <stdlib.h> /* */ #include <memory.h> /* */ #include <stdio.h> /* */ #include <process.h> /* */ #define szClass "OX400" #define szTitel "DDE-Statement til Ekspedition" /* ----------------------------------------------------------------------- */ /* -- Variable ----------------------------------------------------------- */ /* ----------------------------------------------------------------------- */ /* ---------------------- */ HAB hab; /* Handle - Anchor Block */ HMQ hMQ; /* Handle - Message Queue */ HWND hwndFrame; /* Handle - frame */ HWND hwndClient; /* Handle - client */ CHAR szTemp[80]; /* ----------------------------------------------------------------------- */ /* -- Dan DDE-struktur --------------------------------------------------- */ /* ----------------------------------------------------------------------- */ PDDESTRUCT MakeDDESegment( HWND hwndDest, PSZ pszItemName, USHORT fsStatus, USHORT usFormat, PVOID pabData, USHORT usDataLen ) { PDDESTRUCT pddes; USHORT usItemLen; USHORT usTotalLen; SEL selBuf; SEL selShared; USHORT receiverPID; USHORT receiverTID; usItemLen = _fstrlen((char _far *)pszItemName) + 1; usTotalLen = sizeof(DDESTRUCT) + usItemLen + usDataLen; /* Opret DDE SEGMENT JOHNNY */ if( !DosAllocSeg( usTotalLen, &selBuf, SEG_GIVEABLE) ) { /* Konverter SELECTOR til en c-pointer og udfyld aralet JOHNNY */ pddes = SELTOPDDES(selBuf); pddes->cbData = usTotalLen; pddes->fsStatus = fsStatus; pddes->usFormat = usFormat; pddes->offszItemName = sizeof(DDESTRUCT); if( (usDataLen) && (pabData)) pddes->offabData = sizeof(DDESTRUCT) + usItemLen; else pddes->offabData = 0; /* Her bruges farstrcopy istedet for strcopy da arealet kan ligge langt væk, ITEMNAME er pænt nultermineret, defor strcopy(), mens det er op til den enkelte programmør at lave en pæn afslutning, og det kan vi ikke stole på at alle gør derfor memcopy() på data arealet JOHNNY */ _fstrcpy((char _far *)DDES_PSZITEMNAME(pddes), (char _far *)pszItemName); memcpy((char _far *)DDES_PABDATA(pddes), (char _far *)pabData, usDataLen); /* Spørg handle pointeren som vi fik i DDE-initiate, hvilken processid og threadid som i sin tid skabte handlen JOHNNY */ WinQueryWindowProcess(hwndDest, &receiverPID, &receiverTID); /* Giv den modtagende process adgang til SEGMENTET SELBUF JOHNNY */ if( !DosGiveSeg(selBuf, receiverPID, &selShared) ) { /* Lav endnu en c-pointer til segmentet som returneres og sende i DDE meddelelsen senere. Det er denne pointer som den modtagende handle benytter når den skal smage på dataene, da det ikke er selve data- arealet som sende til den modtagende handle men kun en c-pointer til det shared segment JOHNNY */ pddes = SELTOPDDES( selShared ); return (pddes); } } return (NULL); } /* ----------------------------------------------------------------------- */ /* -- Message-loop for main-vindue --------------------------------------- */ /* ----------------------------------------------------------------------- */ MRESULT EXPENTRY Msgloop( HWND hwnd , USHORT msg , MPARAM mp1 , MPARAM mp2 ) { HPS hPS; RECTL rectl; HWND servhWnd; int iRc; PDDESTRUCT prc; /* --------------------------------------------------------------------- */ switch(msg) { /* -- WM_Create -------------------------------------------------------- */ case WM_CREATE: WinPostMsg( hwnd, WM_USER, 0L, 0L ); break; /* -- WM_USER ---------------------------------------------------------- */ case WM_USER: iRc=WinDdeInitiate( hwnd, "EKSP", "ENGA" ); break; /* -- WM_DDE_INITIATE_ACK ---------------------------------------------- */ case WM_DDE_INITIATEACK: servhWnd = HWNDFROMMP( mp1 ); prc = MakeDDESegment( servhWnd, (PSZ)"EKSP", 0, DDEFMT_TEXT, (void*)szTemp, 24 ); iRc = WinDdePostMsg( servhWnd, hwnd, WM_DDE_EXECUTE, prc, TRUE ); WinPostMsg( hwnd, WM_DDE_TERMINATE, 0L, 0L ); /* This is the solution suggested according to point2 in the report of pmr38043 i.e "Application does the cleanup" DosFreeMem(mp2); */ break; /* -- WM_DDE_TERMINATE ------------------------------------------------- */ case WM_DDE_TERMINATE: WinPostMsg( hwnd, WM_CLOSE, 0L, 0L ); break; /* -- WM_PAINT --------------------------------------------------------- */ case WM_PAINT: hPS = WinBeginPaint(hwnd, 0, 0); WinQueryWindowRect(hwnd, &rectl); WinFillRect( hPS, &rectl, CLR_BACKGROUND); WinEndPaint(hPS); break; /* -- Default -------------------------------------------------------- */ /* default: return(WinDefWindowProc(hwnd, msg, mp1,mp2)); break; */ /* Not required to do this here : pmr38043 */ } /* This is the solution suggested according to point1 in the report of pmr38043 i.e "Allowing PM to do the cleanup" */ return(WinDefWindowProc(hwnd, msg, mp1,mp2)); } /* ----------------------------------------------------------------------- */ /* -- Start programmet --------------------------------------------------- */ /* ----------------------------------------------------------------------- */ void DDE_EKSP() { QMSG qmsg; SHORT rc; LONG ulFlag; if ( (hab = WinInitialize(0) ) == 0 ) return; if ( (hMQ = WinCreateMsgQueue(hab, 0)) == 0) return; rc = WinRegisterClass( hab , (PCH)szClass , (PFNWP)Msgloop , CS_CLIPCHILDREN | CS_SIZEREDRAW , 0 ); if ( rc == FALSE ) return; /* -- Sæt frame flags -------------------------------------------------- */ ulFlag = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINBUTTON | FCF_SIZEBORDER | FCF_NOBYTEALIGN ; /* -- Dan vindue ------------------------------------------------------- */ hwndFrame = WinCreateStdWindow( HWND_DESKTOP, 0 , &ulFlag, szClass, szTitel, WS_MINIMIZED, 0, 100, (HWND FAR *)hwndClient); /* -- Sæt vinduet aktivt ----------------------------------------------- */ WinSetActiveWindow( HWND_DESKTOP, hwndFrame ); /* -- Main loop -------------------------------------------------------- */ while(WinGetMsg(hab, (PQMSG)&qmsg, 0, 0, 0)) WinDispatchMsg(hab,(PQMSG)&qmsg); /* -- Luk vindue ------------------------------------------------------- */ WinDestroyWindow(hwndFrame); WinDestroyMsgQueue(hMQ); WinTerminate(hab); } void cdecl main() { USHORT usRc; CHAR szBuffer[255]; while( 1==1 ) { DDE_EKSP( ); for ( usRc = 0; usRc < 10000; usRc++ ) { strcpy( szBuffer, szBuffer ); } } } ******************************************************************* Auf der Seite des Clients: ******************************************************************** #define INCL_WIN #include <os2.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define szClass "OX400" #define szTitel "DDE-Statement til Ekspedition" /* -- Globale variable --------------------------------------------------- */ PDDESTRUCT pddes; /* ----------------------------------------------------------------------- */ /* -- Variable ----------------------------------------------------------- */ /* ----------------------------------------------------------------------- */ /* ---------------------- */ HAB hab; /* Handle - Anchor Block */ HMQ hMQ; /* Handle - Message Queue */ HWND hwndFrame; /* Handle - frame */ HWND hwndClient; /* Handle - client */ /* ----------------------------------------------------------------------- */ /* -- Message-loop for main-vindue --------------------------------------- */ /* ----------------------------------------------------------------------- */ MRESULT EXPENTRY Msgloop( HWND hwnd , USHORT msg , MPARAM mp1 , MPARAM mp2 ) { HPS hPS; RECTL rectl; int iRc; /* --------------------------------------------------------------------- */ switch(msg) { /* -- WM_Create -------------------------------------------------------- */ case WM_CREATE: WinPostMsg( hwnd, WM_USER, 0L, 0L ); break; /* -- WM_USER ---------------------------------------------------------- */ case WM_USER: iRc=WinDdeInitiate( hwnd, "EKSP", "ENGA" ); break; /* -- WM_DDE_INITIATE -------------------------------------------------- */ case WM_DDE_INITIATE: iRc = (int)WinDdeRespond( HWNDFROMMP(mp1), hwnd, ((DDEINIT*)mp2)->pszAppName, ((DDEINIT*)mp2)->pszTopic); /* This is the solution suggested according to point2 in the report of pmr38043 i.e "Application does the cleanup" DosFreeMem(mp2); */ break; case WM_DDE_EXECUTE: pddes = (PDDESTRUCT)mp2; iRc = DosFreeSeg(PDDESTOSEL(pddes)); return 0; break; /* -- WM_PAINT --------------------------------------------------------- */ case WM_PAINT: hPS = WinBeginPaint(hwnd, 0, 0); WinQueryWindowRect(hwnd, &rectl); WinFillRect( hPS, &rectl, CLR_BACKGROUND); WinEndPaint(hPS); break; /* -- Default -------------------------------------------------------- */ /* default: return(WinDefWindowProc(hwnd, msg, mp1,mp2)); break; */ /* Not required to do this here : pmr38043 */ } /* This is the solution suggested according to point1 in the report of pmr38043 i.e "Allowing PM to do the cleanup" */ return(WinDefWindowProc(hwnd, msg, mp1,mp2)); } /* ----------------------------------------------------------------------- */ /* -- Start programmet --------------------------------------------------- */ /* ----------------------------------------------------------------------- */ void main( ) { QMSG qmsg; SHORT rc; LONG ulFlag; if ( (hab = WinInitialize(0) ) == 0 ) return; if ( (hMQ = WinCreateMsgQueue(hab, 0)) == 0) return; rc = WinRegisterClass( hab , (PCH)szClass , (PFNWP)Msgloop , CS_CLIPCHILDREN | CS_SIZEREDRAW , 0 ); if ( rc == FALSE ) { WinMessageBox( HWND_DESKTOP , HWND_DESKTOP , "Kan ikke registrere Window-Class", 0 , 0 , MB_OK | MB_ICONEXCLAMATION ); return; } ulFlag = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINBUTTON | FCF_SIZEBORDER | FCF_NOBYTEALIGN ; hwndFrame = WinCreateStdWindow( HWND_DESKTOP, 0 , &ulFlag, szClass, szTitel, WS_MINIMIZED, 0, 100, (HWND FAR *)hwndClient); /* -- Sæt vinduet aktivt ----------------------------------------------- */ WinSetActiveWindow( HWND_DESKTOP, hwndFrame ); /* -- Main loop -------------------------------------------------------- */ while(WinGetMsg(hab, (PQMSG)&qmsg, 0, 0, 0)) WinDispatchMsg(hab,(PQMSG)&qmsg); /* -- Luk vindue ------------------------------------------------------- */ WinDestroyWindow(hwndFrame); WinDestroyMsgQueue(hMQ); WinTerminate(hab); } [ Leser: 31 ] |
|
Mit * markierte Felder müssen ausgefüllt werden ! |
( Zeige alle Einträge ) | ( Zur Startübersicht ) |
|
| Alexander | 154 | 09.09.1999 | 00:00 |
| Alexander Beyrer | 46 | 10.09.1999 | 00:00 |
| 31 | 16.03.2005 | 10:25 |
| Guenther | 40 | 10.09.1999 | 00:00 |
| Alexander | 42 | 10.09.1999 | 00:00 |
| Guenther | 43 | 13.09.1999 | 00:00 |
| Alexander Beyrer | 43 | 14.09.1999 | 00:00 |
| Alexander | 44 | 15.09.1999 | 00:00 |
| Guenther | 41 | 16.09.1999 | 00:00 |
| Alexander | 40 | 16.09.1999 | 00:00 |
| Gerhard Arnecke | 46 | 18.09.1999 | 00:00 |
|