xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.cpp (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2002-2007 Apple Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker 
19*48a54d36SAndroid Build Coastguard Worker #include "ControlPanelExe.h"
20*48a54d36SAndroid Build Coastguard Worker #include "ConfigDialog.h"
21*48a54d36SAndroid Build Coastguard Worker #include "ConfigPropertySheet.h"
22*48a54d36SAndroid Build Coastguard Worker #include "resource.h"
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker #include <DebugServices.h>
25*48a54d36SAndroid Build Coastguard Worker #include "loclibrary.h"
26*48a54d36SAndroid Build Coastguard Worker 
27*48a54d36SAndroid Build Coastguard Worker 
28*48a54d36SAndroid Build Coastguard Worker #ifdef _DEBUG
29*48a54d36SAndroid Build Coastguard Worker #define new DEBUG_NEW
30*48a54d36SAndroid Build Coastguard Worker #undef THIS_FILE
31*48a54d36SAndroid Build Coastguard Worker static char THIS_FILE[] = __FILE__;
32*48a54d36SAndroid Build Coastguard Worker #endif
33*48a54d36SAndroid Build Coastguard Worker 
34*48a54d36SAndroid Build Coastguard Worker #ifndef HeapEnableTerminationOnCorruption
35*48a54d36SAndroid Build Coastguard Worker #	define HeapEnableTerminationOnCorruption (HEAP_INFORMATION_CLASS) 1
36*48a54d36SAndroid Build Coastguard Worker #endif
37*48a54d36SAndroid Build Coastguard Worker 
38*48a54d36SAndroid Build Coastguard Worker 
39*48a54d36SAndroid Build Coastguard Worker // Stash away pointers to our resource DLLs
40*48a54d36SAndroid Build Coastguard Worker 
41*48a54d36SAndroid Build Coastguard Worker static HINSTANCE g_nonLocalizedResources	= NULL;
42*48a54d36SAndroid Build Coastguard Worker static HINSTANCE g_localizedResources		= NULL;
43*48a54d36SAndroid Build Coastguard Worker 
44*48a54d36SAndroid Build Coastguard Worker 
GetNonLocalizedResources()45*48a54d36SAndroid Build Coastguard Worker HINSTANCE	GetNonLocalizedResources()
46*48a54d36SAndroid Build Coastguard Worker {
47*48a54d36SAndroid Build Coastguard Worker 	return g_nonLocalizedResources;
48*48a54d36SAndroid Build Coastguard Worker }
49*48a54d36SAndroid Build Coastguard Worker 
50*48a54d36SAndroid Build Coastguard Worker 
GetLocalizedResources()51*48a54d36SAndroid Build Coastguard Worker HINSTANCE	GetLocalizedResources()
52*48a54d36SAndroid Build Coastguard Worker {
53*48a54d36SAndroid Build Coastguard Worker 	return g_localizedResources;
54*48a54d36SAndroid Build Coastguard Worker }
55*48a54d36SAndroid Build Coastguard Worker 
56*48a54d36SAndroid Build Coastguard Worker 
57*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
58*48a54d36SAndroid Build Coastguard Worker //	Static Declarations
59*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
60*48a54d36SAndroid Build Coastguard Worker DEFINE_GUID(CLSID_ControlPanel,
61*48a54d36SAndroid Build Coastguard Worker 
62*48a54d36SAndroid Build Coastguard Worker 0x1207552c, 0xe59, 0x4d9f, 0x85, 0x54, 0xf1, 0xf8, 0x6, 0xcd, 0x7f, 0xa9);
63*48a54d36SAndroid Build Coastguard Worker 
64*48a54d36SAndroid Build Coastguard Worker static LPCTSTR g_controlPanelGUID			=	TEXT( "{1207552C-0E59-4d9f-8554-F1F806CD7FA9}" );
65*48a54d36SAndroid Build Coastguard Worker static LPCTSTR g_controlPanelName			=	TEXT( "Bonjour" );
66*48a54d36SAndroid Build Coastguard Worker static LPCTSTR g_controlPanelCanonicalName	=	TEXT( "Apple.Bonjour" );
67*48a54d36SAndroid Build Coastguard Worker static LPCTSTR g_controlPanelCategory		=	TEXT( "3,8" );
68*48a54d36SAndroid Build Coastguard Worker 
69*48a54d36SAndroid Build Coastguard Worker static CCPApp theApp;
70*48a54d36SAndroid Build Coastguard Worker 
71*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
72*48a54d36SAndroid Build Coastguard Worker //	MyRegDeleteKey
73*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
74*48a54d36SAndroid Build Coastguard Worker 
MyRegDeleteKey(HKEY hKeyRoot,LPTSTR lpSubKey)75*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus MyRegDeleteKey( HKEY hKeyRoot, LPTSTR lpSubKey )
76*48a54d36SAndroid Build Coastguard Worker {
77*48a54d36SAndroid Build Coastguard Worker     LPTSTR lpEnd;
78*48a54d36SAndroid Build Coastguard Worker     OSStatus err;
79*48a54d36SAndroid Build Coastguard Worker     DWORD dwSize;
80*48a54d36SAndroid Build Coastguard Worker     TCHAR szName[MAX_PATH];
81*48a54d36SAndroid Build Coastguard Worker     HKEY hKey;
82*48a54d36SAndroid Build Coastguard Worker     FILETIME ftWrite;
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker     // First, see if we can delete the key without having to recurse.
85*48a54d36SAndroid Build Coastguard Worker 
86*48a54d36SAndroid Build Coastguard Worker     err = RegDeleteKey( hKeyRoot, lpSubKey );
87*48a54d36SAndroid Build Coastguard Worker 
88*48a54d36SAndroid Build Coastguard Worker     if ( !err )
89*48a54d36SAndroid Build Coastguard Worker 	{
90*48a54d36SAndroid Build Coastguard Worker 		goto exit;
91*48a54d36SAndroid Build Coastguard Worker 	}
92*48a54d36SAndroid Build Coastguard Worker 
93*48a54d36SAndroid Build Coastguard Worker     err = RegOpenKeyEx( hKeyRoot, lpSubKey, 0, KEY_READ, &hKey );
94*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
95*48a54d36SAndroid Build Coastguard Worker 
96*48a54d36SAndroid Build Coastguard Worker     // Check for an ending slash and add one if it is missing.
97*48a54d36SAndroid Build Coastguard Worker 
98*48a54d36SAndroid Build Coastguard Worker     lpEnd = lpSubKey + lstrlen(lpSubKey);
99*48a54d36SAndroid Build Coastguard Worker 
100*48a54d36SAndroid Build Coastguard Worker     if ( *( lpEnd - 1 ) != TEXT( '\\' ) )
101*48a54d36SAndroid Build Coastguard Worker     {
102*48a54d36SAndroid Build Coastguard Worker         *lpEnd =  TEXT('\\');
103*48a54d36SAndroid Build Coastguard Worker         lpEnd++;
104*48a54d36SAndroid Build Coastguard Worker         *lpEnd =  TEXT('\0');
105*48a54d36SAndroid Build Coastguard Worker     }
106*48a54d36SAndroid Build Coastguard Worker 
107*48a54d36SAndroid Build Coastguard Worker     // Enumerate the keys
108*48a54d36SAndroid Build Coastguard Worker 
109*48a54d36SAndroid Build Coastguard Worker     dwSize = MAX_PATH;
110*48a54d36SAndroid Build Coastguard Worker     err = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite);
111*48a54d36SAndroid Build Coastguard Worker 
112*48a54d36SAndroid Build Coastguard Worker     if ( !err )
113*48a54d36SAndroid Build Coastguard Worker     {
114*48a54d36SAndroid Build Coastguard Worker         do
115*48a54d36SAndroid Build Coastguard Worker 		{
116*48a54d36SAndroid Build Coastguard Worker             lstrcpy (lpEnd, szName);
117*48a54d36SAndroid Build Coastguard Worker 
118*48a54d36SAndroid Build Coastguard Worker             if ( !MyRegDeleteKey( hKeyRoot, lpSubKey ) )
119*48a54d36SAndroid Build Coastguard Worker 			{
120*48a54d36SAndroid Build Coastguard Worker                 break;
121*48a54d36SAndroid Build Coastguard Worker             }
122*48a54d36SAndroid Build Coastguard Worker 
123*48a54d36SAndroid Build Coastguard Worker             dwSize = MAX_PATH;
124*48a54d36SAndroid Build Coastguard Worker 
125*48a54d36SAndroid Build Coastguard Worker             err = RegEnumKeyEx( hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite );
126*48a54d36SAndroid Build Coastguard Worker 
127*48a54d36SAndroid Build Coastguard Worker         }
128*48a54d36SAndroid Build Coastguard Worker 		while ( !err );
129*48a54d36SAndroid Build Coastguard Worker     }
130*48a54d36SAndroid Build Coastguard Worker 
131*48a54d36SAndroid Build Coastguard Worker     lpEnd--;
132*48a54d36SAndroid Build Coastguard Worker     *lpEnd = TEXT('\0');
133*48a54d36SAndroid Build Coastguard Worker 
134*48a54d36SAndroid Build Coastguard Worker     RegCloseKey( hKey );
135*48a54d36SAndroid Build Coastguard Worker 
136*48a54d36SAndroid Build Coastguard Worker     // Try again to delete the key.
137*48a54d36SAndroid Build Coastguard Worker 
138*48a54d36SAndroid Build Coastguard Worker     err = RegDeleteKey(hKeyRoot, lpSubKey);
139*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
140*48a54d36SAndroid Build Coastguard Worker 
141*48a54d36SAndroid Build Coastguard Worker exit:
142*48a54d36SAndroid Build Coastguard Worker 
143*48a54d36SAndroid Build Coastguard Worker 	return err;
144*48a54d36SAndroid Build Coastguard Worker }
145*48a54d36SAndroid Build Coastguard Worker 
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker 
148*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
149*48a54d36SAndroid Build Coastguard Worker //	CCPApp::CCPApp
150*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
151*48a54d36SAndroid Build Coastguard Worker IMPLEMENT_DYNAMIC(CCPApp, CWinApp);
152*48a54d36SAndroid Build Coastguard Worker 
CCPApp()153*48a54d36SAndroid Build Coastguard Worker CCPApp::CCPApp()
154*48a54d36SAndroid Build Coastguard Worker {
155*48a54d36SAndroid Build Coastguard Worker 	debug_initialize( kDebugOutputTypeWindowsEventLog, "DNS-SD Control Panel", GetModuleHandle( NULL ) );
156*48a54d36SAndroid Build Coastguard Worker 	debug_set_property( kDebugPropertyTagPrintLevel, kDebugLevelInfo );
157*48a54d36SAndroid Build Coastguard Worker }
158*48a54d36SAndroid Build Coastguard Worker 
159*48a54d36SAndroid Build Coastguard Worker 
160*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
161*48a54d36SAndroid Build Coastguard Worker //	CCPApp::~CCPApp
162*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
163*48a54d36SAndroid Build Coastguard Worker 
~CCPApp()164*48a54d36SAndroid Build Coastguard Worker CCPApp::~CCPApp()
165*48a54d36SAndroid Build Coastguard Worker {
166*48a54d36SAndroid Build Coastguard Worker }
167*48a54d36SAndroid Build Coastguard Worker 
168*48a54d36SAndroid Build Coastguard Worker 
169*48a54d36SAndroid Build Coastguard Worker void
Register(LPCTSTR inClsidString,LPCTSTR inName,LPCTSTR inCanonicalName,LPCTSTR inCategory,LPCTSTR inLocalizedName,LPCTSTR inInfoTip,LPCTSTR inIconPath,LPCTSTR inExePath)170*48a54d36SAndroid Build Coastguard Worker CCPApp::Register( LPCTSTR inClsidString, LPCTSTR inName, LPCTSTR inCanonicalName, LPCTSTR inCategory, LPCTSTR inLocalizedName, LPCTSTR inInfoTip, LPCTSTR inIconPath, LPCTSTR inExePath )
171*48a54d36SAndroid Build Coastguard Worker {
172*48a54d36SAndroid Build Coastguard Worker 	typedef struct	RegistryBuilder		RegistryBuilder;
173*48a54d36SAndroid Build Coastguard Worker 
174*48a54d36SAndroid Build Coastguard Worker 	struct	RegistryBuilder
175*48a54d36SAndroid Build Coastguard Worker 	{
176*48a54d36SAndroid Build Coastguard Worker 		HKEY		rootKey;
177*48a54d36SAndroid Build Coastguard Worker 		LPCTSTR		subKey;
178*48a54d36SAndroid Build Coastguard Worker 		LPCTSTR		valueName;
179*48a54d36SAndroid Build Coastguard Worker 		DWORD		valueType;
180*48a54d36SAndroid Build Coastguard Worker 		LPCTSTR		data;
181*48a54d36SAndroid Build Coastguard Worker 	};
182*48a54d36SAndroid Build Coastguard Worker 
183*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err;
184*48a54d36SAndroid Build Coastguard Worker 	size_t				n;
185*48a54d36SAndroid Build Coastguard Worker 	size_t				i;
186*48a54d36SAndroid Build Coastguard Worker 	HKEY				key;
187*48a54d36SAndroid Build Coastguard Worker 	TCHAR				keyName[ MAX_PATH ];
188*48a54d36SAndroid Build Coastguard Worker 	RegistryBuilder		entries[] =
189*48a54d36SAndroid Build Coastguard Worker 	{
190*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_LOCAL_MACHINE,	TEXT( "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\%s" ),	NULL,									REG_SZ,		inName },
191*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s" ),																			NULL,									NULL,		NULL },
192*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s" ),																			TEXT( "System.ApplicationName" ),		REG_SZ,		inCanonicalName },
193*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s" ),																			TEXT( "System.ControlPanel.Category" ),	REG_SZ,		inCategory },
194*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s" ),																			TEXT( "LocalizedString" ),				REG_SZ,		inLocalizedName },
195*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s" ),																			TEXT( "InfoTip" ),						REG_SZ,		inInfoTip },
196*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s\\DefaultIcon" ),																NULL,									REG_SZ,		inIconPath },
197*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s\\Shell" ),																		NULL,									NULL,		NULL },
198*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s\\Shell\\Open" ),																NULL,									NULL,		NULL },
199*48a54d36SAndroid Build Coastguard Worker 		{ HKEY_CLASSES_ROOT,	TEXT( "CLSID\\%s\\Shell\\Open\\Command" ),														NULL,									REG_SZ,		inExePath }
200*48a54d36SAndroid Build Coastguard Worker 	};
201*48a54d36SAndroid Build Coastguard Worker 	DWORD				size;
202*48a54d36SAndroid Build Coastguard Worker 
203*48a54d36SAndroid Build Coastguard Worker 	// Register the registry entries.
204*48a54d36SAndroid Build Coastguard Worker 
205*48a54d36SAndroid Build Coastguard Worker 	n = sizeof_array( entries );
206*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
207*48a54d36SAndroid Build Coastguard Worker 	{
208*48a54d36SAndroid Build Coastguard Worker 		wsprintf( keyName, entries[ i ].subKey, inClsidString );
209*48a54d36SAndroid Build Coastguard Worker 		err = RegCreateKeyEx( entries[ i ].rootKey, keyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &key, NULL );
210*48a54d36SAndroid Build Coastguard Worker 		require_noerr( err, exit );
211*48a54d36SAndroid Build Coastguard Worker 
212*48a54d36SAndroid Build Coastguard Worker 		if ( entries[ i ].data )
213*48a54d36SAndroid Build Coastguard Worker 		{
214*48a54d36SAndroid Build Coastguard Worker 			size = (DWORD)( ( lstrlen( entries[ i ].data ) + 1 ) * sizeof( TCHAR ) );
215*48a54d36SAndroid Build Coastguard Worker 			err = RegSetValueEx( key, entries[ i ].valueName, 0, entries[ i ].valueType, (LPBYTE) entries[ i ].data, size );
216*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
217*48a54d36SAndroid Build Coastguard Worker 		}
218*48a54d36SAndroid Build Coastguard Worker 
219*48a54d36SAndroid Build Coastguard Worker 		RegCloseKey( key );
220*48a54d36SAndroid Build Coastguard Worker 	}
221*48a54d36SAndroid Build Coastguard Worker 
222*48a54d36SAndroid Build Coastguard Worker exit:
223*48a54d36SAndroid Build Coastguard Worker 	return;
224*48a54d36SAndroid Build Coastguard Worker }
225*48a54d36SAndroid Build Coastguard Worker 
226*48a54d36SAndroid Build Coastguard Worker 
227*48a54d36SAndroid Build Coastguard Worker //-----------------------------------------------------------
228*48a54d36SAndroid Build Coastguard Worker //	CCPApp::Unregister
229*48a54d36SAndroid Build Coastguard Worker //-----------------------------------------------------------
230*48a54d36SAndroid Build Coastguard Worker void
Unregister(LPCTSTR clsidString)231*48a54d36SAndroid Build Coastguard Worker CCPApp::Unregister( LPCTSTR clsidString )
232*48a54d36SAndroid Build Coastguard Worker {
233*48a54d36SAndroid Build Coastguard Worker 	TCHAR keyName[ MAX_PATH * 2 ];
234*48a54d36SAndroid Build Coastguard Worker 
235*48a54d36SAndroid Build Coastguard Worker 	wsprintf( keyName, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\%s", clsidString );
236*48a54d36SAndroid Build Coastguard Worker 	MyRegDeleteKey( HKEY_LOCAL_MACHINE, keyName );
237*48a54d36SAndroid Build Coastguard Worker 
238*48a54d36SAndroid Build Coastguard Worker 	wsprintf( keyName, L"CLSID\\%s", clsidString );
239*48a54d36SAndroid Build Coastguard Worker 	MyRegDeleteKey( HKEY_CLASSES_ROOT, keyName );
240*48a54d36SAndroid Build Coastguard Worker }
241*48a54d36SAndroid Build Coastguard Worker 
242*48a54d36SAndroid Build Coastguard Worker 
243*48a54d36SAndroid Build Coastguard Worker 
244*48a54d36SAndroid Build Coastguard Worker //-----------------------------------------------------------
245*48a54d36SAndroid Build Coastguard Worker //	CCPApp::InitInstance
246*48a54d36SAndroid Build Coastguard Worker //-----------------------------------------------------------
247*48a54d36SAndroid Build Coastguard Worker 
248*48a54d36SAndroid Build Coastguard Worker BOOL
InitInstance()249*48a54d36SAndroid Build Coastguard Worker CCPApp::InitInstance()
250*48a54d36SAndroid Build Coastguard Worker {
251*48a54d36SAndroid Build Coastguard Worker 	CCommandLineInfo	commandLine;
252*48a54d36SAndroid Build Coastguard Worker 	wchar_t				resource[MAX_PATH];
253*48a54d36SAndroid Build Coastguard Worker 	CString				errorMessage;
254*48a54d36SAndroid Build Coastguard Worker 	CString				errorCaption;
255*48a54d36SAndroid Build Coastguard Worker 	int					res;
256*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err = kNoErr;
257*48a54d36SAndroid Build Coastguard Worker 
258*48a54d36SAndroid Build Coastguard Worker 	HeapSetInformation( NULL, HeapEnableTerminationOnCorruption, NULL, 0 );
259*48a54d36SAndroid Build Coastguard Worker 
260*48a54d36SAndroid Build Coastguard Worker 	//
261*48a54d36SAndroid Build Coastguard Worker 	// initialize the debugging framework
262*48a54d36SAndroid Build Coastguard Worker 	//
263*48a54d36SAndroid Build Coastguard Worker 	debug_initialize( kDebugOutputTypeWindowsDebugger, "ControlPanel", NULL );
264*48a54d36SAndroid Build Coastguard Worker 	debug_set_property( kDebugPropertyTagPrintLevel, kDebugLevelTrace );
265*48a54d36SAndroid Build Coastguard Worker 
266*48a54d36SAndroid Build Coastguard Worker 	// Before we load the resources, let's load the error string
267*48a54d36SAndroid Build Coastguard Worker 
268*48a54d36SAndroid Build Coastguard Worker 	errorMessage.LoadString( IDS_REINSTALL );
269*48a54d36SAndroid Build Coastguard Worker 	errorCaption.LoadString( IDS_REINSTALL_CAPTION );
270*48a54d36SAndroid Build Coastguard Worker 
271*48a54d36SAndroid Build Coastguard Worker 	res = PathForResource( NULL, L"ControlPanelResources.dll", resource, MAX_PATH );
272*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( res != 0, kUnknownErr, kUnknownErr );
273*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
274*48a54d36SAndroid Build Coastguard Worker 
275*48a54d36SAndroid Build Coastguard Worker 	g_nonLocalizedResources = LoadLibrary( resource );
276*48a54d36SAndroid Build Coastguard Worker 	translate_errno( g_nonLocalizedResources, GetLastError(), kUnknownErr );
277*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
278*48a54d36SAndroid Build Coastguard Worker 
279*48a54d36SAndroid Build Coastguard Worker 	res = PathForResource( NULL, L"ControlPanelLocalized.dll", resource, MAX_PATH );
280*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( res != 0, kUnknownErr, kUnknownErr );
281*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
282*48a54d36SAndroid Build Coastguard Worker 
283*48a54d36SAndroid Build Coastguard Worker 	g_localizedResources = LoadLibrary( resource );
284*48a54d36SAndroid Build Coastguard Worker 	translate_errno( g_localizedResources, GetLastError(), kUnknownErr );
285*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
286*48a54d36SAndroid Build Coastguard Worker 
287*48a54d36SAndroid Build Coastguard Worker 	AfxSetResourceHandle( g_localizedResources );
288*48a54d36SAndroid Build Coastguard Worker 
289*48a54d36SAndroid Build Coastguard Worker 	// InitCommonControls() is required on Windows XP if an application
290*48a54d36SAndroid Build Coastguard Worker 	// manifest specifies use of ComCtl32.dll version 6 or later to enable
291*48a54d36SAndroid Build Coastguard Worker 	// visual styles.  Otherwise, any window creation will fail.
292*48a54d36SAndroid Build Coastguard Worker 
293*48a54d36SAndroid Build Coastguard Worker 	InitCommonControls();
294*48a54d36SAndroid Build Coastguard Worker 
295*48a54d36SAndroid Build Coastguard Worker 	CWinApp::InitInstance();
296*48a54d36SAndroid Build Coastguard Worker 
297*48a54d36SAndroid Build Coastguard Worker 	AfxEnableControlContainer();
298*48a54d36SAndroid Build Coastguard Worker 
299*48a54d36SAndroid Build Coastguard Worker 	ParseCommandLine( commandLine );
300*48a54d36SAndroid Build Coastguard Worker 
301*48a54d36SAndroid Build Coastguard Worker 	if ( commandLine.m_nShellCommand == CCommandLineInfo::AppRegister )
302*48a54d36SAndroid Build Coastguard Worker 	{
303*48a54d36SAndroid Build Coastguard Worker 		CString		localizedName;
304*48a54d36SAndroid Build Coastguard Worker 		CString		toolTip;
305*48a54d36SAndroid Build Coastguard Worker 		TCHAR		iconPath[ MAX_PATH + 12 ]	= TEXT( "" );
306*48a54d36SAndroid Build Coastguard Worker 		TCHAR		exePath[ MAX_PATH ]			= TEXT( "" );
307*48a54d36SAndroid Build Coastguard Worker 		DWORD		nChars;
308*48a54d36SAndroid Build Coastguard Worker 		OSStatus	err;
309*48a54d36SAndroid Build Coastguard Worker 
310*48a54d36SAndroid Build Coastguard Worker 		nChars = GetModuleFileName( NULL, exePath, sizeof_array( exePath ) );
311*48a54d36SAndroid Build Coastguard Worker 
312*48a54d36SAndroid Build Coastguard Worker 		err = translate_errno( nChars > 0, (OSStatus) GetLastError(), kUnknownErr );
313*48a54d36SAndroid Build Coastguard Worker 
314*48a54d36SAndroid Build Coastguard Worker 		require_noerr( err, exit );
315*48a54d36SAndroid Build Coastguard Worker 
316*48a54d36SAndroid Build Coastguard Worker 		wsprintf( iconPath, L"%s,-%d", exePath, IDR_APPLET );
317*48a54d36SAndroid Build Coastguard Worker 
318*48a54d36SAndroid Build Coastguard Worker 		localizedName.LoadString( IDS_APPLET_NAME );
319*48a54d36SAndroid Build Coastguard Worker 		toolTip.LoadString( IDS_APPLET_TOOLTIP );
320*48a54d36SAndroid Build Coastguard Worker 
321*48a54d36SAndroid Build Coastguard Worker 		Register( g_controlPanelGUID, g_controlPanelName, g_controlPanelCanonicalName, g_controlPanelCategory, localizedName, toolTip, iconPath, exePath );
322*48a54d36SAndroid Build Coastguard Worker 	}
323*48a54d36SAndroid Build Coastguard Worker 	else if ( commandLine.m_nShellCommand == CCommandLineInfo::AppUnregister )
324*48a54d36SAndroid Build Coastguard Worker 	{
325*48a54d36SAndroid Build Coastguard Worker 		Unregister( g_controlPanelGUID );
326*48a54d36SAndroid Build Coastguard Worker 	}
327*48a54d36SAndroid Build Coastguard Worker 	else
328*48a54d36SAndroid Build Coastguard Worker 	{
329*48a54d36SAndroid Build Coastguard Worker 		CString					name;
330*48a54d36SAndroid Build Coastguard Worker 		CConfigPropertySheet	dlg;
331*48a54d36SAndroid Build Coastguard Worker 
332*48a54d36SAndroid Build Coastguard Worker 		name.LoadString( IDR_APPLET );
333*48a54d36SAndroid Build Coastguard Worker 		dlg.Construct( name, NULL, 0 );
334*48a54d36SAndroid Build Coastguard Worker 
335*48a54d36SAndroid Build Coastguard Worker 		m_pMainWnd = &dlg;
336*48a54d36SAndroid Build Coastguard Worker 
337*48a54d36SAndroid Build Coastguard Worker 		try
338*48a54d36SAndroid Build Coastguard Worker 		{
339*48a54d36SAndroid Build Coastguard Worker 			INT_PTR nResponse = dlg.DoModal();
340*48a54d36SAndroid Build Coastguard Worker 
341*48a54d36SAndroid Build Coastguard Worker 			if (nResponse == IDOK)
342*48a54d36SAndroid Build Coastguard Worker 			{
343*48a54d36SAndroid Build Coastguard Worker 				// TODO: Place code here to handle when the dialog is
344*48a54d36SAndroid Build Coastguard Worker 				//  dismissed with OK
345*48a54d36SAndroid Build Coastguard Worker 			}
346*48a54d36SAndroid Build Coastguard Worker 			else if (nResponse == IDCANCEL)
347*48a54d36SAndroid Build Coastguard Worker 			{
348*48a54d36SAndroid Build Coastguard Worker 				// TODO: Place code here to handle when the dialog is
349*48a54d36SAndroid Build Coastguard Worker 				//  dismissed with Cancel
350*48a54d36SAndroid Build Coastguard Worker 			}
351*48a54d36SAndroid Build Coastguard Worker 		}
352*48a54d36SAndroid Build Coastguard Worker 		catch (...)
353*48a54d36SAndroid Build Coastguard Worker 		{
354*48a54d36SAndroid Build Coastguard Worker 			MessageBox(NULL, L"", L"", MB_OK|MB_ICONEXCLAMATION);
355*48a54d36SAndroid Build Coastguard Worker 		}
356*48a54d36SAndroid Build Coastguard Worker 	}
357*48a54d36SAndroid Build Coastguard Worker 
358*48a54d36SAndroid Build Coastguard Worker 	if ( err )
359*48a54d36SAndroid Build Coastguard Worker 	{
360*48a54d36SAndroid Build Coastguard Worker 		MessageBox( NULL, L"", L"", MB_ICONERROR | MB_OK );
361*48a54d36SAndroid Build Coastguard Worker 	}
362*48a54d36SAndroid Build Coastguard Worker 
363*48a54d36SAndroid Build Coastguard Worker exit:
364*48a54d36SAndroid Build Coastguard Worker 
365*48a54d36SAndroid Build Coastguard Worker 	if ( err )
366*48a54d36SAndroid Build Coastguard Worker 	{
367*48a54d36SAndroid Build Coastguard Worker 		MessageBox( NULL, errorMessage, errorCaption, MB_ICONERROR | MB_OK );
368*48a54d36SAndroid Build Coastguard Worker 	}
369*48a54d36SAndroid Build Coastguard Worker 
370*48a54d36SAndroid Build Coastguard Worker 	// Since the dialog has been closed, return FALSE so that we exit the
371*48a54d36SAndroid Build Coastguard Worker 	//  application, rather than start the application's message pump.
372*48a54d36SAndroid Build Coastguard Worker 	return FALSE;
373*48a54d36SAndroid Build Coastguard Worker }
374