327 lines
9.5 KiB
C++
327 lines
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 |