diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/Dde.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Winamp/Dde.cpp')
-rw-r--r-- | Src/Winamp/Dde.cpp | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/Src/Winamp/Dde.cpp b/Src/Winamp/Dde.cpp new file mode 100644 index 00000000..a0a15bcd --- /dev/null +++ b/Src/Winamp/Dde.cpp @@ -0,0 +1,327 @@ +#include "Main.h" + +/* +static HDDEDATA CALLBACK GroupDDECallback (UINT uiType, UINT uiFmt, HANDLE hConv, + HSZ sz1, HSZ sz2, HDDEDATA hData, LONG lData1, LONG lData2) { + return ((HDDEDATA) NULL); +} +static BOOL CreateGroup(HWND hwnd); +static BOOL AddProgramItems (HWND hwnd, LPSTR szDummy); + +static CONVCONTEXT CCFilter = { sizeof (CONVCONTEXT), 0, 0, 0, 0L, 0L }; +static LONG lIdInst; +static LONG lIdInst2; +*/ + +//CreateShortCut(hwnd,"D:\\WINNT\\Profiles\\Administrator\\Application Data\\Microsoft\\Internet Explorer\\Quick Launch\\Winamp.lnk","C:\\winamp\\winamp.exe"); +//CreateShortCut(hwnd,"D:\\WINNT\\Profiles\\Administrator\\Desktop\\Winamp.lnk","C:\\winamp\\winamp.exe"); + + +#if 0 +void dde_adddesktop(HWND hwnd) +{ + HKEY mp3Key; + char name[MAX_PATH]=""; + if (RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",&mp3Key) == ERROR_SUCCESS) + { + int s=sizeof(name); + if (RegQueryValueEx(mp3Key,"Desktop",0,NULL,name,&s) == ERROR_SUCCESS) + { + } + RegCloseKey(mp3Key); + } + if (lstrlen(name)) + { + char exe[MAX_PATH]; + GetModuleFileName(NULL,exe,sizeof(exe)); + lstrcat(name,"\\WINAMP.LNK"); + CreateShortCut(hwnd,name,exe,NULL,0); + } +} + + +void dde_addquicklaunch(HWND hwnd) +{ + HKEY mp3Key; + char name[MAX_PATH]=""; + if (RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",&mp3Key) == ERROR_SUCCESS) + { + int s=sizeof(name); + if (RegQueryValueEx(mp3Key,"AppData",0,NULL,name,&s) == ERROR_SUCCESS) + { + } + RegCloseKey(mp3Key); + } + if (lstrlen(name)) + { + char exe[MAX_PATH]; + GetModuleFileName(NULL,exe,sizeof(exe)); + lstrcat(name,"\\Microsoft\\Internet Explorer\\Quick Launch\\WINAMP.LNK"); + CreateShortCut(hwnd,name,exe,NULL,0); + } +} + +int dde_isquicklaunchavailable(void) +{ + HKEY mp3Key; + char name[MAX_PATH]=""; + if (RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",&mp3Key) == ERROR_SUCCESS) + { + int s=sizeof(name); + if (RegQueryValueEx(mp3Key,"AppData",0,NULL,name,&s) == ERROR_SUCCESS) + { + } + RegCloseKey(mp3Key); + } + if (lstrlen(name)) + { + HANDLE h; + WIN32_FIND_DATA fd; + lstrcat(name,"\\Microsoft\\Internet Explorer\\Quick Launch"); + h=FindFirstFile(name,&fd); + if (h != INVALID_HANDLE_VALUE) + { + FindClose(h); + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) return 1; + + } + } + return 0; +} + + +#if 1 +int dde_addstart(HWND hwnd) +{ + HKEY mp3Key; + char startMenu[MAX_PATH]=""; + if (RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",&mp3Key) == ERROR_SUCCESS) + { + int s=sizeof(startMenu)/sizeof(startMenu[0]); + if (RegQueryValueEx(mp3Key, "Programs", 0, NULL, startMenu, &s) == ERROR_SUCCESS) + { + char exe[MAX_PATH], shortcut[MAX_PATH], target[MAX_PATH]; + GetModuleFileName(NULL,exe,sizeof(exe)); + + // create Winamp folder + PathAppend(startMenu, "Winamp"); + CreateDirectory(startMenu, NULL); + + // winamp.exe + PathCombine(shortcut, startMenu, "Winamp.lnk"); + CreateShortCut(hwnd, shortcut, exe, NULL, 0); + + // we don't need the executable filename anymore, but we need its path + PathRemoveFileSpec(exe); + + // whatsnew.txt + PathCombine(target, exe, "whatsnew.txt"); + PathCombine(shortcut, startMenu, "What's new.lnk"); + CreateShortCut(hwnd, startMenu, target, NULL, 0); + + // uninstwa.exe + PathCombine(shortcut, startMenu, "Uninstall Winamp.lnk"); + PathAppend(target, exe, "uninstwa.exe"); + CreateShortCut(hwnd, shortcut, target, NULL, 0); + } + RegCloseKey(mp3Key); + } + return 0; +} + + +#else + +int dde_addstart(HWND hwnd) +{ + CreateGroup(hwnd); + AddProgramItems (hwnd, NULL); + return 0; +} + +void dde_delstart(void) +{ + HDDEDATA hData; + LPSTR szText; + LPSTR szCommand; + HCONV hConv; + HSZ szProgMan; + LONG lResult; + szText = VirtualAlloc (NULL, 64, MEM_COMMIT, PAGE_READWRITE); + szCommand = VirtualAlloc (NULL, 128, MEM_COMMIT, PAGE_READWRITE); + if (szText) { + if (DdeInitialize(&lIdInst, (PFNCALLBACK) GroupDDECallback, + (DWORD) APPCMD_CLIENTONLY, 0L)) { + VirtualFree (szText, 128, MEM_DECOMMIT); + return; + } + szProgMan = DdeCreateStringHandle (lIdInst, "PROGMAN", CP_WINANSI); + if (szProgMan) { + hConv = DdeConnect (lIdInst, szProgMan, szProgMan, &CCFilter); + lstrcpy(szText,app_name); + wsprintf (szCommand, "[DeleteGroup(%s)]", szText); + hData = DdeCreateDataHandle (lIdInst, szCommand, + lstrlen (szCommand) + 1, 0, (HSZ) NULL, CF_TEXT, 0L); + if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF, hConv, + (HSZ) NULL, 0, XTYP_EXECUTE, 10000, &lResult)) { + lResult = DdeGetLastError (lIdInst); + } + + DdeFreeStringHandle (lIdInst, szProgMan); + DdeDisconnect (hConv); + } else { + lResult = DdeGetLastError (lIdInst); + } + VirtualFree (szText, 64, MEM_DECOMMIT); + VirtualFree (szCommand, 64, MEM_DECOMMIT); + DdeUninitialize (lIdInst); + lIdInst = 0L; + return; + } else { + } +} + +static BOOL CreateGroup(HWND hwnd) { + HDDEDATA hData; + LPSTR szText; + LPSTR szCommand; + HCONV hConv; + HSZ szProgMan; + LONG lResult; + szText = VirtualAlloc (NULL, 64, MEM_COMMIT, PAGE_READWRITE); + szCommand = VirtualAlloc (NULL, 128, MEM_COMMIT, PAGE_READWRITE); + if (szText) { + if (DdeInitialize(&lIdInst, (PFNCALLBACK) GroupDDECallback, + (DWORD) APPCMD_CLIENTONLY, 0L)) { +// MessageBox (hwnd, "DDEML Initialization Failure", "Error", MB_OK); + VirtualFree (szText, 128, MEM_DECOMMIT); + return (FALSE); + } + szProgMan = DdeCreateStringHandle (lIdInst, "PROGMAN", CP_WINANSI); + if (szProgMan) { + hConv = DdeConnect (lIdInst, szProgMan, szProgMan, &CCFilter); + lstrcpy(szText,app_name); + wsprintf (szCommand, "[CreateGroup(%s)]", szText); + hData = DdeCreateDataHandle (lIdInst, szCommand, + lstrlen (szCommand) + 1, 0, (HSZ) NULL, CF_TEXT, 0L); + if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF, hConv, + (HSZ) NULL, 0, XTYP_EXECUTE, 10000, &lResult)) { + lResult = DdeGetLastError (lIdInst); +// MessageBox (hwnd, "DdeClientTransaction Failed", "Error", + // MB_OK); + } + + DdeFreeStringHandle (lIdInst, szProgMan); + DdeDisconnect (hConv); + } else { + lResult = DdeGetLastError (lIdInst); + } + VirtualFree (szText, 64, MEM_DECOMMIT); + VirtualFree (szCommand, 64, MEM_DECOMMIT); + DdeUninitialize (lIdInst); + lIdInst = 0L; + return (TRUE); + } else { +// MessageBox (hwnd, "Memory Allocation failure", "Error", MB_OK); + } + return (FALSE); +} + + +static BOOL AddProgramItems (HWND hwnd, LPSTR szDummy) { + HDDEDATA hData; + HCONV hConv; + HSZ szProgMan; + int lSelCount; + LONG lResult; + LPLONG lpSelection; + LPSTR szProgName; + LPSTR szExePath; + LPSTR szExecuteString; + int iIndex; + int iGroupCount; + + iGroupCount = 2; + lSelCount = 3; + + lpSelection = VirtualAlloc (NULL, lSelCount * sizeof (int), MEM_COMMIT,PAGE_READWRITE); + if (lpSelection) { + if (DdeInitialize (&lIdInst2, (PFNCALLBACK) GroupDDECallback, + (DWORD) APPCMD_CLIENTONLY, 0L)) { + VirtualFree (lpSelection, lSelCount * sizeof (int), MEM_DECOMMIT); + return (FALSE); + } + + szProgMan = DdeCreateStringHandle (lIdInst2, "PROGMAN", CP_WINANSI); + hConv = DdeConnect (lIdInst2, szProgMan, szProgMan, &CCFilter); + DdeFreeStringHandle (lIdInst2, szProgMan); + szProgName = VirtualAlloc (NULL, MAX_PATH * 2, MEM_COMMIT, PAGE_READWRITE); + szExePath = szProgName + MAX_PATH; + + szExecuteString = VirtualAlloc (NULL, MAX_PATH * 4, MEM_COMMIT, + PAGE_READWRITE); + + for (iIndex = 0; iIndex < lSelCount; iIndex++) { + { + static char *paths[4] = { + "Winamp.exe", + "WhatsNew.txt", + "Winamp.exe" + }; + static char *names[4] = + { + "Winamp", + "What's New", + "Uninstall Winamp", + + }; + lstrcpy(szProgName,names[iIndex]); + { + szExePath[0] = '\"'; + GetModuleFileName(NULL,szExePath+1,MAX_PATH); + scanstr_back(szExePath,"\\",szExePath-1)[1]=0; + lstrcat(szExePath,paths[iIndex]); + lstrcat(szExePath,"\""); + if (iIndex==2) lstrcat(szExePath," /UNINSTALL"); + } + } + +// Create the command string to add the item. + wsprintf (szExecuteString, "[AddItem(%s,%s)]", szExePath, + (LPARAM) szProgName); + +// Create a DDEML Data handle for the command string. + hData = DdeCreateDataHandle (lIdInst2, szExecuteString, + lstrlen (szExecuteString) + 1, 0, (HSZ) NULL, CF_TEXT, 0L); + +// Send the command over to the program manager. + if (!DdeClientTransaction ((LPBYTE) hData, 0xFFFFFFFF, + hConv, (HSZ) NULL, 0, XTYP_EXECUTE, 1000, &lResult)) { + lResult = DdeGetLastError (lIdInst2); + }/*endIf*/ + }/*endFor*/ + +// Release the memory allocated for path and name retrieval. + VirtualFree (szProgName, MAX_PATH * 2, MEM_DECOMMIT); + +// Release the command line memory. + VirtualFree (szExecuteString, MAX_PATH * 4, MEM_DECOMMIT); + +// Disoconnect the DDEML Conversation + DdeDisconnect (hConv); + +// Release the memory allocate for the list selections. + VirtualFree (lpSelection, lSelCount * sizeof (int), MEM_DECOMMIT); + }/*endIf*/ + +// Clear the selection in the lists. + +// Uninitialize the local conversation. + DdeUninitialize (lIdInst2); + + lIdInst2 = 0L; + return (TRUE); +}/* end AddProgramItems */ +#endif + +#endif
\ No newline at end of file |