Changeset 6952 for trunk/src/quartz/devmon.c
- Timestamp:
- Oct 6, 2001, 10:56:18 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/quartz/devmon.c
r6710 r6952 1 1 /* 2 2 * Implements IMoniker for CLSID_CDeviceMoniker. 3 * Implements IPropertyBag. (internal) 3 4 * 4 5 * hidenori@a2.ctktv.ne.jp … … 27 28 #include "quartz_private.h" 28 29 #include "devmon.h" 29 #include "monprop.h"30 30 #include "regsvr.h" 31 31 32 33 /*************************************************************************** 34 * 35 * CDeviceMoniker::IMoniker 36 * 37 */ 32 38 33 39 static HRESULT WINAPI … … 150 156 return hr; 151 157 152 returnCoCreateInstance(158 hr = CoCreateInstance( 153 159 &clsid, NULL, CLSCTX_INPROC_SERVER, riid, ppvResult ); 160 TRACE( "hr = %08lx\n", hr ); 161 162 return hr; 154 163 } 155 164 … … 374 383 } 375 384 385 /*************************************************************************** 386 * 387 * new/delete for CDeviceMoniker 388 * 389 */ 376 390 377 391 static void QUARTZ_DestroyDeviceMoniker(IUnknown* punk) … … 383 397 384 398 /* can I use offsetof safely? - FIXME? */ 385 static QUARTZ_IFEntry IFEntries[] =399 static QUARTZ_IFEntry CDeviceMoniker_IFEntries[] = 386 400 { 387 401 { &IID_IPersist, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) }, … … 411 425 } 412 426 413 pdm->unk.pEntries = IFEntries;414 pdm->unk.dwEntries = sizeof( IFEntries)/sizeof(IFEntries[0]);427 pdm->unk.pEntries = CDeviceMoniker_IFEntries; 428 pdm->unk.dwEntries = sizeof(CDeviceMoniker_IFEntries)/sizeof(CDeviceMoniker_IFEntries[0]); 415 429 pdm->unk.pOnFinalRelease = &QUARTZ_DestroyDeviceMoniker; 416 430 … … 421 435 422 436 437 /*************************************************************************** 438 * 439 * CRegPropertyBag::IPropertyBag 440 * 441 */ 442 443 static HRESULT WINAPI 444 IPropertyBag_fnQueryInterface(IPropertyBag* iface,REFIID riid,void** ppobj) 445 { 446 CRegPropertyBag_THIS(iface,propbag); 447 448 TRACE("(%p)->()\n",This); 449 450 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj); 451 } 452 453 static ULONG WINAPI 454 IPropertyBag_fnAddRef(IPropertyBag* iface) 455 { 456 CRegPropertyBag_THIS(iface,propbag); 457 458 TRACE("(%p)->()\n",This); 459 460 return IUnknown_AddRef(This->unk.punkControl); 461 } 462 463 static ULONG WINAPI 464 IPropertyBag_fnRelease(IPropertyBag* iface) 465 { 466 CRegPropertyBag_THIS(iface,propbag); 467 468 TRACE("(%p)->()\n",This); 469 470 return IUnknown_Release(This->unk.punkControl); 471 } 472 473 static HRESULT WINAPI 474 IPropertyBag_fnRead(IPropertyBag* iface,LPCOLESTR lpszPropName,VARIANT* pVar,IErrorLog* pLog) 475 { 476 CRegPropertyBag_THIS(iface,propbag); 477 LONG lr; 478 DWORD dwSize; 479 DWORD dwValueType; 480 481 TRACE("(%p)->(%s,%p,%p)\n",This, 482 debugstr_w(lpszPropName),pVar,pLog); 483 484 if ( lpszPropName == NULL || pVar == NULL ) 485 return E_POINTER; 486 487 dwSize = 0; 488 lr = RegQueryValueExW( 489 This->m_hKey, lpszPropName, NULL, 490 &dwValueType, NULL, &dwSize ); 491 if ( lr != ERROR_SUCCESS ) 492 { 493 TRACE( "RegQueryValueExW failed.\n" ); 494 return E_INVALIDARG; 495 } 496 497 switch ( dwValueType ) 498 { 499 case REG_SZ: 500 TRACE( "REG_SZ / length = %lu\n", dwSize ); 501 if ( pVar->n1.n2.vt == VT_EMPTY ) 502 pVar->n1.n2.vt = VT_BSTR; 503 if ( pVar->n1.n2.vt != VT_BSTR ) 504 { 505 TRACE( "type of VARIANT is not BSTR\n" ); 506 return E_FAIL; 507 } 508 509 pVar->n1.n2.n3.bstrVal = SysAllocStringByteLen( 510 NULL, dwSize ); 511 if ( pVar->n1.n2.n3.bstrVal == NULL ) 512 { 513 TRACE( "out of memory.\n" ); 514 return E_OUTOFMEMORY; 515 } 516 lr = RegQueryValueExW( 517 This->m_hKey, lpszPropName, NULL, 518 &dwValueType, 519 (BYTE*)pVar->n1.n2.n3.bstrVal, &dwSize ); 520 if ( lr != ERROR_SUCCESS ) 521 { 522 TRACE( "failed to query value\n" ); 523 SysFreeString(pVar->n1.n2.n3.bstrVal); 524 return E_FAIL; 525 } 526 TRACE( "value is BSTR; %s\n", debugstr_w(pVar->n1.n2.n3.bstrVal) ); 527 break; 528 default: 529 FIXME("(%p)->(%s,%p,%p) - unsupported value type.\n",This, 530 debugstr_w(lpszPropName),pVar,pLog); 531 return E_FAIL; 532 } 533 534 TRACE( "returned successfully.\n" ); 535 return NOERROR; 536 } 537 538 static HRESULT WINAPI 539 IPropertyBag_fnWrite(IPropertyBag* iface,LPCOLESTR lpszPropName,VARIANT* pVar) 540 { 541 CRegPropertyBag_THIS(iface,propbag); 542 543 FIXME("(%p)->(%s,%p) stub!\n",This, 544 debugstr_w(lpszPropName),pVar); 545 546 if ( lpszPropName == NULL || pVar == NULL ) 547 return E_POINTER; 548 549 return E_NOTIMPL; 550 } 551 552 553 554 555 static ICOM_VTABLE(IPropertyBag) ipropbag = 556 { 557 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 558 /* IUnknown fields */ 559 IPropertyBag_fnQueryInterface, 560 IPropertyBag_fnAddRef, 561 IPropertyBag_fnRelease, 562 /* IPropertyBag fields */ 563 IPropertyBag_fnRead, 564 IPropertyBag_fnWrite, 565 }; 566 567 static HRESULT CRegPropertyBag_InitIPropertyBag( 568 CRegPropertyBag* prpb, HKEY hkRoot, LPCWSTR lpKeyPath ) 569 { 570 ICOM_VTBL(&prpb->propbag) = &ipropbag; 571 572 if ( RegOpenKeyExW( 573 hkRoot, lpKeyPath, 0, 574 KEY_ALL_ACCESS, &prpb->m_hKey ) != ERROR_SUCCESS ) 575 return E_FAIL; 576 577 return NOERROR; 578 } 579 580 static void CRegPropertyBag_UninitIPropertyBag( 581 CRegPropertyBag* prpb ) 582 { 583 RegCloseKey( prpb->m_hKey ); 584 } 585 586 587 /*************************************************************************** 588 * 589 * new/delete for CRegPropertyBag 590 * 591 */ 592 593 static void QUARTZ_DestroyRegPropertyBag(IUnknown* punk) 594 { 595 CRegPropertyBag_THIS(punk,unk); 596 597 CRegPropertyBag_UninitIPropertyBag(This); 598 } 599 600 601 /* can I use offsetof safely? - FIXME? */ 602 static QUARTZ_IFEntry CRegPropertyBag_IFEntries[] = 603 { 604 { &IID_IPropertyBag, offsetof(CRegPropertyBag,propbag)-offsetof(CRegPropertyBag,unk) }, 605 }; 606 607 HRESULT QUARTZ_CreateRegPropertyBag( 608 HKEY hkRoot, LPCWSTR lpKeyPath, 609 IPropertyBag** ppPropBag ) 610 { 611 CRegPropertyBag* prpb; 612 HRESULT hr; 613 614 TRACE("(%08x,%s,%p)\n",hkRoot,debugstr_w(lpKeyPath),ppPropBag ); 615 616 prpb = (CRegPropertyBag*)QUARTZ_AllocObj( sizeof(CRegPropertyBag) ); 617 if ( prpb == NULL ) 618 return E_OUTOFMEMORY; 619 620 QUARTZ_IUnkInit( &prpb->unk, NULL ); 621 hr = CRegPropertyBag_InitIPropertyBag( prpb, hkRoot, lpKeyPath ); 622 if ( FAILED(hr) ) 623 { 624 QUARTZ_FreeObj( prpb ); 625 return hr; 626 } 627 628 prpb->unk.pEntries = CRegPropertyBag_IFEntries; 629 prpb->unk.dwEntries = sizeof(CRegPropertyBag_IFEntries)/sizeof(CRegPropertyBag_IFEntries[0]); 630 prpb->unk.pOnFinalRelease = &QUARTZ_DestroyRegPropertyBag; 631 632 *ppPropBag = (IPropertyBag*)(&prpb->propbag); 633 634 return S_OK; 635 } 636 637 638
Note:
See TracChangeset
for help on using the changeset viewer.