winamp/Src/Winamp/Dde.cpp
2024-09-24 14:54:57 +02:00

327 lines
No EOL
9.5 KiB
C++

#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