| Index: dxglcfg/dxglcfg.cpp |
| — | — | @@ -70,7 +70,7 @@ |
| 71 | 71 | bool tristate;
|
| 72 | 72 | TCHAR strdefault[] = _T("(global default)");
|
| 73 | 73 |
|
| 74 | | -DWORD AddApp(LPTSTR path, bool copyfile, bool admin)
|
| | 74 | +DWORD AddApp(LPCTSTR path, bool copyfile, bool admin)
|
| 75 | 75 | {
|
| 76 | 76 | bool installed = false;
|
| 77 | 77 | bool dxgl_installdir = false;
|
| — | — | @@ -141,6 +141,59 @@ |
| 142 | 142 | return 0;
|
| 143 | 143 | }
|
| 144 | 144 |
|
| | 145 | +DWORD DelApp(LPCTSTR path, bool admin)
|
| | 146 | +{
|
| | 147 | + bool installed = false;
|
| | 148 | + bool dxgl_installdir = false;
|
| | 149 | + tstring command;
|
| | 150 | + bool old_dxgl = true;
|
| | 151 | + DWORD sizeout = (MAX_PATH+1)*sizeof(TCHAR);
|
| | 152 | + TCHAR installpath[MAX_PATH+1];
|
| | 153 | + HKEY hKeyInstall;
|
| | 154 | + LONG error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\DXGL"),0,KEY_READ,&hKeyInstall);
|
| | 155 | + if(error == ERROR_SUCCESS)
|
| | 156 | + {
|
| | 157 | + dxgl_installdir = true;
|
| | 158 | + error = RegQueryValueEx(hKeyInstall,_T("InstallDir"),NULL,NULL,(LPBYTE)installpath,&sizeout);
|
| | 159 | + if(error == ERROR_SUCCESS) installed = true;
|
| | 160 | + }
|
| | 161 | + if(hKeyInstall) RegCloseKey(hKeyInstall);
|
| | 162 | + if(!installed)
|
| | 163 | + {
|
| | 164 | + GetModuleFileName(NULL,installpath,MAX_PATH+1);
|
| | 165 | + }
|
| | 166 | + HMODULE hmod = LoadLibrary(path);
|
| | 167 | + if(hmod)
|
| | 168 | + {
|
| | 169 | + if(!GetProcAddress(hmod,"IsDXGLDDraw")) old_dxgl = false;
|
| | 170 | + FreeLibrary(hmod);
|
| | 171 | + }
|
| | 172 | + if(!DeleteFile(path))
|
| | 173 | + {
|
| | 174 | + error = GetLastError();
|
| | 175 | + if(error == ERROR_FILE_NOT_FOUND) return 0;
|
| | 176 | + if((error == ERROR_ACCESS_DENIED) && !admin)
|
| | 177 | + {
|
| | 178 | + command.assign(_T(" remove "));
|
| | 179 | + command.append(path);
|
| | 180 | + SHELLEXECUTEINFO shex;
|
| | 181 | + ZeroMemory(&shex,sizeof(SHELLEXECUTEINFO));
|
| | 182 | + shex.cbSize = sizeof(SHELLEXECUTEINFO);
|
| | 183 | + shex.lpVerb = _T("runas");
|
| | 184 | + _tcscat(installpath,_T("\\dxglcfg.exe"));
|
| | 185 | + shex.lpFile = installpath;
|
| | 186 | + shex.lpParameters = command.c_str();
|
| | 187 | + ShellExecuteEx(&shex);
|
| | 188 | + WaitForSingleObject(shex.hProcess,INFINITE);
|
| | 189 | + DWORD exitcode;
|
| | 190 | + GetExitCodeProcess(shex.hProcess,&exitcode);
|
| | 191 | + return exitcode;
|
| | 192 | + }
|
| | 193 | + return error;
|
| | 194 | + }
|
| | 195 | + return 0;
|
| | 196 | +}
|
| | 197 | +
|
| 145 | 198 | void SaveChanges(HWND hWnd)
|
| 146 | 199 | {
|
| 147 | 200 | if(apps[0].dirty) SetGlobalConfig(&apps[0].cfg);
|
| — | — | @@ -920,15 +973,45 @@ |
| 921 | 974 |
|
| 922 | 975 | break;
|
| 923 | 976 | case IDC_REMOVE:
|
| 924 | | - if(!(GetWindowLong(GetDlgItem(hWnd,IDC_APPLY),GWL_STYLE) & WS_DISABLED))
|
| | 977 | + if(MessageBox(hWnd,_T("Do you want to delete the selected application profile and remove DXGL from its installation folder(s)?"),
|
| | 978 | + _T("Confirmation"),MB_YESNO|MB_ICONQUESTION) != IDYES) return false;
|
| | 979 | + tstring regpath = _T("Software\\DXGL\\");
|
| | 980 | + tstring regkey = *apps[current_app].regkey;
|
| | 981 | + regpath.append(*apps[current_app].regkey);
|
| | 982 | + RegOpenKeyEx(HKEY_CURRENT_USER,regpath.c_str(),0,KEY_READ,&hKey);
|
| | 983 | + RegQueryValueEx(hKey,_T("InstallPaths"),NULL,NULL,NULL,&buffersize);
|
| | 984 | + regbuffer = (LPTSTR)malloc(buffersize);
|
| | 985 | + regbuffer[0] = regbuffer[1] = 0;
|
| | 986 | + error = RegQueryValueEx(hKey,_T("InstallPaths"),NULL,NULL,(LPBYTE)regbuffer,&buffersize);
|
| | 987 | + regbufferpos = 0;
|
| | 988 | + bool failed = false;
|
| | 989 | + while(1)
|
| 925 | 990 | {
|
| 926 | | - if(MessageBox(hWnd,_T("Do you want to delete the selected application profile and remove DXGL from its installation folder(s)?"),
|
| 927 | | - _T("Confirmation"),MB_YESNO|MB_ICONQUESTION) == IDNO) return false;
|
| 928 | | -
|
| | 991 | + if((regbuffer[regbufferpos] == 0) || error != ERROR_SUCCESS) break;
|
| | 992 | + if(regkey.rfind(_T("-")) != -1) regkey.resize(regkey.rfind(_T("-")));
|
| | 993 | + path = tstring(((LPTSTR)regbuffer+regbufferpos))+tstring(_T("\\ddraw.dll"));
|
| | 994 | + if(GetFileAttributes(path.c_str()) == INVALID_FILE_ATTRIBUTES)
|
| | 995 | + {
|
| | 996 | + regbufferpos += (_tcslen(regbuffer+regbufferpos)+1);
|
| | 997 | + continue;
|
| | 998 | + }
|
| | 999 | + if(DelApp(path.c_str(),false)) failed = true;
|
| | 1000 | + regbufferpos += (_tcslen(regbuffer+regbufferpos)+1);
|
| 929 | 1001 | }
|
| 930 | | - // Delete app profile
|
| 931 | | -
|
| 932 | | -
|
| | 1002 | + RegCloseKey(hKey);
|
| | 1003 | + if(!failed)
|
| | 1004 | + {
|
| | 1005 | + RegDeleteKey(HKEY_CURRENT_USER,regpath.c_str());
|
| | 1006 | + if(!apps[current_app].icon_shared) DeleteObject(apps[current_app].icon);
|
| | 1007 | + if(apps[current_app].name) delete apps[current_app].name;
|
| | 1008 | + if(apps[current_app].regkey) delete apps[current_app].regkey;
|
| | 1009 | + for(int i = current_app; i < appcount; i++)
|
| | 1010 | + {
|
| | 1011 | + apps[i] = apps[i+1];
|
| | 1012 | + }
|
| | 1013 | + appcount--;
|
| | 1014 | + }
|
| | 1015 | + SendDlgItemMessage(hWnd,IDC_APPS,LB_DELETESTRING,current_app,NULL);
|
| 933 | 1016 | break;
|
| 934 | 1017 | }
|
| 935 | 1018 | break;
|
| — | — | @@ -955,6 +1038,10 @@ |
| 956 | 1039 | {
|
| 957 | 1040 | return AddApp(lpCmdLine+8,true,true);
|
| 958 | 1041 | }
|
| | 1042 | + if(!_tcsnicmp(lpCmdLine,_T("remove "),7))
|
| | 1043 | + {
|
| | 1044 | + return DelApp(lpCmdLine+7,true);
|
| | 1045 | + }
|
| 959 | 1046 | icc.dwSize = sizeof(icc);
|
| 960 | 1047 | icc.dwICC = ICC_WIN95_CLASSES;
|
| 961 | 1048 | HMODULE comctl32 = LoadLibrary(_T("comctl32.dll"));
|