[CONTROL]

- Remove undeeded files.
- Fully convert the app to UNICODE.
- Code cleanup.

svn path=/trunk/; revision=62694
This commit is contained in:
Hermès Bélusca-Maïto 2014-04-09 12:29:57 +00:00
parent 707b9ab918
commit 9ef6a8868b
5 changed files with 130 additions and 291 deletions

View file

@ -1,5 +1,5 @@
add_executable(control control.c control.rc) add_executable(control control.c control.rc)
set_module_type(control win32gui UNICODE) set_module_type(control win32gui UNICODE)
add_importlibs(control advapi32 shell32 msvcrt kernel32) add_importlibs(control advapi32 shell32 user32 msvcrt kernel32)
add_cd_file(TARGET control DESTINATION reactos/system32 FOR all) add_cd_file(TARGET control DESTINATION reactos/system32 FOR all)

View file

@ -6,154 +6,182 @@
* Colin Finck (mail@colinfinck.de) * Colin Finck (mail@colinfinck.de)
*/ */
#include "control.h" #include <stdio.h>
static const TCHAR szWindowClass[] = _T("DummyControlClass"); #define WIN32_NO_STATUS
HANDLE hProcessHeap; #include <windef.h>
HINSTANCE hInst; #include <winbase.h>
#include <winuser.h>
#include <winreg.h>
#include <shellapi.h>
static #include "resource.h"
INT
OpenShellFolder(LPTSTR lpFolderCLSID)
{
TCHAR szParameters[MAX_PATH];
/* Open a shell folder using "explorer.exe". #define MAX_VALUE_NAME 16383
The passed CLSID's are all subfolders of the "Control Panel" shell folder. */
_tcscpy(szParameters, _T("/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"));
_tcscat(szParameters, lpFolderCLSID);
return (INT_PTR)ShellExecute(NULL, /*
_T("open"), * Macro for calling "rundll32.exe"
_T("explorer.exe"), * According to MSDN, ShellExecute returns a value greater than 32
szParameters, * if the operation was successful.
NULL, */
SW_SHOWDEFAULT) > 32; #define RUNDLL(param) \
} ((INT_PTR)ShellExecuteW(NULL, L"open", L"rundll32.exe", (param), NULL, SW_SHOWDEFAULT) > 32)
static VOID
INT
RunControlPanel(LPTSTR lpCmd)
{
TCHAR szParameters[MAX_PATH];
_tcscpy(szParameters, _T("shell32.dll,Control_RunDLL "));
_tcscat(szParameters, lpCmd);
return RUNDLL(szParameters);
}
int
WINAPI WINAPI
_tWinMain(HINSTANCE hInstance, Control_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow);
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, static INT
int nCmdShow) OpenShellFolder(LPWSTR lpFolderCLSID)
{
WCHAR szParameters[MAX_PATH];
/*
* Open a shell folder using "explorer.exe". The passed CLSIDs
* are all subfolders of the "Control Panel" shell folder.
*/
wcscpy(szParameters, L"/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}");
wcscat(szParameters, lpFolderCLSID);
return (INT_PTR)ShellExecuteW(NULL,
L"open",
L"explorer.exe",
szParameters,
NULL,
SW_SHOWDEFAULT) > 32;
}
static INT
RunControlPanel(LPCWSTR lpCmd)
{
/*
* Old method:
*
WCHAR szParameters[MAX_PATH];
wcscpy(szParameters, L"shell32.dll,Control_RunDLL ");
wcscat(szParameters, lpCmd);
return RUNDLL(szParameters);
*/
/* New method: */
Control_RunDLLW(GetDesktopWindow(), 0, lpCmd, SW_SHOW);
return 1;
}
INT
WINAPI
wWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
INT nCmdShow)
{ {
HKEY hKey; HKEY hKey;
hInst = hInstance;
hProcessHeap = GetProcessHeap();
/* Show the control panel window if no argument or "panel" was passed */ /* Show the control panel window if no argument or "panel" was passed */
if(lpCmdLine[0] == 0 || !_tcsicmp(lpCmdLine, _T("panel"))) if (*lpCmdLine == 0 || !_wcsicmp(lpCmdLine, L"panel"))
return OpenShellFolder(_T("")); return OpenShellFolder(L"");
/* Check one of the built-in control panel handlers */ /* Check one of the built-in control panel handlers */
if (!_tcsicmp(lpCmdLine, _T("admintools"))) return OpenShellFolder(_T("\\::{D20EA4E1-3957-11d2-A40B-0C5020524153}")); if (!_wcsicmp(lpCmdLine, L"admintools")) return OpenShellFolder(L"\\::{D20EA4E1-3957-11d2-A40B-0C5020524153}");
else if (!_tcsicmp(lpCmdLine, _T("color"))) return RunControlPanel(_T("desk.cpl")); /* TODO: Switch to the "Apperance" tab */ else if (!_wcsicmp(lpCmdLine, L"color")) return RunControlPanel(L"desk.cpl"); /* TODO: Switch to the "Apperance" tab */
else if (!_tcsicmp(lpCmdLine, _T("date/time"))) return RunControlPanel(_T("timedate.cpl")); else if (!_wcsicmp(lpCmdLine, L"date/time")) return RunControlPanel(L"timedate.cpl");
else if (!_tcsicmp(lpCmdLine, _T("desktop"))) return RunControlPanel(_T("desk.cpl")); else if (!_wcsicmp(lpCmdLine, L"desktop")) return RunControlPanel(L"desk.cpl");
else if (!_tcsicmp(lpCmdLine, _T("folders"))) return RUNDLL(_T("shell32.dll,Options_RunDLL")); else if (!_wcsicmp(lpCmdLine, L"folders")) return RUNDLL(L"shell32.dll,Options_RunDLL");
else if (!_tcsicmp(lpCmdLine, _T("fonts"))) return OpenShellFolder(_T("\\::{D20EA4E1-3957-11d2-A40B-0C5020524152}")); else if (!_wcsicmp(lpCmdLine, L"fonts")) return OpenShellFolder(L"\\::{D20EA4E1-3957-11d2-A40B-0C5020524152}");
else if (!_tcsicmp(lpCmdLine, _T("infrared"))) return RunControlPanel(_T("irprops.cpl")); else if (!_wcsicmp(lpCmdLine, L"infrared")) return RunControlPanel(L"irprops.cpl");
else if (!_tcsicmp(lpCmdLine, _T("international"))) return RunControlPanel(_T("intl.cpl")); else if (!_wcsicmp(lpCmdLine, L"international")) return RunControlPanel(L"intl.cpl");
else if (!_tcsicmp(lpCmdLine, _T("keyboard"))) return RunControlPanel(_T("main.cpl @1")); else if (!_wcsicmp(lpCmdLine, L"keyboard")) return RunControlPanel(L"main.cpl @1");
else if (!_tcsicmp(lpCmdLine, _T("mouse"))) return RunControlPanel(_T("main.cpl @0")); else if (!_wcsicmp(lpCmdLine, L"mouse")) return RunControlPanel(L"main.cpl @0");
else if (!_tcsicmp(lpCmdLine, _T("netconnections"))) return OpenShellFolder(_T("\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}")); else if (!_wcsicmp(lpCmdLine, L"netconnections")) return OpenShellFolder(L"\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}");
else if (!_tcsicmp(lpCmdLine, _T("netware"))) return RunControlPanel(_T("nwc.cpl")); else if (!_wcsicmp(lpCmdLine, L"netware")) return RunControlPanel(L"nwc.cpl");
else if (!_tcsicmp(lpCmdLine, _T("ports"))) return RunControlPanel(_T("sysdm.cpl")); /* TODO: Switch to the "Computer Name" tab */ else if (!_wcsicmp(lpCmdLine, L"ports")) return RunControlPanel(L"sysdm.cpl"); /* TODO: Switch to the "Computer Name" tab */
else if (!_tcsicmp(lpCmdLine, _T("printers"))) return OpenShellFolder(_T("\\::{2227A280-3AEA-1069-A2DE-08002B30309D}")); else if (!_wcsicmp(lpCmdLine, L"printers")) return OpenShellFolder(L"\\::{2227A280-3AEA-1069-A2DE-08002B30309D}");
else if (!_tcsicmp(lpCmdLine, _T("scannercamera"))) return OpenShellFolder(_T("\\::{E211B736-43FD-11D1-9EFB-0000F8757FCD}")); else if (!_wcsicmp(lpCmdLine, L"scannercamera")) return OpenShellFolder(L"\\::{E211B736-43FD-11D1-9EFB-0000F8757FCD}");
else if (!_tcsicmp(lpCmdLine, _T("schedtasks"))) return OpenShellFolder(_T("\\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}")); else if (!_wcsicmp(lpCmdLine, L"schedtasks")) return OpenShellFolder(L"\\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}");
else if (!_tcsicmp(lpCmdLine, _T("telephony"))) return RunControlPanel(_T("telephon.cpl")); else if (!_wcsicmp(lpCmdLine, L"telephony")) return RunControlPanel(L"telephon.cpl");
else if (!_tcsicmp(lpCmdLine, _T("userpasswords"))) return RunControlPanel(_T("nusrmgr.cpl")); /* Graphical User Account Manager */ else if (!_wcsicmp(lpCmdLine, L"userpasswords")) return RunControlPanel(L"nusrmgr.cpl"); /* Graphical User Account Manager */
else if (!_tcsicmp(lpCmdLine, _T("userpasswords2"))) return RUNDLL(_T("netplwiz.dll,UsersRunDll")); /* Dialog based advanced User Account Manager */ else if (!_wcsicmp(lpCmdLine, L"userpasswords2")) return RUNDLL(L"netplwiz.dll,UsersRunDll"); /* Dialog based advanced User Account Manager */
/* It is none of them, so look for a handler in the registry */ /* It is none of them, so look for a handler in the registry */
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"), L"Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls",
0, 0,
KEY_QUERY_VALUE, KEY_QUERY_VALUE,
&hKey) == ERROR_SUCCESS) &hKey) == ERROR_SUCCESS)
{ {
DWORD dwIndex; DWORD dwIndex;
for(dwIndex = 0; ; ++dwIndex) for (dwIndex = 0; ; ++dwIndex)
{ {
DWORD dwDataSize; DWORD dwDataSize;
DWORD dwValueSize = MAX_VALUE_NAME; DWORD dwValueSize = MAX_VALUE_NAME;
TCHAR szValueName[MAX_VALUE_NAME]; WCHAR szValueName[MAX_VALUE_NAME];
/* Get the value name and data size */ /* Get the value name and data size */
if(RegEnumValue(hKey, if (RegEnumValueW(hKey,
dwIndex, dwIndex,
szValueName, szValueName,
&dwValueSize, &dwValueSize,
0, 0,
NULL, NULL,
NULL, NULL,
&dwDataSize) != ERROR_SUCCESS) &dwDataSize) != ERROR_SUCCESS)
{
break; break;
}
/* Check if the parameter is the value name */ /* Check if the parameter is the value name */
if(!_tcsicmp(lpCmdLine, szValueName)) if (!_wcsicmp(lpCmdLine, szValueName))
{ {
LPTSTR pszData; /*
* Allocate memory for the data plus two more characters,
/* Allocate memory for the data plus two more characters, so we can quote the file name if required */ * so we can quote the file name if required.
pszData = (LPTSTR) HeapAlloc(hProcessHeap, */
0, LPWSTR pszData;
dwDataSize + 2 * sizeof(TCHAR)); pszData = HeapAlloc(GetProcessHeap(),
0,
dwDataSize + 2 * sizeof(WCHAR));
++pszData; ++pszData;
/* This value is the one we are looking for, so get the data. It is the path to a .cpl file */ /*
if(RegQueryValueEx(hKey, * This value is the one we are looking for, so get the data.
szValueName, * It is the path to a .cpl file.
0, */
NULL, if (RegQueryValueExW(hKey,
(LPBYTE)pszData, szValueName,
&dwDataSize) == ERROR_SUCCESS) 0,
NULL,
(LPBYTE)pszData,
&dwDataSize) == ERROR_SUCCESS)
{ {
INT nReturnValue; INT nReturnValue;
/* Quote the file name if required */ /* Quote the file name if required */
if(*pszData != '\"') if (*pszData != L'\"')
{ {
*(--pszData) = '\"'; *(--pszData) = L'\"';
pszData[dwDataSize / sizeof(TCHAR)] = '\"'; pszData[dwDataSize / sizeof(WCHAR)] = L'\"';
pszData[(dwDataSize / sizeof(TCHAR)) + 1] = 0; pszData[(dwDataSize / sizeof(WCHAR)) + 1] = 0;
} }
nReturnValue = RunControlPanel(pszData); nReturnValue = RunControlPanel(pszData);
HeapFree(hProcessHeap, HeapFree(GetProcessHeap(), 0, pszData);
0,
pszData);
RegCloseKey(hKey); RegCloseKey(hKey);
return nReturnValue; return nReturnValue;
} }
HeapFree(hProcessHeap, HeapFree(GetProcessHeap(), 0, pszData);
0,
pszData);
} }
} }
RegCloseKey(hKey); RegCloseKey(hKey);
} }
/* It's none of the known parameters, so interpret the parameter as the file name of a control panel applet */ /*
* It's none of the known parameters, so interpret the parameter
* as the file name of a control panel applet.
*/
return RunControlPanel(lpCmdLine); return RunControlPanel(lpCmdLine);
} }

View file

@ -1,137 +0,0 @@
# Microsoft Developer Studio Project File - Name="control" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Application" 0x0101
CFG=control - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "control.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "control.mak" CFG="control - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "control - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "control - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "control - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "../../../" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG" /d "MS_COMPILER"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /machine:I386
# Begin Custom Build
TargetDir=.\Release
TargetName=control
InputPath=.\Release\control.exe
InputName=control
SOURCE="$(InputPath)"
"C:\reactos\reactos\$(InputName).EXE" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(TargetDir)\$(TargetName).EXE C:\reactos\reactos
# End Custom Build
!ELSEIF "$(CFG)" == "control - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /D "_UNICODE" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG" /d "MS_COMPILER"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
# Begin Custom Build
TargetDir=.\Debug
TargetName=control
InputPath=.\Debug\control.exe
InputName=control
SOURCE="$(InputPath)"
"C:\reactos\reactos\$(InputName).EXE" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
copy $(TargetDir)\$(TargetName).EXE C:\reactos\reactos
# End Custom Build
!ENDIF
# Begin Target
# Name "control - Win32 Release"
# Name "control - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\control.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\config.ico
# End Source File
# Begin Source File
SOURCE=.\control.rc
# End Source File
# End Group
# End Target
# End Project

View file

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "control"=.\control.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View file

@ -1,23 +0,0 @@
/*
* PROJECT: ReactOS System Control Panel
* FILE: base/applications/control/control.h
* PURPOSE: ReactOS System Control Panel
* PROGRAMMERS: Gero Kuehn (reactos.filter@gkware.com)
* Colin Finck (mail@colinfinck.de)
*/
#include <tchar.h>
#include <windef.h>
#include <winbase.h>
#include <winuser.h>
#include <winreg.h>
#include <shellapi.h>
#include "resource.h"
#define CCH_UINT_MAX 11
#define MAX_VALUE_NAME 16383
/* Macro for calling "rundll32.exe"
According to MSDN, ShellExecute returns a value greater than 32 if the operation was successful. */
#define RUNDLL(param) ((INT_PTR)ShellExecute(NULL, _T("open"), _T("rundll32.exe"), (param), NULL, SW_SHOWDEFAULT) > 32)