aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/Dde.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/Dde.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/Dde.cpp')
-rw-r--r--Src/Winamp/Dde.cpp327
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