ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

deskmon.c
Go to the documentation of this file.
00001 #include "precomp.h"
00002 
00003 #define NDEBUG
00004 #include <debug.h>
00005 
00006 static HINSTANCE hInstance;
00007 
00008 #ifdef UNICODE
00009 typedef INT_PTR (WINAPI *PDEVICEPROPERTIES)(HWND,LPCWSTR,LPCWSTR,BOOL);
00010 #define FUNC_DEVICEPROPERTIES "DevicePropertiesW"
00011 #else
00012 typedef INT_PTR (WINAPI *PDEVICEPROPERTIES)(HWND,LPCSTR,LPCSTR,BOOL);
00013 #define FUNC_DEVICEPROPERTIES "DevicePropertiesA"
00014 #endif
00015 
00016 static LPTSTR
00017 GetMonitorDevInstID(LPCTSTR lpDeviceID)
00018 {
00019     /* FIXME: Implement, allocate returned string with LocalAlloc! */
00020     return NULL;
00021 }
00022 
00023 static VOID
00024 ShowMonitorProperties(PDESKMONITOR This)
00025 {
00026     HMODULE hDevMgr;
00027     PDEVICEPROPERTIES pDeviceProperties;
00028     LPTSTR lpDevInstID;
00029 
00030     if (This->SelMonitor != NULL)
00031     {
00032         lpDevInstID = GetMonitorDevInstID(This->SelMonitor->dd.DeviceID);
00033         if (lpDevInstID != NULL)
00034         {
00035             hDevMgr = LoadLibrary(TEXT("devmgr.dll"));
00036             if (hDevMgr != NULL)
00037             {
00038                 pDeviceProperties = (PDEVICEPROPERTIES)GetProcAddress(hDevMgr,
00039                                                                       FUNC_DEVICEPROPERTIES);
00040                 if (pDeviceProperties != NULL)
00041                 {
00042                     pDeviceProperties(This->hwndDlg,
00043                                        NULL,
00044                                        This->SelMonitor->dd.DeviceID,
00045                                        FALSE);
00046                 }
00047 
00048                 FreeLibrary(hDevMgr);
00049             }
00050 
00051             LocalFree((HLOCAL)lpDevInstID);
00052         }
00053     }
00054 }
00055 
00056 static VOID
00057 UpdateMonitorSelection(PDESKMONITOR This)
00058 {
00059     INT i;
00060 
00061     if (This->dwMonitorCount > 1)
00062     {
00063         This->SelMonitor = NULL;
00064 
00065         i = (INT)SendDlgItemMessage(This->hwndDlg,
00066                                     IDC_MONITORLIST,
00067                                     LB_GETCURSEL,
00068                                     0,
00069                                     0);
00070         if (i >= 0)
00071         {
00072             This->SelMonitor = (PDESKMONINFO)SendDlgItemMessage(This->hwndDlg,
00073                                                                 IDC_MONITORLIST,
00074                                                                 LB_GETITEMDATA,
00075                                                                 (WPARAM)i,
00076                                                                 0);
00077         }
00078     }
00079     else
00080         This->SelMonitor = This->Monitors;
00081 
00082     EnableWindow(GetDlgItem(This->hwndDlg,
00083                             IDC_MONITORPROPERTIES),
00084                  This->SelMonitor != NULL);
00085 }
00086 
00087 static VOID
00088 UpdatePruningControls(PDESKMONITOR This)
00089 {
00090     EnableWindow(GetDlgItem(This->hwndDlg,
00091                             IDC_PRUNINGCHECK),
00092                  This->bModesPruned && !This->bKeyIsReadOnly);
00093     CheckDlgButton(This->hwndDlg,
00094                    IDC_PRUNINGCHECK,
00095                    (This->bModesPruned && This->bPruningOn) ? BST_CHECKED : BST_UNCHECKED);
00096 }
00097 
00098 static VOID
00099 GetPruningSettings(PDESKMONITOR This)
00100 {
00101     BOOL bModesPruned = FALSE, bKeyIsReadOnly = FALSE, bPruningOn = FALSE;
00102 
00103     if (This->DeskExtInterface != NULL)
00104     {
00105         This->DeskExtInterface->GetPruningMode(This->DeskExtInterface->Context,
00106                                                &bModesPruned,
00107                                                &bKeyIsReadOnly,
00108                                                &bPruningOn);
00109     }
00110 
00111     /* Check the boolean values against zero before assigning it to the bitfields! */
00112     This->bModesPruned = (bModesPruned != FALSE);
00113     This->bKeyIsReadOnly = (bKeyIsReadOnly != FALSE);
00114     This->bPruningOn = (bPruningOn != FALSE);
00115 
00116     UpdatePruningControls(This);
00117 }
00118 
00119 static VOID
00120 UpdateRefreshFrequencyList(PDESKMONITOR This)
00121 {
00122     PDEVMODEW lpCurrentMode, lpMode;
00123     TCHAR szBuffer[64];
00124     DWORD dwIndex;
00125     INT i;
00126     BOOL bHasDef = FALSE;
00127     BOOL bAdded = FALSE;
00128 
00129     /* Fill the refresh rate combo box */
00130     SendDlgItemMessage(This->hwndDlg,
00131                        IDC_REFRESHRATE,
00132                        CB_RESETCONTENT,
00133                        0,
00134                        0);
00135 
00136     lpCurrentMode = This->DeskExtInterface->GetCurrentMode(This->DeskExtInterface->Context);
00137     dwIndex = 0;
00138 
00139     do
00140     {
00141         lpMode = This->DeskExtInterface->EnumAllModes(This->DeskExtInterface->Context,
00142                                                       dwIndex++);
00143         if (lpMode != NULL &&
00144             lpMode->dmBitsPerPel == lpCurrentMode->dmBitsPerPel &&
00145             lpMode->dmPelsWidth == lpCurrentMode->dmPelsWidth &&
00146             lpMode->dmPelsHeight == lpCurrentMode->dmPelsHeight)
00147         {
00148             /* We're only interested in refresh rates for the current resolution and color depth */
00149 
00150             if (lpMode->dmDisplayFrequency <= 1)
00151             {
00152                 /* Default hardware frequency */
00153                 if (bHasDef)
00154                     continue;
00155 
00156                 bHasDef = TRUE;
00157 
00158                 if (!LoadString(hInstance,
00159                                 IDS_USEDEFFRQUENCY,
00160                                 szBuffer,
00161                                 sizeof(szBuffer) / sizeof(szBuffer[0])))
00162                 {
00163                     szBuffer[0] = TEXT('\0');
00164                 }
00165             }
00166             else
00167             {
00168                 TCHAR szFmt[64];
00169 
00170                 if (!LoadString(hInstance,
00171                                 IDS_FREQFMT,
00172                                 szFmt,
00173                                 sizeof(szFmt) / sizeof(szFmt[0])))
00174                 {
00175                     szFmt[0] = TEXT('\0');
00176                 }
00177 
00178                 _sntprintf(szBuffer,
00179                            sizeof(szBuffer) / sizeof(szBuffer[0]),
00180                            szFmt,
00181                            lpMode->dmDisplayFrequency);
00182             }
00183 
00184             i = (INT)SendDlgItemMessage(This->hwndDlg,
00185                                         IDC_REFRESHRATE,
00186                                         CB_ADDSTRING,
00187                                         0,
00188                                         (LPARAM)szBuffer);
00189             if (i >= 0)
00190             {
00191                 bAdded = TRUE;
00192 
00193                 SendDlgItemMessage(This->hwndDlg,
00194                                    IDC_REFRESHRATE,
00195                                    CB_SETITEMDATA,
00196                                    (WPARAM)i,
00197                                    (LPARAM)lpMode);
00198 
00199                 if (lpMode->dmDisplayFrequency == lpCurrentMode->dmDisplayFrequency)
00200                 {
00201                     SendDlgItemMessage(This->hwndDlg,
00202                                        IDC_REFRESHRATE,
00203                                        CB_SETCURSEL,
00204                                        (WPARAM)i,
00205                                        0);
00206                 }
00207             }
00208         }
00209 
00210     } while (lpMode != NULL);
00211 
00212     EnableWindow(GetDlgItem(This->hwndDlg,
00213                             IDS_MONITORSETTINGSGROUP),
00214                  bAdded);
00215     EnableWindow(GetDlgItem(This->hwndDlg,
00216                             IDS_REFRESHRATELABEL),
00217                  bAdded);
00218     EnableWindow(GetDlgItem(This->hwndDlg,
00219                             IDC_REFRESHRATE),
00220                  bAdded);
00221 
00222     GetPruningSettings(This);
00223 }
00224 
00225 static VOID
00226 InitMonitorDialog(PDESKMONITOR This)
00227 {
00228     PDESKMONINFO pmi, pminext, *pmilink;
00229     DISPLAY_DEVICE dd;
00230     BOOL bRet;
00231     INT i;
00232     DWORD dwIndex;
00233 
00234     /* Free all allocated monitors */
00235     pmi = This->Monitors;
00236     This->Monitors = NULL;
00237     while (pmi != NULL)
00238     {
00239         pminext = pmi->Next;
00240         LocalFree((HLOCAL)pmi);
00241         pmi = pminext;
00242     }
00243 
00244     This->SelMonitor = NULL;
00245     This->dwMonitorCount = 0;
00246 
00247     if (This->lpDisplayDevice != NULL)
00248         LocalFree((HLOCAL)This->lpDisplayDevice);
00249 
00250     This->lpDisplayDevice = QueryDeskCplString(This->pdtobj,
00251                                                RegisterClipboardFormat(DESK_EXT_DISPLAYDEVICE));
00252 
00253     if (This->DeskExtInterface != NULL)
00254     {
00255         if (This->lpDisplayDevice != NULL)
00256         {
00257             /* Enumerate all monitors */
00258             dwIndex = 0;
00259             pmilink = &This->Monitors;
00260 
00261             do
00262             {
00263                 dd.cb = sizeof(dd);
00264                 bRet = EnumDisplayDevices(This->lpDisplayDevice,
00265                                           dwIndex++,
00266                                           &dd,
00267                                           0);
00268                 if (bRet)
00269                 {
00270                     pmi = LocalAlloc(LMEM_FIXED,
00271                                      sizeof(*pmi));
00272                     if (pmi != NULL)
00273                     {
00274                         CopyMemory(&pmi->dd,
00275                                    &dd,
00276                                    sizeof(dd));
00277                         pmi->Next = NULL;
00278                         *pmilink = pmi;
00279                         pmilink = &pmi->Next;
00280 
00281                         This->dwMonitorCount++;
00282                     }
00283                 }
00284             } while (bRet);
00285         }
00286 
00287         This->lpDevModeOnInit = This->DeskExtInterface->GetCurrentMode(This->DeskExtInterface->Context);
00288     }
00289     else
00290         This->lpDevModeOnInit = NULL;
00291 
00292     This->lpSelDevMode = This->lpDevModeOnInit;
00293 
00294     /* Setup the UI depending on how many monitors are attached */
00295     if (This->dwMonitorCount == 0)
00296     {
00297         LPTSTR lpMonitorName;
00298 
00299         /* This is a fallback, let's hope that desk.cpl can provide us with a monitor name */
00300         lpMonitorName = QueryDeskCplString(This->pdtobj,
00301                                            RegisterClipboardFormat(DESK_EXT_MONITORNAME));
00302 
00303         SetDlgItemText(This->hwndDlg,
00304                        IDC_MONITORNAME,
00305                        lpMonitorName);
00306 
00307         if (lpMonitorName != NULL)
00308             LocalFree((HLOCAL)lpMonitorName);
00309     }
00310     else if (This->dwMonitorCount == 1)
00311     {
00312         This->SelMonitor = This->Monitors;
00313         SetDlgItemText(This->hwndDlg,
00314                        IDC_MONITORNAME,
00315                        This->Monitors->dd.DeviceString);
00316     }
00317     else
00318     {
00319         SendDlgItemMessage(This->hwndDlg,
00320                            IDC_MONITORLIST,
00321                            LB_RESETCONTENT,
00322                            0,
00323                            0);
00324 
00325         pmi = This->Monitors;
00326         while (pmi != NULL)
00327         {
00328             i = (INT)SendDlgItemMessage(This->hwndDlg,
00329                                         IDC_MONITORLIST,
00330                                         LB_ADDSTRING,
00331                                         0,
00332                                         (LPARAM)pmi->dd.DeviceString);
00333             if (i >= 0)
00334             {
00335                 SendDlgItemMessage(This->hwndDlg,
00336                                    IDC_MONITORLIST,
00337                                    LB_SETITEMDATA,
00338                                    (WPARAM)i,
00339                                    (LPARAM)pmi);
00340 
00341                 if (This->SelMonitor == NULL)
00342                 {
00343                     SendDlgItemMessage(This->hwndDlg,
00344                                        IDC_MONITORLIST,
00345                                        LB_SETCURSEL,
00346                                        (WPARAM)i,
00347                                        0);
00348 
00349                     This->SelMonitor = pmi;
00350                 }
00351             }
00352 
00353             pmi = pmi->Next;
00354         }
00355     }
00356 
00357     /* Show/Hide controls */
00358     ShowWindow(GetDlgItem(This->hwndDlg,
00359                           IDC_MONITORNAME),
00360                (This->dwMonitorCount <= 1 ? SW_SHOW : SW_HIDE));
00361     ShowWindow(GetDlgItem(This->hwndDlg,
00362                           IDC_MONITORLIST),
00363                (This->dwMonitorCount > 1 ? SW_SHOW : SW_HIDE));
00364 
00365     UpdateRefreshFrequencyList(This);
00366     UpdateMonitorSelection(This);
00367 }
00368 
00369 static VOID
00370 UpdatePruningSelection(PDESKMONITOR This)
00371 {
00372     BOOL bPruningOn;
00373 
00374     if (This->DeskExtInterface != NULL && This->bModesPruned && !This->bKeyIsReadOnly)
00375     {
00376         bPruningOn = IsDlgButtonChecked(This->hwndDlg,
00377                                         IDC_PRUNINGCHECK) != BST_UNCHECKED;
00378 
00379         if (bPruningOn != This->bPruningOn)
00380         {
00381             /* Tell desk.cpl to turn on/off pruning mode */
00382             This->bPruningOn = bPruningOn;
00383             This->DeskExtInterface->SetPruningMode(This->DeskExtInterface->Context,
00384                                                    bPruningOn);
00385 
00386             /* Fill the refresh rate combobox again, we now receive a filtered
00387                or unfiltered device mode list from desk.cpl (depending on whether
00388                pruning is active or not) */
00389             UpdateRefreshFrequencyList(This);
00390 
00391             (void)PropSheet_Changed(GetParent(This->hwndDlg),
00392                                     This->hwndDlg);
00393         }
00394     }
00395 }
00396 
00397 static VOID
00398 UpdateRefreshRateSelection(PDESKMONITOR This)
00399 {
00400     PDEVMODEW lpCurrentDevMode;
00401     INT i;
00402 
00403     if (This->DeskExtInterface != NULL)
00404     {
00405         i = (INT)SendDlgItemMessage(This->hwndDlg,
00406                                     IDC_REFRESHRATE,
00407                                     CB_GETCURSEL,
00408                                     0,
00409                                     0);
00410         if (i >= 0)
00411         {
00412             lpCurrentDevMode = This->lpSelDevMode;
00413             This->lpSelDevMode = (PDEVMODEW)SendDlgItemMessage(This->hwndDlg,
00414                                                                IDC_REFRESHRATE,
00415                                                                CB_GETITEMDATA,
00416                                                                (WPARAM)i,
00417                                                                0);
00418 
00419             if (This->lpSelDevMode != NULL && This->lpSelDevMode != lpCurrentDevMode)
00420             {
00421                 This->DeskExtInterface->SetCurrentMode(This->DeskExtInterface->Context,
00422                                                        This->lpSelDevMode);
00423 
00424                 UpdateRefreshFrequencyList(This);
00425 
00426                 (void)PropSheet_Changed(GetParent(This->hwndDlg),
00427                                         This->hwndDlg);
00428             }
00429         }
00430     }
00431 }
00432 
00433 static LONG
00434 ApplyMonitorChanges(PDESKMONITOR This)
00435 {
00436     LONG lChangeRet;
00437 
00438     if (This->DeskExtInterface != NULL)
00439     {
00440         /* Change the display settings through desk.cpl */
00441         lChangeRet = DeskCplExtDisplaySaveSettings(This->DeskExtInterface,
00442                                                    This->hwndDlg);
00443         if (lChangeRet == DISP_CHANGE_SUCCESSFUL)
00444         {
00445             /* Save the new mode */
00446             This->lpDevModeOnInit = This->DeskExtInterface->GetCurrentMode(This->DeskExtInterface->Context);
00447             This->lpSelDevMode = This->lpDevModeOnInit;
00448             return PSNRET_NOERROR;
00449         }
00450         else if (lChangeRet == DISP_CHANGE_RESTART)
00451         {
00452             /* Notify desk.cpl that the user needs to reboot */
00453             PropSheet_RestartWindows(GetParent(This->hwndDlg));
00454             return PSNRET_NOERROR;
00455         }
00456     }
00457 
00458     InitMonitorDialog(This);
00459 
00460     return PSNRET_INVALID_NOCHANGEPAGE;
00461 }
00462 
00463 static VOID
00464 ResetMonitorChanges(PDESKMONITOR This)
00465 {
00466     if (This->DeskExtInterface != NULL && This->lpDevModeOnInit != NULL)
00467     {
00468         This->DeskExtInterface->SetCurrentMode(This->DeskExtInterface->Context,
00469                                                This->lpDevModeOnInit);
00470     }
00471 }
00472 
00473 static INT_PTR CALLBACK
00474 MonitorDlgProc(HWND hwndDlg,
00475                UINT uMsg,
00476                WPARAM wParam,
00477                LPARAM lParam)
00478 {
00479     PDESKMONITOR This;
00480     INT_PTR Ret = 0;
00481 
00482     if (uMsg != WM_INITDIALOG)
00483     {
00484         This = (PDESKMONITOR)GetWindowLongPtr(hwndDlg,
00485                                               DWL_USER);
00486     }
00487 
00488     switch (uMsg)
00489     {
00490         case WM_INITDIALOG:
00491             This = (PDESKMONITOR)((LPCPROPSHEETPAGE)lParam)->lParam;
00492             This->hwndDlg = hwndDlg;
00493             SetWindowLongPtr(hwndDlg,
00494                              DWL_USER,
00495                              (LONG_PTR)This);
00496 
00497             InitMonitorDialog(This);
00498             Ret = TRUE;
00499             break;
00500 
00501         case WM_COMMAND:
00502             switch (LOWORD(wParam))
00503             {
00504                 case IDC_MONITORPROPERTIES:
00505                     ShowMonitorProperties(This);
00506                     break;
00507 
00508                 case IDC_MONITORLIST:
00509                     if (HIWORD(wParam) == LBN_SELCHANGE)
00510                         UpdateMonitorSelection(This);
00511                     break;
00512 
00513                 case IDC_PRUNINGCHECK:
00514                     if (HIWORD(wParam) == BN_CLICKED)
00515                         UpdatePruningSelection(This);
00516                     break;
00517 
00518                 case IDC_REFRESHRATE:
00519                     if (HIWORD(wParam) == CBN_SELCHANGE)
00520                         UpdateRefreshRateSelection(This);
00521                     break;
00522             }
00523             break;
00524 
00525         case WM_NOTIFY:
00526         {
00527             NMHDR *nmh = (NMHDR *)lParam;
00528 
00529             switch (nmh->code)
00530             {
00531                 case PSN_APPLY:
00532                 {
00533                     SetWindowLongPtr(hwndDlg,
00534                                      DWL_MSGRESULT,
00535                                      ApplyMonitorChanges(This));
00536                     break;
00537                 }
00538 
00539                 case PSN_RESET:
00540                     ResetMonitorChanges(This);
00541                     break;
00542 
00543                 case PSN_SETACTIVE:
00544                     UpdateRefreshFrequencyList(This);
00545                     break;
00546             }
00547             break;
00548         }
00549     }
00550 
00551     return Ret;
00552 }
00553 
00554 static VOID
00555 IDeskMonitor_Destroy(PDESKMONITOR This)
00556 {
00557     PDESKMONINFO pmi, pminext;
00558 
00559     if (This->pdtobj != NULL)
00560     {
00561         IDataObject_Release(This->pdtobj);
00562         This->pdtobj = NULL;
00563     }
00564 
00565     if (This->DeskExtInterface != NULL)
00566     {
00567         LocalFree((HLOCAL)This->DeskExtInterface);
00568         This->DeskExtInterface = NULL;
00569     }
00570 
00571     if (This->lpDisplayDevice != NULL)
00572     {
00573         LocalFree((HLOCAL)This->lpDisplayDevice);
00574         This->lpDisplayDevice = NULL;
00575     }
00576 
00577     /* Free all monitors */
00578     pmi = This->Monitors;
00579     This->Monitors = NULL;
00580     while (pmi != NULL)
00581     {
00582         pminext = pmi->Next;
00583         LocalFree((HLOCAL)pmi);
00584         pmi = pminext;
00585     }
00586 }
00587 
00588 ULONG
00589 IDeskMonitor_AddRef(PDESKMONITOR This)
00590 {
00591     ULONG ret;
00592 
00593     ret = InterlockedIncrement((PLONG)&This->ref);
00594     if (ret == 1)
00595         InterlockedIncrement(&dll_refs);
00596 
00597     return ret;
00598 }
00599 
00600 ULONG
00601 IDeskMonitor_Release(PDESKMONITOR This)
00602 {
00603     ULONG ret;
00604 
00605     ret = InterlockedDecrement((PLONG)&This->ref);
00606     if (ret == 0)
00607     {
00608         IDeskMonitor_Destroy(This);
00609         InterlockedDecrement(&dll_refs);
00610 
00611         HeapFree(GetProcessHeap(),
00612                  0,
00613                  This);
00614     }
00615 
00616     return ret;
00617 }
00618 
00619 HRESULT STDMETHODCALLTYPE
00620 IDeskMonitor_QueryInterface(PDESKMONITOR This,
00621                             REFIID iid,
00622                             PVOID *pvObject)
00623 {
00624     *pvObject = NULL;
00625 
00626     if (IsEqualIID(iid,
00627                    &IID_IShellPropSheetExt) ||
00628         IsEqualIID(iid,
00629                    &IID_IUnknown))
00630     {
00631         *pvObject = impl_to_interface(This, IShellPropSheetExt);
00632     }
00633     else if (IsEqualIID(iid,
00634                         &IID_IShellExtInit))
00635     {
00636         *pvObject = impl_to_interface(This, IShellExtInit);
00637     }
00638     else if (IsEqualIID(iid,
00639                         &IID_IClassFactory))
00640     {
00641         *pvObject = impl_to_interface(This, IClassFactory);
00642     }
00643     else
00644     {
00645         DPRINT1("IDeskMonitor::QueryInterface(%p,%p): E_NOINTERFACE\n", iid, pvObject);
00646         return E_NOINTERFACE;
00647     }
00648 
00649     IDeskMonitor_AddRef(This);
00650     return S_OK;
00651 }
00652 
00653 HRESULT
00654 IDeskMonitor_Initialize(PDESKMONITOR This,
00655                         LPCITEMIDLIST pidlFolder,
00656                         IDataObject *pdtobj,
00657                         HKEY hkeyProgID)
00658 {
00659     DPRINT1("IDeskMonitor::Initialize(%p,%p,%p)\n", pidlFolder, pdtobj, hkeyProgID);
00660 
00661     if (pdtobj != NULL)
00662     {
00663         IDataObject_AddRef(pdtobj);
00664         This->pdtobj = pdtobj;
00665 
00666         /* Get a copy of the desk.cpl extension interface */
00667         This->DeskExtInterface = QueryDeskCplExtInterface(This->pdtobj);
00668         if (This->DeskExtInterface != NULL)
00669             return S_OK;
00670     }
00671 
00672     return S_FALSE;
00673 }
00674 
00675 HRESULT
00676 IDeskMonitor_AddPages(PDESKMONITOR This,
00677                       LPFNADDPROPSHEETPAGE pfnAddPage,
00678                       LPARAM lParam)
00679 {
00680     HPROPSHEETPAGE hpsp;
00681     PROPSHEETPAGE psp;
00682 
00683     DPRINT1("IDeskMonitor::AddPages(%p,%p)\n", pfnAddPage, lParam);
00684 
00685     psp.dwSize = sizeof(psp);
00686     psp.dwFlags = PSP_DEFAULT;
00687     psp.hInstance = hInstance;
00688     psp.pszTemplate = MAKEINTRESOURCE(IDD_MONITOR);
00689     psp.pfnDlgProc = MonitorDlgProc;
00690     psp.lParam = (LPARAM)This;
00691 
00692     hpsp = CreatePropertySheetPage(&psp);
00693     if (hpsp != NULL && pfnAddPage(hpsp, lParam))
00694         return S_OK;
00695 
00696     return S_FALSE;
00697 }
00698 
00699 HRESULT
00700 IDeskMonitor_ReplacePage(PDESKMONITOR This,
00701                          EXPPS uPageID,
00702                          LPFNADDPROPSHEETPAGE pfnReplacePage,
00703                          LPARAM lParam)
00704 {
00705     DPRINT1("IDeskMonitor::ReplacePage(%u,%p,%p)\n", uPageID, pfnReplacePage, lParam);
00706     return E_NOTIMPL;
00707 }
00708 
00709 HRESULT
00710 IDeskMonitor_Constructor(REFIID riid,
00711                          LPVOID *ppv)
00712 {
00713     PDESKMONITOR This;
00714     HRESULT hRet = E_OUTOFMEMORY;
00715 
00716     DPRINT1("IDeskMonitor::Constructor(%p,%p)\n", riid, ppv);
00717 
00718     This = HeapAlloc(GetProcessHeap(),
00719                      0,
00720                      sizeof(*This));
00721     if (This != NULL)
00722     {
00723         ZeroMemory(This,
00724                    sizeof(*This));
00725 
00726         IDeskMonitor_InitIface(This);
00727 
00728         hRet = IDeskMonitor_QueryInterface(This,
00729                                            riid,
00730                                            ppv);
00731         if (!SUCCEEDED(hRet))
00732             IDeskMonitor_Release(This);
00733     }
00734 
00735     return hRet;
00736 }
00737 
00738 BOOL WINAPI
00739 DllMain(HINSTANCE hinstDLL,
00740         DWORD dwReason,
00741         LPVOID lpvReserved)
00742 {
00743     switch (dwReason)
00744     {
00745         case DLL_PROCESS_ATTACH:
00746             hInstance = hinstDLL;
00747             DisableThreadLibraryCalls(hInstance);
00748             break;
00749     }
00750 
00751     return TRUE;
00752 }

Generated on Sat May 26 2012 04:21:05 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.