⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 igetasadorecordsetimpl.h

📁 The ATL OLE DB Provider templates only seem to support read-only rowsets and making them support upd
💻 H
字号:
#ifndef __IGETASADORECORDSETIMPL__INCLUDED__
#define __IGETASADORECORDSETIMPL__INCLUDED__

#include "IGetAsADORecordset.h"

#import "D:\Program Files\Common Files\System\ado\msado15.dll" rename( "EOF", "adoEOF" ) 

///////////////////////////////////////////////////////////////////////////////
// Helper function that does the work and doesnt need to be templatised.
///////////////////////////////////////////////////////////////////////////////

STDMETHODIMP IGetAsADORecordsetImpl_GetAsRecordSetHelper(
   LPCTSTR lpszProvider,
   IUnknown *pUnknown, 
   CursorLocationEnum cusorLocation,
   LockTypeEnum lockType,
   CursorTypeEnum cursorType,
   IUnknown *pRecordset);

HRESULT IGetAsADORecordsetImpl_GetRecordset(
   IUnknown *pUnkOuter,
   REFIID riid,
   IUnknown **ppRecordset,
   IUnknown **ppUnknown);


///////////////////////////////////////////////////////////////////////////////

DEFINE_GUID(IID_IDataSource,0x7c0ffab3L, 0xcd84, 0x11d0, 0x94, 0x9a, 0x00, 0xa0, 0xc9, 0x11, 0x10, 0xed);

///////////////////////////////////////////////////////////////////////////////
// IGetAsADORecordsetImpl
///////////////////////////////////////////////////////////////////////////////

template <
   class T, 
   const GUID* plibid = &CComModule::m_libid, 
   WORD wMajor = 1,
   WORD wMinor = 0, 
   class tihclass = CComTypeInfoHolder>
class ATL_NO_VTABLE IGetAsADORecordsetImpl 
   :  public IDispatchImpl<
         IGetAsADORecordset, 
         &IID_IGetAsADORecordset, 
         plibid, 
         wMajor, 
         wMinor, 
         tihclass>
{
   public:

   typedef IGetAsADORecordsetImpl<T, plibid, wMajor, wMinor, tihclass> ThisClass;


BEGIN_COM_MAP(ThisClass)
	COM_INTERFACE_ENTRY(IGetAsADORecordset)
   COM_INTERFACE_ENTRY_FUNC(__uuidof(ADODB::_Recordset), 0, ThisClass::InternalADOTearOffQIFunc) 
   COM_INTERFACE_ENTRY_FUNC(__uuidof(ADODB::Recordset15), 0, ThisClass::InternalADOTearOffQIFunc) 
   COM_INTERFACE_ENTRY_FUNC(__uuidof(ADODB::Recordset20), 0, ThisClass::InternalADOTearOffQIFunc) 
   COM_INTERFACE_ENTRY_FUNC(IID_IDataSource, 0, ThisClass::InternalADOTearOffQIFunc)
   COM_INTERFACE_ENTRY_FUNC_BLIND(1, ThisClass::InternalADOTearOffQIFunc)
END_COM_MAP()


      STDMETHOD(GetAsRecordset)(
         CursorLocationEnum cursorLocation,        // [in, optional, defaultvalue(adUseClient)]
         LockTypeEnum lockType,                    // [in, optional, defaultvalue(adLockReadOnly)]
         CursorTypeEnum cursorType,                // [in, optional, defaultvalue(adOpenStatic)]
         VARIANT *pvRecordset)                     // [out, retval]
      {
         if (!pvRecordset)
         {
            return E_POINTER;
         }

         IUnknown *pRecordset = 0;

         HRESULT hr = IGetAsADORecordsetImpl_GetRecordset(
            0, 
            __uuidof(ADODB::Recordset15), 
            &pRecordset, 
            0);

         if (SUCCEEDED(hr))
         {

            hr = GetAsRecordset(
               cursorLocation, 
               lockType, 
               cursorType, 
               pRecordset);

            if (SUCCEEDED(hr))
            {
               // Return the recordset in a variant...
               pvRecordset->vt = VT_DISPATCH;
	            pvRecordset->pdispVal = (IDispatch*)pRecordset;
            }
         }

         return hr;
      }

      static HRESULT WINAPI ADOTearOffQIFunc(
         void* pv, 
         REFIID riid, 
         LPVOID* ppv, 
         DWORD dw)
      {
         T *pT = (T*)pv;

         ThisClass *pMe = (ThisClass*)pT;

         return pMe->QIForTearOffRecordset(riid, ppv, dw);
      }

   protected :
   
      IGetAsADORecordsetImpl()
         :  m_pADORecordset(0)
      {

      }

   private :

      static HRESULT WINAPI InternalADOTearOffQIFunc(
         void* pv, 
         REFIID riid, 
         LPVOID* ppv, 
         DWORD dw)
      {
         if (dw == 1)
         {
            return _ATLDUMPIID(riid, _T("IGetAsADORecordsetImpl"), E_NOINTERFACE);
         }

         ThisClass *pMe = (ThisClass*)pv;

         return pMe->QIForTearOffRecordset(riid, ppv, dw);
      }

      HRESULT QIForTearOffRecordset(REFIID riid, LPVOID* ppv, DWORD dw)
      {
         HRESULT hr = S_OK;

         if (!m_pADORecordset)
         {
            IUnknown *pThis = 0;

            hr = QueryInterface(IID_IUnknown, (void**)&pThis);

            if (SUCCEEDED(hr))
            {
               IUnknown *pRecordset = 0;

               hr = IGetAsADORecordsetImpl_GetRecordset(
                  pThis, 
                  riid, 
                  &pRecordset, 
                  &m_pADORecordset);

               if (SUCCEEDED(hr))
               {
                  m_pADORecordset->AddRef();

                  hr = GetAsRecordset(
                     adUseServer,
                     adLockOptimistic,
                     adOpenDynamic,
                     pRecordset);
               }
            }
         }

         if (SUCCEEDED(hr))
         {
            hr = m_pADORecordset->QueryInterface(riid, ppv); 
         }

         return hr;
      }
   
      HRESULT GetAsRecordset(
         CursorLocationEnum cursorLocation,        
         LockTypeEnum lockType,                    
         CursorTypeEnum cursorType,                
         IUnknown *pRecordset)                     
      {
         // Get at our object's IUnknown interface...

         T *pT = (T*)this;
         
         IUnknown *pUnknown = 0;

         HRESULT hr = pT->QueryInterface(IID_IUnknown, (void**)&pUnknown);

         if (SUCCEEDED(hr))
         {
            // Go do the work...

            hr = IGetAsADORecordsetImpl_GetAsRecordSetHelper(
               _T("Provider=SimpleDataObject.ConversionProvider.1"),
               pUnknown,  
               cursorLocation,
               lockType,
               cursorType,
               pRecordset);

            pUnknown->Release();
         }

         return hr;
      }

      
      IUnknown *m_pADORecordset;

};


#endif // __IGETASADORECORDSETIMPL__INCLUDED__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -