Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendeskmon.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
1.7.6.1
|