mirror of
https://github.com/reactos/reactos.git
synced 2025-05-18 16:51:18 +00:00
- Add console version Appwiz. It is not finished, but fully works
svn path=/trunk/; revision=34902
This commit is contained in:
parent
b971b4d659
commit
94f599dec2
4 changed files with 278 additions and 0 deletions
261
rosapps/applications/cmdutils/appwiz/appwiz.c
Normal file
261
rosapps/applications/cmdutils/appwiz/appwiz.c
Normal file
|
@ -0,0 +1,261 @@
|
|||
/*
|
||||
*
|
||||
* PROJECT: Add or Remove Programs (Console Version)
|
||||
* FILE: rosapps/applications/cmdutils/appwiz/appwiz.c
|
||||
* PURPOSE: ReactOS Software Control Panel
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* UPDATE HISTORY:
|
||||
* 07-28-2008 Created
|
||||
*/
|
||||
|
||||
#define SHOW_ALL 1
|
||||
#define APP_ONLY 2
|
||||
#define UPD_ONLY 3
|
||||
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <tchar.h>
|
||||
|
||||
|
||||
void PrintHelp()
|
||||
{
|
||||
printf(_T("Add or Remove Programs\n\
|
||||
APPWIZ [/? /l] [/all /app /upd]\n\
|
||||
/?\t Help\n\
|
||||
/l\t Show list\n\
|
||||
/all\t Show programs and updates\n\
|
||||
/app\t Show programs only\n\
|
||||
/upd\t Show updates only\n"));
|
||||
_getch();
|
||||
}
|
||||
|
||||
|
||||
void RunGUIAppWiz()
|
||||
{
|
||||
SHELLEXECUTEINFO shInputDll;
|
||||
|
||||
memset(&shInputDll, 0x0, sizeof(SHELLEXECUTEINFO));
|
||||
shInputDll.cbSize = sizeof(shInputDll);
|
||||
shInputDll.hwnd = NULL;
|
||||
shInputDll.lpVerb = _T("open");
|
||||
shInputDll.lpFile = _T("RunDll32.exe");
|
||||
shInputDll.lpParameters = _T("shell32.dll,Control_RunDLL appwiz.cpl");
|
||||
|
||||
if (ShellExecuteEx(&shInputDll) == 0)
|
||||
{
|
||||
MessageBox(NULL, _T("Can not start appwiz.cpl"), NULL, MB_OK | MB_ICONERROR);
|
||||
}
|
||||
}
|
||||
|
||||
void CallUninstall(LPTSTR szUninstallString)
|
||||
{
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
DWORD dwRet;
|
||||
MSG msg;
|
||||
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
si.wShowWindow = SW_SHOW;
|
||||
|
||||
if (CreateProcess(NULL, szUninstallString, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
||||
{
|
||||
CloseHandle(pi.hThread);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
dwRet = MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_ALLEVENTS);
|
||||
if (dwRet == WAIT_OBJECT_0 + 1)
|
||||
{
|
||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
else if (dwRet == WAIT_OBJECT_0 || dwRet == WAIT_FAILED)
|
||||
break;
|
||||
}
|
||||
CloseHandle(pi.hProcess);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
dwMode:
|
||||
SHOW_ALL - Applications & Updates
|
||||
APP_ONLY - Applications only
|
||||
UPD_ONLY - Updates only
|
||||
*/
|
||||
int ShowAppList(DWORD dwMode, INT iItem)
|
||||
{
|
||||
HKEY hKey, hSubKey;
|
||||
DWORD dwSize, dwType, dwValue;
|
||||
TCHAR szName[MAX_PATH];
|
||||
TCHAR szParentKeyName[MAX_PATH];
|
||||
TCHAR szDisplayName[MAX_PATH];
|
||||
TCHAR szOutBuf[MAX_PATH];
|
||||
FILETIME FileTime;
|
||||
BOOL bIsUpdate = FALSE;
|
||||
BOOL bIsSystemComponent = FALSE;
|
||||
INT iIndex = 0, iColor = 0, iCount = 1;
|
||||
HANDLE hOutput;
|
||||
|
||||
if (RegOpenKey(HKEY_LOCAL_MACHINE,
|
||||
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),
|
||||
&hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
printf(_T("ERROR: Can not open Uninstall key. Press any key for continue...\n"));
|
||||
_getch();
|
||||
return 0;
|
||||
}
|
||||
|
||||
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
SetConsoleTextAttribute(hOutput, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||
|
||||
dwSize = MAX_PATH;
|
||||
while (RegEnumKeyEx(hKey, iIndex, szName, &dwSize, NULL, NULL, NULL, &FileTime) == ERROR_SUCCESS)
|
||||
{
|
||||
if (RegOpenKey(hKey, szName, &hSubKey) == ERROR_SUCCESS)
|
||||
{
|
||||
dwType = REG_DWORD;
|
||||
dwSize = sizeof(DWORD);
|
||||
|
||||
if (RegQueryValueEx(hSubKey, _T("SystemComponent"),
|
||||
NULL, &dwType,
|
||||
(LPBYTE)&dwValue, &dwSize) == ERROR_SUCCESS)
|
||||
{
|
||||
bIsSystemComponent = (dwValue == 0x1);
|
||||
}
|
||||
else
|
||||
{
|
||||
bIsSystemComponent = FALSE;
|
||||
}
|
||||
|
||||
dwType = REG_SZ;
|
||||
dwSize = MAX_PATH;
|
||||
|
||||
bIsUpdate = (RegQueryValueEx(hSubKey, _T("ParentKeyName"),
|
||||
NULL, &dwType,
|
||||
(LPBYTE) szParentKeyName,
|
||||
&dwSize) == ERROR_SUCCESS);
|
||||
dwSize = MAX_PATH;
|
||||
if (RegQueryValueEx(hSubKey, _T("DisplayName"),
|
||||
NULL, &dwType,
|
||||
(LPBYTE) szDisplayName,
|
||||
&dwSize) == ERROR_SUCCESS)
|
||||
{
|
||||
if (!bIsSystemComponent)
|
||||
{
|
||||
if ((dwMode == SHOW_ALL) || ((dwMode == APP_ONLY) && (!bIsUpdate)) || ((dwMode == UPD_ONLY) && (bIsUpdate)))
|
||||
{
|
||||
if (iItem == -1)
|
||||
{
|
||||
wsprintf(szOutBuf, _T(" %d \t %s\n"), iCount, szDisplayName);
|
||||
CharToOem(szOutBuf, szOutBuf);
|
||||
printf("%s", szOutBuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
dwType = REG_SZ;
|
||||
dwSize = MAX_PATH;
|
||||
|
||||
if ((RegQueryValueEx(hSubKey, _T("UninstallString"), NULL, &dwType,
|
||||
(LPBYTE) szOutBuf, &dwSize) == ERROR_SUCCESS) && (iItem == iCount))
|
||||
{
|
||||
CallUninstall(szOutBuf);
|
||||
}
|
||||
}
|
||||
iCount++;
|
||||
iColor++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (iColor <= 5)
|
||||
{
|
||||
SetConsoleTextAttribute(hOutput, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetConsoleTextAttribute(hOutput, FOREGROUND_GREEN | FOREGROUND_INTENSITY | FOREGROUND_RED);
|
||||
if (iColor >= 10) iColor = 0;
|
||||
}
|
||||
|
||||
dwSize = MAX_PATH;
|
||||
iIndex++;
|
||||
}
|
||||
|
||||
RegCloseKey(hSubKey);
|
||||
RegCloseKey(hKey);
|
||||
|
||||
SetConsoleTextAttribute(hOutput, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||
printf("\n\nPlease enter application/update number and press ENTER for uninstall\nor press any key for Exit...\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int _tmain(int argc, _TCHAR* argv[])
|
||||
{
|
||||
INT iNumber;
|
||||
TCHAR Char[4 + 1];
|
||||
|
||||
SetConsoleTitle(_T("Application Wizard"));
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
RunGUIAppWiz();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_tcsncmp(argv[1], _T("/?"), 2) == 0)
|
||||
{
|
||||
PrintHelp();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_tcsncmp(argv[1], _T("/l"), 2) == 0)
|
||||
{
|
||||
if (argc < 3) goto ShowAll;
|
||||
if (_tcsncmp(argv[2], _T("/all"), 4) == 0)
|
||||
{
|
||||
ShowAll:
|
||||
if (ShowAppList(SHOW_ALL, -1) == 0) return 0;
|
||||
scanf(_T("%s"), Char);
|
||||
|
||||
iNumber = atoi(Char);
|
||||
|
||||
if (iNumber == 0) return 0;
|
||||
ShowAppList(SHOW_ALL, iNumber);
|
||||
}
|
||||
else if (_tcsncmp(argv[2], _T("/app"), 4) == 0)
|
||||
{
|
||||
if (ShowAppList(APP_ONLY, -1) == 0) return 0;
|
||||
|
||||
scanf(_T("%s"), Char);
|
||||
|
||||
iNumber = atoi(Char);
|
||||
|
||||
if (iNumber == 0) return 0;
|
||||
ShowAppList(APP_ONLY, iNumber);
|
||||
}
|
||||
else if (_tcsncmp(argv[2], _T("/upd"), 4) == 0)
|
||||
{
|
||||
if (ShowAppList(UPD_ONLY, -1) == 0) return 0;
|
||||
|
||||
scanf(_T("%s"), Char);
|
||||
|
||||
iNumber = atoi(Char);
|
||||
|
||||
if (iNumber == 0) return 0;
|
||||
ShowAppList(UPD_ONLY, iNumber);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
10
rosapps/applications/cmdutils/appwiz/appwiz.rbuild
Normal file
10
rosapps/applications/cmdutils/appwiz/appwiz.rbuild
Normal file
|
@ -0,0 +1,10 @@
|
|||
<module name="appwiz.exe" type="win32cui" installbase="system32" installname="appwiz.exe">
|
||||
<define name="_WIN32_IE">0x0501</define>
|
||||
<define name="_WIN32_WINNT">0x0501</define>
|
||||
<library>kernel32</library>
|
||||
<library>advapi32</library>
|
||||
<library>user32</library>
|
||||
<library>shell32</library>
|
||||
<file>appwiz.c</file>
|
||||
<file>appwiz.rc</file>
|
||||
</module>
|
4
rosapps/applications/cmdutils/appwiz/appwiz.rc
Normal file
4
rosapps/applications/cmdutils/appwiz/appwiz.rc
Normal file
|
@ -0,0 +1,4 @@
|
|||
#define REACTOS_STR_FILE_DESCRIPTION "Add or Remove Programs (Console Version)\0"
|
||||
#define REACTOS_STR_INTERNAL_NAME "appwiz\0"
|
||||
#define REACTOS_STR_ORIGINAL_FILENAME "appwiz.exe\0"
|
||||
#include <reactos/version.rc>
|
|
@ -1,5 +1,8 @@
|
|||
<?xml version="1.0"?>
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<directory name="appwiz">
|
||||
<xi:include href="appwiz/appwiz.rbuild" />
|
||||
</directory>
|
||||
<directory name="comp">
|
||||
<xi:include href="comp/comp.rbuild" />
|
||||
</directory>
|
||||
|
|
Loading…
Reference in a new issue