(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.