bool XAP_Win32Slurp::connectSlurper(void) { if (m_bInitialized) // only do this once !! return false; // Register us with the DDE Management Library (DDEML). m_idDdeServerInst = 0; UINT nDdeRtnStatus = DdeInitializeW(&m_idDdeServerInst, (PFNCALLBACK)&s_DdeServerCallback, ( APPCMD_FILTERINITS | CBF_SKIP_CONNECT_CONFIRMS | CBF_FAIL_SELFCONNECTIONS | CBF_FAIL_POKES), 0); if (nDdeRtnStatus != DMLERR_NO_ERROR) { UT_DEBUGMSG(("Unable to initialize DDEML [%d]\n",nDdeRtnStatus)); return false; } // create two registered strings. // the "ServerName" must match the value in the registry under the key: // HKEY_CLASSES_ROOT\<xxx>\shell\open\ddeexec\application // // the "TopicName" must match the value in the key: // HKEY_CLASSES_ROOT\<xxx>\shell\open\ddeexec\topic m_hszServerName = DdeCreateStringHandleW(m_idDdeServerInst, L"Abiword"/*const_cast<char *>(m_pApp->getApplicationName())*/, CP_WINUNICODE); m_hszTopic = DdeCreateStringHandleW(m_idDdeServerInst, MY_DDE_TOPICNAME, CP_WINUNICODE); // register the server Name HDDEDATA bRegistered = DdeNameService(m_idDdeServerInst, m_hszServerName, NULL, DNS_REGISTER); if (!bRegistered) { UT_DEBUGMSG(("Unable to register NameService with DDEML.\n")); return false; } m_bInitialized = true; return true; }
/************************************************************************* * ShellDDEInit (SHELL32.@) * * Registers the Shell DDE services with the system so that applications * can use them. * * PARAMS * bInit [I] TRUE to initialize the services, FALSE to uninitialize. * * RETURNS * Nothing. */ EXTERN_C void WINAPI ShellDDEInit(BOOL bInit) { TRACE("ShellDDEInit bInit = %s\n", bInit ? "TRUE" : "FALSE"); if (bInit && !bInitialized) { DdeInitializeW(&dwDDEInst, DdeCallback, CBF_FAIL_ADVISES | CBF_FAIL_POKES, 0); hszProgmanTopic = DdeCreateStringHandleW(dwDDEInst, L"Progman", CP_WINUNICODE); hszProgmanService = DdeCreateStringHandleW(dwDDEInst, L"Progman", CP_WINUNICODE); hszShell = DdeCreateStringHandleW(dwDDEInst, L"Shell", CP_WINUNICODE); hszAppProperties = DdeCreateStringHandleW(dwDDEInst, L"AppProperties", CP_WINUNICODE); hszFolders = DdeCreateStringHandleW(dwDDEInst, L"Folders", CP_WINUNICODE); if (hszProgmanTopic && hszProgmanService && hszShell && hszAppProperties && hszFolders && DdeNameService(dwDDEInst, hszFolders, 0, DNS_REGISTER) && DdeNameService(dwDDEInst, hszProgmanService, 0, DNS_REGISTER) && DdeNameService(dwDDEInst, hszShell, 0, DNS_REGISTER)) { bInitialized = TRUE; } } else if (!bInit && bInitialized) { /* unregister all services */ DdeNameService(dwDDEInst, 0, 0, DNS_UNREGISTER); if (hszFolders) DdeFreeStringHandle(dwDDEInst, hszFolders); if (hszAppProperties) DdeFreeStringHandle(dwDDEInst, hszAppProperties); if (hszShell) DdeFreeStringHandle(dwDDEInst, hszShell); if (hszProgmanService) DdeFreeStringHandle(dwDDEInst, hszProgmanService); if (hszProgmanTopic) DdeFreeStringHandle(dwDDEInst, hszProgmanTopic); DdeUninitialize(dwDDEInst); bInitialized = FALSE; } }
/************************************************************************* * ShellDDEInit (SHELL32.@) * * Registers the Shell DDE services with the system so that applications * can use them. * * PARAMS * bInit [I] TRUE to initialize the services, FALSE to uninitalize. * * RETURNS * Nothing. */ void WINAPI ShellDDEInit(BOOL bInit) { TRACE("bInit = %s\n", bInit ? "TRUE" : "FALSE"); if (bInit) { static const WCHAR wszProgman[] = {'P','r','o','g','m','a','n',0}; static const WCHAR wszAsterisk[] = {'*',0}; static const WCHAR wszShell[] = {'S','h','e','l','l',0}; static const WCHAR wszAppProperties[] = {'A','p','p','P','r','o','p','e','r','t','i','e','s',0}; static const WCHAR wszFolders[] = {'F','o','l','d','e','r','s',0}; static const WCHAR wszGroups[] = {'G','r','o','u','p','s',0}; DdeInitializeW(&dwDDEInst, DdeCallback, CBF_FAIL_ADVISES | CBF_FAIL_POKES, 0); hszProgmanTopic = DdeCreateStringHandleW(dwDDEInst, wszProgman, CP_WINUNICODE); hszProgmanService = DdeCreateStringHandleW(dwDDEInst, wszProgman, CP_WINUNICODE); hszAsterisk = DdeCreateStringHandleW(dwDDEInst, wszAsterisk, CP_WINUNICODE); hszShell = DdeCreateStringHandleW(dwDDEInst, wszShell, CP_WINUNICODE); hszAppProperties = DdeCreateStringHandleW(dwDDEInst, wszAppProperties, CP_WINUNICODE); hszFolders = DdeCreateStringHandleW(dwDDEInst, wszFolders, CP_WINUNICODE); hszGroups = DdeCreateStringHandleW(dwDDEInst, wszGroups, CP_WINUNICODE); DdeNameService(dwDDEInst, hszFolders, 0, DNS_REGISTER); DdeNameService(dwDDEInst, hszProgmanService, 0, DNS_REGISTER); DdeNameService(dwDDEInst, hszShell, 0, DNS_REGISTER); } else { /* unregister all services */ DdeNameService(dwDDEInst, 0, 0, DNS_UNREGISTER); DdeFreeStringHandle(dwDDEInst, hszFolders); DdeFreeStringHandle(dwDDEInst, hszAppProperties); DdeFreeStringHandle(dwDDEInst, hszShell); DdeFreeStringHandle(dwDDEInst, hszAsterisk); DdeFreeStringHandle(dwDDEInst, hszProgmanService); DdeFreeStringHandle(dwDDEInst, hszProgmanTopic); DdeUninitialize(dwDDEInst); } }
static WCHAR *get_url_from_dde(void) { static const WCHAR szApplication[] = {'I','E','x','p','l','o','r','e',0}; static const WCHAR szTopic[] = {'W','W','W','_','O','p','e','n','U','R','L',0}; static const WCHAR szReturn[] = {'R','e','t','u','r','n',0}; HSZ hszApplication = 0; UINT_PTR timer = 0; int rc; WCHAR *ret = NULL; rc = DdeInitializeW(&ddeInst, ddeCb, CBF_SKIP_ALLNOTIFICATIONS | CBF_FAIL_ADVISES | CBF_FAIL_POKES, 0); if (rc != DMLERR_NO_ERROR) { WINE_ERR("Unable to initialize DDE, DdeInitialize returned %d\n", rc); goto done; } hszApplication = DdeCreateStringHandleW(ddeInst, szApplication, CP_WINUNICODE); if (!hszApplication) { WINE_ERR("Unable to initialize DDE, DdeCreateStringHandle failed\n"); goto done; } hszTopic = DdeCreateStringHandleW(ddeInst, szTopic, CP_WINUNICODE); if (!hszTopic) { WINE_ERR("Unable to initialize DDE, DdeCreateStringHandle failed\n"); goto done; } hszReturn = DdeCreateStringHandleW(ddeInst, szReturn, CP_WINUNICODE); if (!hszReturn) { WINE_ERR("Unable to initialize DDE, DdeCreateStringHandle failed\n"); goto done; } if (!DdeNameService(ddeInst, hszApplication, 0, DNS_REGISTER)) { WINE_ERR("Unable to initialize DDE, DdeNameService failed\n"); goto done; } timer = SetTimer(NULL, 0, 5000, NULL); if (!timer) { WINE_ERR("SetTimer failed to create timer\n"); goto done; } while (!ddeString) { MSG msg; if (!GetMessageW(&msg, NULL, 0, 0)) break; if (msg.message == WM_TIMER) break; DispatchMessageW(&msg); } if (ddeString) { if (*ddeString == '"') { WCHAR *endquote = strchrW(ddeString + 1, '"'); if (!endquote) { WINE_ERR("Unable to retrieve URL from string %s\n", wine_dbgstr_w(ddeString)); goto done; } *endquote = 0; ret = ddeString+1; } else ret = ddeString; } done: if (timer) KillTimer(NULL, timer); if (ddeInst) { if (hszTopic && hszApplication) DdeNameService(ddeInst, hszApplication, 0, DNS_UNREGISTER); if (hszReturn) DdeFreeStringHandle(ddeInst, hszReturn); if (hszTopic) DdeFreeStringHandle(ddeInst, hszTopic); if (hszApplication) DdeFreeStringHandle(ddeInst, hszApplication); DdeUninitialize(ddeInst); } return ret; }