Essential COM

(File Moniker). , : , , . . API- CoGetInstanceFromFile:

 HRESULT CoGetInstanceFromFile(            [in, unique] COSERVERINFO *pcsi,             // host/security info -      /             [in, unique] CLSID *pClsid,             // explicit CLSID (opt) -   CLSID (opt)           [in, unique] IUnknown *punk0uter,              // for aggregation -                [in] DWORD dwClsCtx,             // locality? -  ?           [in] DWORD grfMode,             // file open mode -                  [in] OLECHAR *pwszName,             // file name of object -                  [in] DWORD cmqi,             // how many interfaces? -    ?            [out, size_is(cmqi)] MULTI_QI *prgmq             // where to put itfs -      ); 

, (persistent state) 1. CoGetInstanceFromFile , , ( ) . , CoGetInstanceFromFile CLSID . CLSID . , CLSID , ( ) . - , - , CLSID , 2.

CLSID , CoGetInstanceFromFile CLSID API- GetClassFile:

 HRESULT GetClassFile([in, string) OLECHAR *pwszFileName, [out] CLSID *pclsid); 

, , GetClassFile , .

- , ROT (Running Object Table ) - , , . ROT SCM, , - . , ROT . , , IMoniker. kParseDisplayName, API- CreateFileMoniker:

 HRESULT CreateFileMoniker(           [in, string] const OLECHAR *pszFileName,            [out] IMoniker **ppmk); 

ROT , CoGetInstanceFromFile . ROT , IPersistFile::Load :

 [object, uuid(0000010b-0000-0000-C000-000000000046)] interface IPersistFile : IPersist {   // called by CoGetInstanceFromFile to initialize object   //     CoGetInstanceFromFile    //      HRESULT Load(             [in, string] const OLECHAR * pszFileName,             [in] DWORD grfMode );   // remaining methods deleted for clarity    //          } 

ROT , :

 STDMETHODIMP::Load(const OLECHAR *pszFileName, DWORD grfMode) {       // read in persisted object state        //              HRESULT hr = this->MyReadStateFromFile(pszFile, grfMode);     if (FAILED(hr))          return hr;       // get pointer to ROT from SCM        //       ROT   SCM      IRunningObjectTable *prot = 0;     hr = GetRunningObjectTable(0, &prot);     if (SUCCEEDED(hr)) {           // create a file moniker to register in ROT           //             ROT         IMoniker *pmk = 0;         hr = CreateFileMoniker(pszFileName, &pmk);         if (SUCCEEDED(hr)) {               // register self in ROT               //     ROT             hr = prot->Register(0, this, pmk, &m_dwReg);             pmk->Release();         }         prot->Release();     }     return hr; } 

IPersistFile::Load SCM CoGetInstanceFromFile. IRunningObjectTable SCM API- GetRunningObjectTable. ROT, CoGetInstanceFromFile, , , 3.

File Moniker . - , , ROT, CoGetInstanceFromFile. - , CoGetInstanceFromFile IMoniker. File Moniker BindToObject CoGetInstanceFromFile:

 // pseudo-code from OLE32.DLL  //     OLE32.DLL STDMETHODIMP FileMoniker::BindToObject(IBindCtx *pbc,                                         IMoniker *pmkToLeft,                                         REFIID riid, void **ppv)  {       // assume failure -            *ppv =  ;     HRESULT hr = E_FAIL;     if (pmkToLeft == 0) {           // no moniker to left -              MULTI_QI mqi = { &riid, 0, 0 };         COSERVERINFO *pcsi;         DWORD grfMode;         DWORD dwClsCtx;           // these three parameters are attributes of the BindCtx            //           BindCtx          this->MyGetFromBindCtx(pbc, &pcsi, &grfMode, &dwClsCtx);         hr = CoGetInstanceFromFile(pcsi, 0, 0, dwClsCtx,                                    grfMode, this->m_pszFileName,                                     1, &mqi);         if (SUCCEEDED(hr))             *ppv = mqi.pItf;     } else {           // there's a moniker to the left -                  // ask object to left for IClassActivator            // or IClassFactory           //         IClassActivator                // IClassFactory      }      return hr; } 

File Moniker , CoGetInstanceFromFile

 HRESULT GetCornelius(IApe * &rpApe)  {     OLECHAR *pwszObject =          OLESTR("\\\\server\\public\\cornelius.chmp");     MULTI_QI mqi = { &IID_IApe, 0, 0 };     HRESULT hr = CoGetInstanceFromFile(0, 0, 0, CLSCTX_SERVER,                     STCM_READWRITE, pwszObject, 1, &mqi);     if (SUCCEEDED(hr)) rpApe = mqi.pItf;     else        rpApe = 0;     return hr; } 

, CoGetObject:

 HRESULT GetCornelius(IApe * &rpApe) {     OLECHAR *pwszObject = OLESTR("\\\\server\\public\\cornelius.chmp");     return CoGetObject(pwszObject, 0, IID_IApe, (void**)&rpApe); } 

, Class Moniker, , CoGetObject, , .


1 API- . CoGetInstanceFromIStorage, (storage medium).

2 CLSID - , CoGetClassObject/CoCreateInstanceEx, CoGetInstanceFromFile UNC- (universal naming convention ), - , . ("At its" activation) "ActivateAtStorage", 6.

3 ROT , Winstation. , (logon sessions) . , , IRunningObjectTable::Register ROTFLAGS_ALLOWANYCLIENT.



Suschnost' tehnologii SOM
Essential COM
ISBN: 0201634465
EAN: 2147483647
Year: N/A
Pages: 103
Authors: Don Box

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net