HOWTO: Passing a License Key to ADO in Visual C++ Using MFC-OLELast reviewed: October 8, 1997Article ID: Q174802 |
The information in this article applies to:
SUMMARYThe MFC ClassWizard provides a powerful mechanism for manipulation OLE Automation servers by building MFC-based classes off a given typelib. The classes built wrap each object in the typelib by generating classes derived from COleDispatchDriver. However, COleDispatchDriver has no means for passing a license key. This article explains how to override the COleDispatchDriver::CreateDispatch methods to provide a license key.
MORE INFORMATIONBelow is sample code for overriding the two versions of CreateDispatch(). In this case, it is from sample code for passing a license key via MFC-OLE to the ActiveX Data Objects (ADO) Connection object; however, this is incidental to the code. Unless noted, this code is identical to the Visual C++ 5.0 version of COleDIspatchDriver::CreateDispatch(). Some macros available internally to MFC had to be replaced. Original code has been left below, but commented out to demonstrate the modifications:
BOOL _Connection::CreateDispatch(REFCLSID clsid, COleException* pError, BSTR bstrLicKey) { ASSERT(m_lpDispatch == NULL); m_bAutoRelease = TRUE; // auto-release is a good default // create an instance of the object LPUNKNOWN lpUnknown = NULL; IClassFactory2 *pIUnknown = NULL; IUnknown *pOuter = NULL; // SCODE sc = CoCreateInstance(clsid, NULL, // CLSCTX_ALL | CLSCTX_REMOTE_SERVER, // IID_IUnknown, (LPLP)&lpUnknown); SCODE sc = CoGetClassObject( clsid, CLSCTX_ALL | CLSCTX_REMOTE_SERVER, NULL, IID_IClassFactory2, (void**) &pIUnknown ); if (sc == E_INVALIDARG) { // may not support CLSCTX_REMOTE_SERVER, so try without SCODE sc = CoGetClassObject( clsid, CLSCTX_ALL & ~CLSCTX_REMOTE_SERVER, NULL, IID_IClassFactory2, (void**) &pIUnknown ); // sc = CoCreateInstance(clsid, NULL, // CLSCTX_ALL & ~CLSCTX_REMOTE_SERVER, // IID_IUnknown, (LPLP)&lpUnknown); } if( !FAILED( sc ) ) { sc = pIUnknown->CreateInstanceLic( pOuter, NULL, IID_IUnknown, bstrLicKey, (void**)&lpUnknown ); } if (FAILED(sc)) goto Failed; // make sure it is running sc = OleRun(lpUnknown); if (FAILED(sc)) goto Failed; // query for IDispatch interface // m_lpDispatch = QUERYINTERFACE(lpUnknown, IDispatch); if (lpUnknown->QueryInterface(IID_IDispatch, (void**)&m_lpDispatch) != S_OK) if (m_lpDispatch == NULL) goto Failed; lpUnknown->Release(); ASSERT(m_lpDispatch != NULL); return TRUE; Failed: // RELEASE(lpUnknown); if( lpUnknown != NULL ) { lpUnknown->Release(); lpUnknown = NULL; } if (pError != NULL) pError->m_sc = sc; TRACE1("Warning: CreateDispatch returning scode = %s.\n", AfxGetFullScodeString(sc)); return FALSE; } BOOL _Connection::CreateDispatch(LPCTSTR lpszProgID, COleException* pError, BSTR bstrLicKey) { ASSERT(m_lpDispatch == NULL); // map prog id to CLSID CLSID clsid; SCODE sc = AfxGetClassIDFromString(lpszProgID, &clsid); if (FAILED(sc)) { if (pError != NULL) pError->m_sc = sc; return FALSE; } // create with CLSID return CreateDispatch(clsid, pError, bstrLicKey); } REFERENCESFor additional information, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q168122 TITLE : HOWTO: Redistributing ADO 1.0 or ADO/R 1.0 with OLE/DB 1.1 |
Additional query words: mfckb
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |