This post is for advanced computer users.
It shows how CLSIDs are used and how they really work. This post is a follow-up to this simple trick. Click here to view it first.
Introduction
All Windows versions have a default shell consisting of one main program, Explorer.exe, launched by the Winlogon process each time an interactive session is opened. The shell for the Windows 9X family is stored in the win.ini file in the [boot] section as the value of the shell key. In the Windows NT family (NT4/2K/XP/2003), the shell value is stored in the registry. The Winlogon process begins by retrieving the shell data value in the registry key: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon. If it does not exist in this last key, it looks for it in the key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon as indicated below.
In this article, we are interested in the Microsoft default shell (Explorer) objects, precisely in, how we can launch multiple Explorer system and special folders (My Computer, My documents, Recycle Bin, Control Panel, Network Neighbourhood etc.) and panes in one command-line without any code. Technically speaking, all these standard objects represent objects belonging to namespaces handled by the Windows Explorer graphical interface. Since the Explorer also takes into account the namespace extensions, the examples given in this article should apply to the objects belonging to these extensions.
How to use Explorer to show special objects
Where the CLSIDs of special Explorer objects can be found?
in order to resize the form. Note that in VB objects, dimensions are measured in Twips units, and since this API returns the window client rectangle in Pixels units, we have to convert these dimensions to Twips by using the
Did you find this interesting? Drop a comment & let us know!
It shows how CLSIDs are used and how they really work. This post is a follow-up to this simple trick. Click here to view it first.
Download these files first [Hosted in a secure fast internal link]
Introduction
All Windows versions have a default shell consisting of one main program, Explorer.exe, launched by the Winlogon process each time an interactive session is opened. The shell for the Windows 9X family is stored in the win.ini file in the [boot] section as the value of the shell key. In the Windows NT family (NT4/2K/XP/2003), the shell value is stored in the registry. The Winlogon process begins by retrieving the shell data value in the registry key: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon. If it does not exist in this last key, it looks for it in the key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon as indicated below.
In this article, we are interested in the Microsoft default shell (Explorer) objects, precisely in, how we can launch multiple Explorer system and special folders (My Computer, My documents, Recycle Bin, Control Panel, Network Neighbourhood etc.) and panes in one command-line without any code. Technically speaking, all these standard objects represent objects belonging to namespaces handled by the Windows Explorer graphical interface. Since the Explorer also takes into account the namespace extensions, the examples given in this article should apply to the objects belonging to these extensions.
How to use Explorer to show special objects
The Windows Shell program, Explorer.exe, is stored in the Windows folder, obtained through the environment variable
WinDir
. Usually, this folder is a part of the PATH
environment variable. And as a consequence, we don't need to specify the whole path to Explorer.exe when calling this program.
The table below summarizes some of the command-line parameters passed to Explorer and the result of the execution. Note that all the examples given in this table have been tested only on the Windows XP platform. There is no reason that these examples will not work on at least NT-platforms (NT4/2K/XP/2003). The general Explorer command-line syntax is well known, and can be found on many Internet sites (see for example, the Q130510 article on the Microsoft site). But, the article's main contribution consists in showing how to specify some parameters (X, Y)=(object, sub-object) (see next section) to show special objects like My Computer, My Documents, Control Panel etc. Some of these objects are available in the Start Menu of the tasks bar (one of the graphical parts of the Explorer). To try the examples below, just open a console (cmd or command depending on your OS) and copy/paste each example. If you want to play with them, I have provided two complete and very small applications coded in Visual C++ 6 and Visual Basic 6. Some details of these applications are given below in the next sections.
Explore what? | Command-line |
Object X and optionally sub-object Y (general case) | General syntax: Explorer [/n][/e][,/root],X,[[/Select],Y] Notes:
|
My Computer | Explorer /E,::{20D04FE0-3AEA-1069-A2D8-08002B30309D} Explanation: The object My Computer is a namespace which has the CLSID: {20D04FE0-3AEA-1069-A2D8-08002B30309D} |
Control Panel | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D} Explanation: The Control Panel object whose CLSID is: {21EC2020-3AEA-1069-A2DD-08002B30309D} is a sub-object of My Computer. |
Printers and telecopiers | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{2227A280-3AEA-1069-A2DE-08002B30309D} |
Fonts | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{D20EA4E1-3957-11d2-A40B-0C5020524152} |
Scanners and Cameras | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{E211B736-43FD-11D1-9EFB-0000F8757FCD} |
Network Neighbourhood | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{7007ACC7-3202-11D1-AAD2-00805FC1270E} |
Administration Tools | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{D20EA4E1-3957-11d2-A40B-0C5020524153} |
Tasks Scheduler | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF} |
Web Folders | Explorer /N,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{BDEADF00-C265-11D0-BCED-00A0C90AB50F} |
My Documents | Explorer /N,::{450D8FBA-AD25-11D0-98A8-0800361B1103} |
Recycle Bin | Explorer /N,::{645FF040-5081-101B-9F08-00AA002F954E} |
Network Favorites | Explorer /N,::{208D2C60-3AEA-1069-A2D7-08002B30309D} |
Default Navigator | Explorer /N,::{871C5380-42A0-1069-A2EA-08002B30309D} |
Computer search results folder | Explorer /N,::{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA} |
Network Search Results computer | Explorer /N,::{E17D4FC0-5564-11D1-83F2-00A0C90DC849} |
There are many ways to find the CLSIDs referenced in the examples given in the previous section. Three methods are given below:
The first place to look for is the registry in the hive: HKEY_CLASSES_ROOT\CLSID, for example. Some of the special CLSIDS can also be found in the registry keys where the related namespace extensions are specified as in the key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Explorer\ControlPanel\NameSpace\ where you can find all CLSIDs related to the Control Panel. The second place to look for, is the OS shell resources DLL shell32.dll. To find the CLSIDs, you have to follow these steps:
- Step 1: Launch VS6, for example.
- Step 2: Click on the menu File-Open, and select file type: Executable Files, Open as: Resources, and then select the file shell32.dll, which is found in the System32 system folder (if the DLL is locked, you have to make a copy of it elsewhere and open it from the new place):
- Step 3: Open the custom resources "REGINST" as indicated in the figure below. Open this resource, and you will find all default CLSIDs installed on your OS. In fact, this file has the INF file format, and the CLSIDs can be found in the [Strings] section. All CLSIDs are prefixed by CLSID_.
Note that you can also use public tools more appropriated to edit resources like: Resource Hacker by Angus Johnson. The third place, is the Windows CD setup in the i386 folder in a INF file used during the installation process. If you have a Windows XP CD setup, you can find these CLSIDs in the HIVECLS.INF file.
Application 1
The application is a MFC Dialog application whose UI is illustrated at the top of this article. The design-time UI is illustrated below:
To test this application, you have to do three things:
- Choose in the list, one of the objects.
- Optionally, choose one of the two options or both of them.
- Click on the button " GO TO -->!" in order to display the appropriate object.
The main procedure responsible for displaying the chosen object in the combo-box list corresponding to the click on the button labeled "GO TO -->!" is given below, and doesn't need any explanation for people comfortable with Microsoft C++:
void CExploreWinObjectsDlg::OnExploreWhat()
{
#define LIST_ITEMS_NUM 15
// Define objects paths array
CString CLSIDs[LIST_ITEMS_NUM] =
{ /*My Computer*/
_T("{20D04FE0-3AEA-1069-A2D8-08002B30309D}"), /*Control Panel*/
CLSIDs[0] + CString("\\::{21EC2020-3AEA-1069-A2DD"
"-08002B30309D}"), /*Printers and telecopiers*/
CLSIDs[1]+CString("\\::{2227A280-3AEA-1069-A2DE"
"-08002B30309D}"), /*Fonts*/
CLSIDs[1]+CString("\\::{D20EA4E1-3957-11d2-A40B"
"-0C5020524152}"), /*scanners and cameras*/
CLSIDs[1]+CString("\\::{E211B736-43FD-11D1-"
"9EFB-0000F8757FCD}"), /*Networkhood*/
CLSIDs[1]+CString("\\::{7007ACC7-3202-11D1-AAD2"
"-00805FC1270E}"), /*Administration tools*/
CLSIDs[1]+CString("\\::{D20EA4E1-3957-11d2"
"-A40B-0C5020524153}"), /*Tasks Scheduler*/
CLSIDs[1]+CString("\\::{D6277990-4C6A-11CF"
"-8D87-00AA0060F5BF}"), /*Web folders*/
CLSIDs[0]+CString("\\::{BDEADF00-C265-11D0"
"-BCED-00A0C90AB50F}"), /*My documents*/
_T("{450D8FBA-AD25-11D0-98A8-0800361B1103}"), /*Recycle Bin*/
_T("{645FF040-5081-101B-9F08-00AA002F954E}"), /*Network favorites*/
_T("{208D2C60-3AEA-1069-A2D7-08002B30309D}"), /*Default Navigator*/
_T("{871C5380-42A0-1069-A2EA-08002B30309D}"), /*Results of
Computers research*/
_T("{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA}"), /*Results
of files research*/
_T("{E17D4FC0-5564-11D1-83F2-00A0C90DC849}")
};
char Windir[MAX_PATH];
if (GetWindowsDirectory(Windir,MAX_PATH)>0)
{
// Get selected item index
int SelIndex =
SendDlgItemMessage(IDC_COMBO1, CB_GETCURSEL, 0, 0);
// Get options values
BOOL DoNotShowLeftPane=(BOOL)IsDlgButtonChecked(IDC_CHECK1);
BOOL StartExplAtRoot=(BOOL)IsDlgButtonChecked(IDC_CHECK2);
for (int i=0; i< LIST_ITEMS_NUM; i++) {
if (SelIndex==i) {
char cmdline[MAX_PATH];
char HowExplore[10];
char StartAtRoot[10];
wsprintf(HowExplore, "%s",
(DoNotShowLeftPane==TRUE)?"/N":"/E");
wsprintf(StartAtRoot, "%s",
(StartExplAtRoot==TRUE)?"/Root,":"");
wsprintf(cmdline,"%s\\Explorer.exe %s,%s::%s",
Windir, HowExplore, StartAtRoot, CLSIDs[i]);
// don't care about ExitCode,
// since we don't wait the end of the process
DWORD ExitCode=0;
BOOL bRet=CreateProc("", cmdline, FALSE, 0,
TRUE, ExitCode);
// Get out of the for loop
break;
}
}
}
else
{
MessageBox("Error in GetWindowsDirectory() API!",
"",MB_OK|MB_ICONEXCLAMATION);}
}
Application 2
The second application is a VB 6 example using Internet Explorer Control whose UI is illustrated as the second figure at the top of this article. I want in this application to give another approach using Explorer objects different from the one used in VC++ sample application. The code is quite simple and makes use of one call to the Windows API
GetClientRect
declared as:Private Declare Function GetClientRect Lib "user32" (_
ByVal hwnd As Long, lpRect As rect) As Long
in order to resize the form. Note that in VB objects, dimensions are measured in Twips units, and since this API returns the window client rectangle in Pixels units, we have to convert these dimensions to Twips by using the
Screen
object properties : TwipsPerPixelX
and TwipsPerPixelY
(see the event Form_Resize()
content). In order to display the Explorer objects, I have used the Internet Explorer method Naviagte2
with no optional parameters in the event handler cboObjects_Click()
. The complete code is given below:OptionExplicit
'API declaration with parameters types
Private Type rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetClientRect Lib "user32" _
(ByVal hwnd As Long, lpRect As rect) As Long
'define Explorer objects paths array variable
Dim objExpArray(0 To 14) As String
Private Sub cboObjects_Click()
WebBrowser1.Navigate2 objExpArray(cboObjects.ListIndex)
End Sub
Private Sub Form_Load()
'define Explorer objects paths array variable values
'My computer
objExpArray(0)= "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
'Contro panel
objExpArray(1) = objExpArray(0) + _
"\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"
'Printers and telecopiers
objExpArray(2) = objExpArray(1) + _
"\::{2227A280-3AEA-1069-A2DE-08002B30309D}"
'Fonts
objExpArray(3) = objExpArray(1) + -
"\::{D20EA4E1-3957-11d2-A40B-0C5020524152}"
'Scanners and Cameras
objExpArray(4) = objExpArray(1) + -
"\::{E211B736-43FD-11D1-9EFB-0000F8757FCD}"
'Networkhood
objExpArray(5) = objExpArray(1) + _
"\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}"
'Administration tools
objExpArray(6) = objExpArray(1) + _
"\::{D20EA4E1-3957-11d2-A40B-0C5020524153}"
'Tasks Scheduler
objExpArray(7) = objExpArray(1) + _
"\::{D6277990-4C6A-11CF-8D87-00AA0060F5BF}"
'Web folders
objExpArray(8) = objExpArray(0) + _
"\::{BDEADF00-C265-11D0-BCED-00A0C90AB50F}"
'My documents
objExpArray(9) = "::{450D8FBA-AD25-11D0-98A8-0800361B1103}"
'Recycle Bin
objExpArray(10)= "::{645FF040-5081-101B-9F08-00AA002F954E}"
'Network favorites
objExpArray(11)= "::{208D2C60-3AEA-1069-A2D7-08002B30309D}"
'Default Navigator
objExpArray(12)= "::{871C5380-42A0-1069-A2EA-08002B30309D}"
'Results of Computers research
objExpArray(13)= "::{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA}"
'Results of files research
objExpArray(14) = "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"
'go to My Computer by default
cboObjects.ListIndex = 0
End Sub
Private Sub Form_Resize()
Dim CliRect As rect
If GetClientRect(Me.hwnd, CliRect) > 0 Then
Me.WebBrowser1.Move 0, Me.cboObjects.Height, _
CliRect.Right * Screen.TwipsPerPixelX, _
CliRect.Bottom * Screen.TwipsPerPixelY _
- Me.cboObjects.Height
End If
End Sub
Points of interest
This article has shown us how to launch Windows Explorer objects that are not ordinary ones like folders or files. The examples given here can be used in any code source whatever the programming or the script language used is, as long as it is used in the Windows platform.
Like it? Bookmark it. Press Ctrl+Shift+B to open the bookmark tab.
Did you find this interesting? Drop a comment & let us know!
This was helpful. Thanks!
ReplyDelete