MRESULT EXPENTRY fnwpMain(HWND hwndFrame, ULONG msg, MPARAM mp1, MPARAM mp2) { PSZ szData; PDDESTRUCT pddeStruct; ULONG mem; CHAR szBuffer[200]; switch (msg) { // all answers to the WinDDEInitate call arrive here case WM_DDE_INITIATEACK: { PDDEINIT pddeInit; PSZ szInApp, szInTopic; static BOOL bNetscapeAnswered = FALSE; pddeInit = (PDDEINIT)mp2; szInApp = pddeInit->pszAppName; szInTopic = pddeInit->pszTopic; G_hServerWnd = (HWND)mp1; ShowMessage("WM_DDE_INITIATEACK (resp to WinDDEInitiate)"); ShowMessage(" application: \"%s\"", pddeInit->pszAppName); ShowMessage(" topic: \"%s\"", pddeInit->pszTopic); // RDP 2000-07-07 07:24:18 // There was no check on which application responded. // This made NETSCDDE fail when another DDE-aware application, // like EPM, was running. // Now the handle from mp1 is only assigned if the application // responding is Netscape. // If the app is not Netscape then the handle is nullified. // I don't know if assigning 0 to the handle is correct but // is seems to solve the problem. // V0.9.19 (2002-03-28) [umoeller] // Opera fix: use stricmp instead of strcmp if (!stricmp(pddeInit->pszAppName, G_szDDENetscape)) // V0.9.16 (2001-10-02) [umoeller] { // ShowMessage("!! Netscape answered."); G_hServerWnd = (HWND)mp1; bNetscapeAnswered = TRUE; } else { // ShowMessage("!! Other application aswered."); G_hServerWnd = (HWND)0; } } break; // all answers to DDE requests arrive here case WM_DDE_DATA: { ShowMessage("!! Received data from Netscape: "); pddeStruct = (PDDESTRUCT) mp2; DosGetSharedMem(pddeStruct, PAG_READ | PAG_WRITE); szData = (BYTE *) (pddeStruct + (pddeStruct->offabData)); ShowMessage(szData); } break; // menu item processing (in debug mode, otherwise these // WM_COMMAND msgs have been posted automatically) case WM_COMMAND: switch (SHORT1FROMMP(mp1)) { // start DDE conversation: this was posted // by "main" before the PM loop was entered // (even if we're in debug mode) case IDM_INITIATE: // WinPostMsg(G_hwndListbox, LM_DELETEALL, 0, 0); ShowMessage("IDM_INITIATE:"); ShowMessage("Topic: \"%s\"", G_szOpenURLTopic); G_context.cb = sizeof(CONVCONTEXT); G_context.fsContext = 0; WinDdeInitiate(hwndFrame, G_szDDENetscape, G_szOpenURLTopic, &G_context); if (!G_optDebug) // if we're not in debug mode, post subsequent // menu commands automatically WinPostMsg(hwndFrame, WM_COMMAND, MPFROM2SHORT(IDM_CHAIN2, 0), 0); break; // "Open URL": request data from server case IDM_OPENURL: { ShowMessage("IDM_OPENURL"); ShowMessage(" URL: \"%s\"", G_szURL); strlcpy(szBuffer, G_szURL, sizeof(szBuffer)); strlcat(szBuffer, ",,0xFFFFFFFF,0x0", sizeof(szBuffer)); DDERequest(hwndFrame, szBuffer); } break; // "Open URL in new window": request data from server, // but with different parameters case IDM_OPENURLNEW: { ShowMessage("IDM_OPENURLNEW"); ShowMessage(" URL: \"%s\"", G_szURL); strlcpy(szBuffer, G_szURL, sizeof(szBuffer)); strlcat(szBuffer, ",,0x0,0x0", sizeof(szBuffer)); DDERequest(hwndFrame, szBuffer); } break; /* * IDM_CHAIN2: * this is posted after DDE_INITIATE was * successful */ case IDM_CHAIN2: { if (G_optNewWindow) WinPostMsg(G_hwndDebug, WM_COMMAND, MPFROM2SHORT(IDM_OPENURLNEW, 0), 0); else WinPostMsg(G_hwndDebug, WM_COMMAND, MPFROM2SHORT(IDM_OPENURL, 0), 0); WinPostMsg(G_hwndDebug, WM_COMMAND, MPFROM2SHORT(IDM_CHAIN3, 0), 0); } break; /* * IDM_CHAIN3: * this is posted to close the whole thing; we just need * another msg before going for IDM_CLOSE, or some DDE * msgs might get lost */ case IDM_CHAIN3: WinPostMsg(G_hwndDebug, WM_COMMAND, MPFROM2SHORT(IDM_CLOSE, 0), 0); break; case IDM_FULLSEQUENCE: WinPostMsg(G_hwndDebug, WM_COMMAND, MPFROM2SHORT(IDM_INITIATE, 0), 0); WinPostMsg(G_hwndDebug, WM_COMMAND, MPFROM2SHORT(IDM_CHAIN2, 0), 0); break; /* * IDM_CLOSE: * this is posted to close the whole thing */ case IDM_CLOSE: WinDdePostMsg(G_hServerWnd, hwndFrame, WM_DDE_TERMINATE, NULL, DDEPM_RETRY); ShowMessage("DDE connection closed."); if (!G_optDebug) WinPostMsg(hwndFrame, WM_COMMAND, MPFROM2SHORT(IDM_DELAYEXIT, 0), 0); break; /* * IDM_DELAYEXIT: * this is posted after IDM_CLOSE; we will now * check for whether the DDE conversation with * Netscape was successful and, if not, start * a new instance of Netscape according to the * command line parameters */ case IDM_DELAYEXIT: { if ( (!G_NetscapeFound) && (G_optExecute) ) { CHAR szStart[256]; GetNLSString(szStart, sizeof(szStart), ID_NDSI_STARTNETSCAPE); // confirm start netscape if ( (!G_optConfirmStart) // get rid of this hideously ugly dialog || (WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szStart, (PSZ)NETSCDDE_TITLE, 0, MB_YESNO | MB_MOVEABLE) == MBID_YES) /* WinCenteredDlgBox(HWND_DESKTOP, G_hwndDebug, WinDefDlgProc, G_hmodNLS, ID_NDD_QUERYSTART, NULL) == DID_OK) */ ) { UCHAR achObjBuf[256] = ""; CHAR szArgs[CCHMAXPATH]; HWND hwndNotify = HWND_DESKTOP; PROGDETAILS pd; HAPP happ; // destroy "Contacting", create "Starting Netscape" // window WinDestroyWindow(G_hwndContacting); G_hwndContacting = NULLHANDLE; if (!G_optQuiet) { G_hwndContacting = WinLoadDlg(HWND_DESKTOP, G_hwndDebug, WinDefDlgProc, G_hmodNLS, ID_NDD_STARTING, 0); WinShowWindow(G_hwndContacting, TRUE); } strlcpy(szArgs, G_szNetscapeParams, sizeof(szArgs)); strlcat(szArgs, " ", sizeof(szArgs)); strlcat(szArgs, G_szURL, sizeof(szArgs)); // now start app memset(&pd, 0, sizeof(pd)); pd.Length = sizeof(pd); pd.progt.progc = PROG_DEFAULT; pd.progt.fbVisible = SHE_VISIBLE; pd.pszExecutable = G_szNetscapeApp; pd.pszParameters = szArgs; pd.pszStartupDir = G_szStartupDir; if (!(happ = WinStartApp(NULLHANDLE, &pd, szArgs, NULL, SAF_INSTALLEDCMDLINE))) { DisplayError("WinStartApp failed for app \"%s\", params \"%s\", startup dir \"%s\"", G_szNetscapeApp, szArgs, G_szStartupDir); } } } // keep "Contacting" / "Starting" window visible for two seconds G_idTimer = WinStartTimer(G_hab, hwndFrame, 1, 2000); break; } // User closes the window case IDM_EXIT: WinPostMsg(hwndFrame, WM_CLOSE, 0, 0); break; } break; case WM_TIMER: // after two seconds, close status window WinStopTimer(G_hab, hwndFrame, G_idTimer); WinPostMsg(hwndFrame, WM_CLOSE, 0, 0); break; // Send the message to the usual WC_FRAME WndProc default: return G_SysWndProc(hwndFrame, msg, mp1, mp2); } return FALSE; }
int _tmain(int argc, _TCHAR* argv[]) { /* //MT4|ASK!EURUSD char szApp[] = "MT4"; char szTopic[] = "ASK"; //char szCmd1[] = "[APP.MINIMIZE()]"; char szItem1[] = "USDJPY"; char szDesc1[] = "A1 Contains: "; char szItem2[] = "USDCHF"; char szDesc2[] = "A2 Contains: "; //char szItem3[] = "R3C1"; char szData3[] = "Data from DDE Client"; //char szCmd2[] = "[SELECT(\"R3C1\")][FONT.PROPERTIES(,\"Bold\")][SAVE()][QUIT()]"; */ //DDE Initialization UINT iReturn; iReturn = DdeInitialize(&idInst, (PFNCALLBACK)DdeCallback, APPCLASS_STANDARD | APPCMD_CLIENTONLY, 0 ); if (iReturn!=DMLERR_NO_ERROR) { printf("DDE Initialization Failed: 0x%04x\n", iReturn); Sleep(1500); return 0; } //Start DDE Server and wait for it to become idle. //HINSTANCE hRet = ShellExecute(0, "open", szTopic, 0, 0, SW_SHOWNORMAL); //if ((int)hRet < 33) //{ // printf("Unable to Start DDE Server: 0x%04x\n", hRet); // Sleep(1500); DdeUninitialize(idInst); // return 0; //} //Sleep(1000); //DDE Connect to Server using given AppName and topic. HCONV hConv; hszApp = DdeCreateStringHandle(idInst, szApp, 0); hszTopic = DdeCreateStringHandle(idInst, szTopic, 0); hConv = DdeConnect(idInst, hszApp, hszTopic, NULL); DdeFreeStringHandle(idInst, hszApp); DdeFreeStringHandle(idInst, hszTopic); if (hConv == NULL) { printf("DDE Connection Failed.\n"); Sleep(1500); DdeUninitialize(idInst); return 0; } //Execute commands/requests specific to the DDE Server. //DDEExecute(idInst, hConv, szCmd1); DDERequest(idInst, hConv, szItem1, szDesc1); DDERequest(idInst, hConv, szItem2, szDesc2); //DDEPoke(idInst, hConv, szItem3, szData3); //DDEExecute(idInst, hConv, szCmd2); BOOL bRet; MSG msg; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } //DDE Disconnect and Uninitialize. DdeDisconnect(hConv); DdeUninitialize(idInst); Sleep(3000); return 1; }