source: trunk/DirectShowSpy/Configuration.h @ 149

Last change on this file since 149 was 149, checked in by roman, 10 years ago
  • unregister using registration path, not local
  • allow registering on top, if currently registered path is not local
  • elevation for per-user registration (we're still hooking!)
  • cosmetic
  • Property svn:keywords set to Id
File size: 19.1 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2011
3// Created by Roman Ryltsov roman@alax.info
4//
5// $Id: Configuration.h 149 2012-11-23 14:37:26Z roman $
6
7#pragma once
8
9#include <atlctrlx.h>
10#include <atlsplit.h>
11#include "rofiles.h"
12#include "AboutDialog.h"
13
14////////////////////////////////////////////////////////////
15// CRegistrationPropertySheet
16
17class CRegistrationPropertySheet :
18        public CPropertySheetT<CRegistrationPropertySheet>
19{
20public:
21
22BEGIN_MSG_MAP_EX(CRegistrationPropertySheet)
23        CHAIN_MSG_MAP(CPropertySheet)
24        MSG_WM_SYSCOMMAND(OnSysCommand)
25END_MSG_MAP()
26
27public:
28
29        ////////////////////////////////////////////////////////
30        // CRegistrationPropertyPage
31
32        class CRegistrationPropertyPage :
33                public CPropertyPageT<CRegistrationPropertyPage>,
34                //public CDialogResize<CRegistrationPropertyPage>,
35                public CWindowWithPrivateMessagesT<CRegistrationPropertyPage>
36        {
37        public:
38                enum { IDD = IDD_REGISTRATION_REGISTRATION_PROPERTYPAGE };
39
40        BEGIN_MSG_MAP_EX(CRegistrationPropertyPage)
41                CHAIN_MSG_MAP(CPropertyPage)
42                //CHAIN_MSG_MAP(CDialogResize<CRegistrationPropertyPage>)
43                CHAIN_MSG_MAP(CWindowWithPrivateMessages)
44                MSG_WM_INITDIALOG(OnInitDialog)
45                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_REGISTRATION_REGISTER, OnRegister)
46                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_REGISTRATION_UNREGISTER, OnUnregister)
47                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_REGISTRATION_USERREGISTER, OnUserRegister)
48                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_REGISTRATION_USERUNREGISTER, OnUserUnregister)
49                REFLECT_NOTIFICATIONS()
50        END_MSG_MAP()
51
52        private:
53                CRegistrationPropertySheet& m_PropertySheet;
54                CRoEdit m_StatusEdit;
55                CRoEdit m_PathEdit;
56                CButton m_RegisterButton;
57                CButton m_UnregisterButton;
58                CRoEdit m_UserStatusEdit;
59                CRoEdit m_UserPathEdit;
60                CButton m_UserRegisterButton;
61                CButton m_UserUnregisterButton;
62                //CRoIconStatic m_UserNoteStatic;
63                CRoArrayT<CString> m_StatusArray;
64                CPath m_sPath;
65                CPath m_sUserPath;
66
67                static BOOL IsAdministrator()
68                {
69                        bool bIsMember = FALSE;
70                        return CAccessToken().CheckTokenMembership(Sids::Admins(), &bIsMember) && bIsMember;
71                }
72
73        public:
74        // CRegistrationPropertyPage
75                CRegistrationPropertyPage(CRegistrationPropertySheet* pPropertySheet) throw() :
76                        m_PropertySheet(*pPropertySheet)
77                {
78                }
79                VOID UpdateControls()
80                {
81                        _A(_pAtlModule);
82                        const CPath& sLocalPath = GetPath();
83                        #pragma region System
84                        CPath sPath = FindTypeLibraryPath(HKEY_LOCAL_MACHINE);
85                        const BOOL bPathEmpty = _tcslen(sPath) == 0;
86                        m_StatusEdit.SetValue(m_StatusArray[bPathEmpty ? 0 : 1]);
87                        m_PathEdit.SetValue(sPath);
88                        m_PathEdit.GetWindow(GW_HWNDPREV).EnableWindow(!bPathEmpty);
89                        m_PathEdit.EnableWindow(!bPathEmpty);
90                        m_RegisterButton.EnableWindow(bPathEmpty || _tcsicmp(sPath, sLocalPath));
91                        m_UnregisterButton.EnableWindow(!bPathEmpty);
92                        m_sPath = sPath;
93                        #pragma endregion
94                        #pragma region Per-User
95                        CPath sUserPath = FindTypeLibraryPath(HKEY_CURRENT_USER);
96                        const BOOL bUserPathEmpty = _tcslen(sUserPath) == 0;
97                        m_UserStatusEdit.SetValue(m_StatusArray[bUserPathEmpty ? 0 : 1]);
98                        m_UserPathEdit.SetValue(sUserPath);
99                        m_UserPathEdit.GetWindow(GW_HWNDPREV).EnableWindow(!bUserPathEmpty);
100                        m_UserPathEdit.EnableWindow(!bUserPathEmpty);
101                        m_UserRegisterButton.EnableWindow(bUserPathEmpty || _tcsicmp(sUserPath, sLocalPath));
102                        m_UserUnregisterButton.EnableWindow(!bUserPathEmpty);
103                        m_sUserPath = sUserPath;
104                        #pragma endregion
105                }
106
107        // CDialogResize                               
108                       
109        // Window message handlers
110                LRESULT OnInitDialog(HWND, LPARAM)
111                {
112                        _ATLTRY
113                        {
114                                CWaitCursor WaitCursor;
115                                m_StatusEdit = GetDlgItem(IDC_REGISTRATION_REGISTRATION_STATUS);
116                                m_PathEdit = GetDlgItem(IDC_REGISTRATION_REGISTRATION_PATH);
117                                m_RegisterButton = GetDlgItem(IDC_REGISTRATION_REGISTRATION_REGISTER);
118                                m_UnregisterButton = GetDlgItem(IDC_REGISTRATION_REGISTRATION_UNREGISTER);
119                                m_UserStatusEdit = GetDlgItem(IDC_REGISTRATION_REGISTRATION_USERSTATUS);
120                                m_UserPathEdit = GetDlgItem(IDC_REGISTRATION_REGISTRATION_USERPATH);
121                                m_UserRegisterButton = GetDlgItem(IDC_REGISTRATION_REGISTRATION_USERREGISTER);
122                                m_UserUnregisterButton = GetDlgItem(IDC_REGISTRATION_REGISTRATION_USERUNREGISTER);
123                                //_W(m_UserNoteStatic.SubclassWindow(GetDlgItem(IDC_REGISTRATION_REGISTRATION_USERNOTE)));
124                                //m_UserNoteStatic.SetIdealHeight();
125                                if(GetOsVersion() >= 0x00060000) // Windows Vista or Windows Server 2008
126                                {
127                                        if(!IsAdministrator())
128                                        {
129                                                m_RegisterButton.SetElevationRequiredState(TRUE);
130                                                m_UnregisterButton.SetElevationRequiredState(TRUE);
131                                        }
132                                }
133                                _StringHelper::GetCommaSeparatedItems(AtlLoadString(IDC_REGISTRATION_REGISTRATION_STATUS), m_StatusArray);
134                                _A(m_StatusArray.GetCount() == 2);
135                                UpdateControls();
136                        }
137                        _ATLCATCHALL()
138                        {
139                                for(CWindow Window = GetWindow(GW_CHILD); Window.IsWindow(); Window = Window.GetWindow(GW_HWNDNEXT))
140                                        Window.EnableWindow(FALSE);
141                                _ATLRETHROW;
142                        }
143                        return TRUE;
144                }
145                LRESULT OnDestroy()
146                {
147                        return 0;
148                }
149                INT OnSetActive() throw()
150                {
151                        _ATLTRY
152                        {
153                                CWaitCursor WaitCursor;
154                                UpdateControls();
155                        }
156                        _ATLCATCHALL()
157                        {
158                                _Z_EXCEPTION();
159                                return -1;
160                        }
161                        return 0;
162                }
163                LRESULT OnRegister(UINT, INT, HWND)
164                {
165                        _ATLTRY
166                        {
167                                CWaitCursor WaitCursor;
168                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
169                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s \"%s\""), bSilent ? _T("/s") : _T(""), GetPath()), TRUE);
170                                if(bSilent)
171                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
172                                CancelToClose();
173                        }
174                        _ATLCATCH(Exception)
175                        {
176                                AtlExceptionMessageBox(m_hWnd, Exception);
177                        }
178                        UpdateControls();
179                        return 0;
180                }
181                LRESULT OnUnregister(UINT, INT, HWND)
182                {
183                        _ATLTRY
184                        {
185                                CWaitCursor WaitCursor;
186                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
187                                const CPath& sPath = m_sPath; //GetPath();
188                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s /u \"%s\""), bSilent ? _T("/s") : _T(""), sPath), TRUE);
189                                if(bSilent)
190                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
191                                CancelToClose();
192                        }
193                        _ATLCATCH(Exception)
194                        {
195                                AtlExceptionMessageBox(m_hWnd, Exception);
196                        }
197                        UpdateControls();
198                        return 0;
199                }
200                LRESULT OnUserRegister(UINT, INT, HWND)
201                {
202                        _ATLTRY
203                        {
204                                CWaitCursor WaitCursor;
205                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
206                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s /i:user /n \"%s\""), bSilent ? _T("/s") : _T(""), GetPath()));
207                                if(bSilent)
208                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
209                                CancelToClose();
210                        }
211                        _ATLCATCH(Exception)
212                        {
213                                AtlExceptionMessageBox(m_hWnd, Exception);
214                        }
215                        UpdateControls();
216                        return 0;
217                }
218                LRESULT OnUserUnregister(UINT, INT, HWND)
219                {
220                        _ATLTRY
221                        {
222                                CWaitCursor WaitCursor;
223                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
224                                const CPath& sPath = m_sUserPath; //GetPath();
225                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s /i:user /n /u \"%s\""), bSilent ? _T("/s") : _T(""), sPath));
226                                if(bSilent)
227                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
228                                CancelToClose();
229                        }
230                        _ATLCATCH(Exception)
231                        {
232                                AtlExceptionMessageBox(m_hWnd, Exception);
233                        }
234                        UpdateControls();
235                        return 0;
236                }
237        };
238
239        ////////////////////////////////////////////////////////
240        // CProppageRegistrationPropertyPage
241
242        class CProppageRegistrationPropertyPage :
243                public CPropertyPageT<CProppageRegistrationPropertyPage>,
244                //public CDialogResize<CProppageRegistrationPropertyPage>,
245                public CWindowWithPrivateMessagesT<CProppageRegistrationPropertyPage>
246        {
247        public:
248                enum { IDD = IDD_REGISTRATION_PROPPAGEREGISTRATION_PROPERTYPAGE };
249
250        BEGIN_MSG_MAP_EX(CProppageRegistrationPropertyPage)
251                CHAIN_MSG_MAP(CPropertyPage)
252                //CHAIN_MSG_MAP(CDialogResize<CProppageRegistrationPropertyPage>)
253                CHAIN_MSG_MAP(CWindowWithPrivateMessages)
254                MSG_WM_INITDIALOG(OnInitDialog)
255                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_PROPPAGEREGISTRATION_REGISTER, OnRegister)
256                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_PROPPAGEREGISTRATION_UNREGISTER, OnUnregister)
257                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERREGISTER, OnUserRegister)
258                COMMAND_ID_HANDLER_EX(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERUNREGISTER, OnUserUnregister)
259                REFLECT_NOTIFICATIONS()
260        END_MSG_MAP()
261
262        private:
263                CRegistrationPropertySheet& m_PropertySheet;
264                CRoEdit m_StatusEdit;
265                CRoEdit m_PathEdit;
266                CButton m_RegisterButton;
267                CButton m_UnregisterButton;
268                CRoEdit m_UserStatusEdit;
269                CRoEdit m_UserPathEdit;
270                CButton m_UserRegisterButton;
271                CButton m_UserUnregisterButton;
272                //CRoIconStatic m_UserNoteStatic;
273                CRoArrayT<CString> m_StatusArray;
274                CPath m_sPath;
275                CPath m_sUserPath;
276
277                static BOOL IsAdministrator()
278                {
279                        bool bIsMember = FALSE;
280                        return CAccessToken().CheckTokenMembership(Sids::Admins(), &bIsMember) && bIsMember;
281                }
282
283        public:
284        // CProppageRegistrationPropertyPage
285                CProppageRegistrationPropertyPage(CRegistrationPropertySheet* pPropertySheet) throw() :
286                        m_PropertySheet(*pPropertySheet)
287                {
288                }
289                VOID UpdateControls()
290                {
291                        class __declspec(uuid("92A3A302-DA7C-4A1F-BA7E-1802BB5D2D02")) PSFactoryBuffer;
292                        _A(_pAtlModule);
293                        const CPath& sLocalPath = m_PropertySheet.m_sPropPagePath;
294                        #pragma region System
295                        //CPath sPath = FindTypeLibraryPath(HKEY_LOCAL_MACHINE);
296                        CPath sPath = FindClassPath(HKEY_LOCAL_MACHINE, __uuidof(PSFactoryBuffer));
297                        const BOOL bPathEmpty = _tcslen(sPath) == 0;
298                        m_StatusEdit.SetValue(m_StatusArray[bPathEmpty ? 0 : 1]);
299                        m_PathEdit.SetValue(sPath);
300                        m_PathEdit.GetWindow(GW_HWNDPREV).EnableWindow(!bPathEmpty);
301                        m_PathEdit.EnableWindow(!bPathEmpty);
302                        m_RegisterButton.EnableWindow(bPathEmpty || _tcsicmp(sPath, sLocalPath));
303                        m_UnregisterButton.EnableWindow(!bPathEmpty);
304                        m_sPath = sPath;
305                        #pragma endregion
306                        #pragma region Per-User
307                        //CPath sUserPath = FindTypeLibraryPath(HKEY_CURRENT_USER);
308                        //const BOOL bUserPathEmpty = _tcslen(sUserPath) == 0;
309                        //m_UserStatusEdit.SetValue(m_StatusArray[bUserPathEmpty ? 0 : 1]);
310                        //m_UserPathEdit.SetValue(sUserPath);
311                        //m_UserPathEdit.GetWindow(GW_HWNDPREV).EnableWindow(!bUserPathEmpty);
312                        //m_UserPathEdit.EnableWindow(!bUserPathEmpty);
313                        //m_UserRegisterButton.EnableWindow(bUserPathEmpty);
314                        //m_UserUnregisterButton.EnableWindow(!bUserPathEmpty);
315                        //m_sUserPath = sUserPath;
316                        #pragma endregion
317                }
318
319        // CDialogResize                               
320                       
321        // Window message handlers
322                LRESULT OnInitDialog(HWND, LPARAM)
323                {
324                        _ATLTRY
325                        {
326                                CWaitCursor WaitCursor;
327                                m_StatusEdit = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_STATUS);
328                                m_PathEdit = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_PATH);
329                                m_RegisterButton = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_REGISTER);
330                                m_UnregisterButton = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_UNREGISTER);
331                                m_UserStatusEdit = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERSTATUS);
332                                m_UserPathEdit = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERPATH);
333                                m_UserRegisterButton = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERREGISTER);
334                                m_UserUnregisterButton = GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERUNREGISTER);
335                                //_W(m_UserNoteStatic.SubclassWindow(GetDlgItem(IDC_REGISTRATION_PROPPAGEREGISTRATION_USERNOTE)));
336                                //m_UserNoteStatic.SetIdealHeight();
337                                if(GetOsVersion() >= 0x00060000) // Windows Vista or Windows Server 2008
338                                {
339                                        if(!IsAdministrator())
340                                        {
341                                                m_RegisterButton.SetElevationRequiredState(TRUE);
342                                                m_UnregisterButton.SetElevationRequiredState(TRUE);
343                                                // NOTE: Even per-user registration needs elevation, since we are hooking COM classes
344                                                m_UserRegisterButton.SetElevationRequiredState(TRUE);
345                                                m_UserUnregisterButton.SetElevationRequiredState(TRUE);
346                                        }
347                                }
348                                _StringHelper::GetCommaSeparatedItems(AtlLoadString(IDC_REGISTRATION_PROPPAGEREGISTRATION_STATUS), m_StatusArray);
349                                _A(m_StatusArray.GetCount() == 2);
350                                UpdateControls();
351                        }
352                        _ATLCATCHALL()
353                        {
354                                for(CWindow Window = GetWindow(GW_CHILD); Window.IsWindow(); Window = Window.GetWindow(GW_HWNDNEXT))
355                                        Window.EnableWindow(FALSE);
356                                _ATLRETHROW;
357                        }
358                        return TRUE;
359                }
360                LRESULT OnDestroy()
361                {
362                        return 0;
363                }
364                INT OnSetActive() throw()
365                {
366                        _ATLTRY
367                        {
368                                CWaitCursor WaitCursor;
369                                UpdateControls();
370                        }
371                        _ATLCATCHALL()
372                        {
373                                _Z_EXCEPTION();
374                                return -1;
375                        }
376                        return 0;
377                }
378                LRESULT OnRegister(UINT, INT, HWND)
379                {
380                        _ATLTRY
381                        {
382                                CWaitCursor WaitCursor;
383                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
384                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s \"%s\""), bSilent ? _T("/s") : _T(""), m_PropertySheet.m_sPropPagePath), TRUE);
385                                if(bSilent)
386                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
387                                CancelToClose();
388                        }
389                        _ATLCATCH(Exception)
390                        {
391                                AtlExceptionMessageBox(m_hWnd, Exception);
392                        }
393                        UpdateControls();
394                        return 0;
395                }
396                LRESULT OnUnregister(UINT, INT, HWND)
397                {
398                        _ATLTRY
399                        {
400                                CWaitCursor WaitCursor;
401                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
402                                const CPath& sPath = m_sPath; //m_PropertySheet.m_sPropPagePath
403                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s /u \"%s\""), bSilent ? _T("/s") : _T(""), sPath), TRUE);
404                                if(bSilent)
405                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
406                                CancelToClose();
407                        }
408                        _ATLCATCH(Exception)
409                        {
410                                AtlExceptionMessageBox(m_hWnd, Exception);
411                        }
412                        UpdateControls();
413                        return 0;
414                }
415                LRESULT OnUserRegister(UINT, INT, HWND)
416                {
417                        _ATLTRY
418                        {
419                                CWaitCursor WaitCursor;
420                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
421                                // NOTE: Even per-user registration needs elevation, since we are hooking COM classes
422                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s /i:user /n \"%s\""), bSilent ? _T("/s") : _T(""), m_PropertySheet.m_sPropPagePath), TRUE);
423                                if(bSilent)
424                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
425                                CancelToClose();
426                        }
427                        _ATLCATCH(Exception)
428                        {
429                                AtlExceptionMessageBox(m_hWnd, Exception);
430                        }
431                        UpdateControls();
432                        return 0;
433                }
434                LRESULT OnUserUnregister(UINT, INT, HWND)
435                {
436                        _ATLTRY
437                        {
438                                CWaitCursor WaitCursor;
439                                const BOOL bSilent = !(GetKeyState(VK_SCROLL) & 1);
440                                // NOTE: Even per-user registration needs elevation, since we are hooking COM classes
441                                const DWORD nExitCode = ExecuteWait(AtlFormatString(_T("%s /i:user /n /u \"%s\""), bSilent ? _T("/s") : _T(""), m_PropertySheet.m_sPropPagePath), TRUE);
442                                if(bSilent)
443                                        MessageBeep(nExitCode ? MB_ICONERROR : MB_OK);
444                                CancelToClose();
445                        }
446                        _ATLCATCH(Exception)
447                        {
448                                AtlExceptionMessageBox(m_hWnd, Exception);
449                        }
450                        UpdateControls();
451                        return 0;
452                }
453        };
454
455private:
456        CRegistrationPropertyPage m_RegistrationPropertyPage;
457        CProppageRegistrationPropertyPage m_ProppageRegistrationPropertyPage;
458        CPath m_sPropPagePath;
459
460public:
461// CRegistrationPropertySheet
462        CRegistrationPropertySheet() :
463                CPropertySheetT<CRegistrationPropertySheet>(IDS_REGISTRATION_PROPERTYSHEETCAPTION),
464                m_RegistrationPropertyPage(this),
465                m_ProppageRegistrationPropertyPage(this)
466        {
467                AddPage(m_RegistrationPropertyPage);
468                CPath sDirectory = GetPath();
469                sDirectory.RemoveFileSpec();
470                m_sPropPagePath.Combine(sDirectory, _T("proppage.dll"));
471                if(m_sPropPagePath.FileExists())
472                        AddPage(m_ProppageRegistrationPropertyPage);
473        }
474        BOOL SetInitialPosition()
475        {
476                if(!__super::SetInitialPosition())
477                        return FALSE;
478                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)), TRUE);
479                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)), FALSE);
480                #pragma region Indication of Bitness
481                CString sCaption;
482                _W(GetWindowText(sCaption));
483                #if defined(_WIN64)
484                        sCaption.Append(_T(" (64-bit)"));
485                #else
486                        if(SafeIsWow64Process())
487                                sCaption.Append(_T(" (32-bit)"));
488                #endif // defined(_WIN64)
489                _W(SetWindowText(sCaption));
490                #pragma endregion
491                #pragma region System Menu
492                CMenuHandle Menu = GetSystemMenu(FALSE);
493                _W(Menu.AppendMenu(MF_SEPARATOR));
494                _W(Menu.AppendMenu(MF_STRING, ID_APP_ABOUT, _T("&About...")));
495                #pragma endregion
496                return TRUE;
497        }
498        static LPCTSTR GetTypeLibraryType() throw()
499        {
500                #if defined(_WIN64)
501                        static LPCTSTR g_pszTypeLibraryType = _T("win64");
502                #else
503                        static LPCTSTR g_pszTypeLibraryType = _T("win32");
504                #endif // defined(_WIN64)
505                return g_pszTypeLibraryType;
506        }
507        static CPath FindTypeLibraryPath(const GUID& Identifier = _pAtlModule->m_libid)
508        {
509                CPath sPath;
510                CRegKey Key;
511                if(SUCCEEDED(HRESULT_FROM_WIN32(Key.Open(HKEY_CLASSES_ROOT, AtlFormatString(_T("TypeLib\\%ls\\1.0\\0\\%s"), _PersistHelper::StringFromIdentifier(Identifier), GetTypeLibraryType()), KEY_READ))))
512                        sPath = (LPCTSTR) _RegKeyHelper::QueryStringValue(Key);
513                return sPath;
514        }
515        static CPath FindTypeLibraryPath(HKEY hRootKey, const GUID& Identifier = _pAtlModule->m_libid)
516        {
517                CPath sPath;
518                CRegKey Key;
519                if(SUCCEEDED(HRESULT_FROM_WIN32(Key.Open(hRootKey, AtlFormatString(_T("Software\\Classes\\TypeLib\\%ls\\1.0\\0\\%s"), _PersistHelper::StringFromIdentifier(Identifier), GetTypeLibraryType()), KEY_READ))))
520                        sPath = (LPCTSTR) _RegKeyHelper::QueryStringValue(Key);
521                return sPath;
522        }
523        static CPath FindClassPath(HKEY hRootKey, const GUID& Identifier)
524        {
525                CPath sPath;
526                CRegKey Key;
527                if(SUCCEEDED(HRESULT_FROM_WIN32(Key.Open(hRootKey, AtlFormatString(_T("Software\\Classes\\CLSID\\%ls\\InProcServer32"), _PersistHelper::StringFromIdentifier(Identifier)), KEY_READ))))
528                        sPath = (LPCTSTR) _RegKeyHelper::QueryStringValue(Key);
529                return sPath;
530        }
531        static HANDLE Execute(const CString& sParameters, BOOL bAsAdministrator = FALSE)
532        {
533                SHELLEXECUTEINFO Information;
534                ZeroMemory(&Information, sizeof Information);
535                Information.cbSize = sizeof Information;
536                Information.fMask = SEE_MASK_NOCLOSEPROCESS; 
537                if(bAsAdministrator)
538                        Information.lpVerb = _T("runas");
539                Information.lpFile = _T("regsvr32.exe");
540                Information.nShow = SW_SHOWNORMAL; 
541                Information.lpParameters = sParameters; 
542                __E(ShellExecuteEx(&Information));
543                _Z4(atlTraceSync, 4, _T("Information.hInstApp 0x%p, .hProcess 0x%p\n"), Information.hInstApp, Information.hProcess);
544                return Information.hProcess;
545        }
546        static DWORD ExecuteWait(const CString& sParameters, BOOL bAsAdministrator = FALSE)
547        {
548                CHandle Process;
549                Process.Attach(Execute(sParameters, bAsAdministrator));
550                const DWORD nWaitResult = WaitForSingleObject(Process, INFINITE);
551                _Z4(atlTraceSync, 4, _T("nWaitResult 0x%x\n"), nWaitResult);
552                _A(nWaitResult == WAIT_OBJECT_0);
553                DWORD nExitCode = 0;
554                _W(GetExitCodeProcess(Process, &nExitCode));
555                _Z4(atlTraceGeneral, 4, _T("nExitCode %d (0x%x)\n"), nExitCode, nExitCode);
556                return nExitCode;
557        }
558        static CPath GetPath()
559        {
560                TCHAR pszPath[MAX_PATH] = { 0 };
561                _W(GetModuleFileName(_AtlBaseModule.GetModuleInstance(), pszPath, DIM(pszPath)));
562                return pszPath;
563        }
564
565// Window message handelrs
566        LRESULT OnSysCommand(UINT nCommand, CPoint)
567        {
568                switch(nCommand)
569                {
570                case ID_APP_ABOUT:
571                        {
572                                CAboutDialog Dialog;
573                                Dialog.DoModal(m_hWnd);
574                        }
575                        break;
576                default:
577                        SetMsgHandled(FALSE);
578                }
579                return 0;
580        }
581};
582
Note: See TracBrowser for help on using the repository browser.