myprovidersess.h
来自「Visual_C++.NET实用编程百例」· C头文件 代码 · 共 225 行
H
225 行
// myProviderSess.h : CmyProviderSession 的声明
#pragma once
#include "resource.h" // 主符号
#include "myProviderRS.h"
class CmyProviderSessionTRSchemaRowset;
class CmyProviderSessionColSchemaRowset;
class CmyProviderSessionPTSchemaRowset;
// CmyProviderSession
[
coclass,
noncreatable,
uuid("EAF8E9C8-A8CE-4C1C-BCAA-A97019AC8024"),
threading("apartment"),
registration_script("none")
]
class ATL_NO_VTABLE CmyProviderSession :
public IGetDataSourceImpl<CmyProviderSession>,
public IOpenRowsetImpl<CmyProviderSession>,
public ISessionPropertiesImpl<CmyProviderSession>,
public IObjectWithSiteSessionImpl<CmyProviderSession>,
public IDBSchemaRowsetImpl<CmyProviderSession>,
public IDBCreateCommandImpl<CmyProviderSession, CmyProviderCommand>
{
public:
CmyProviderSession()
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return FInit();
}
void FinalRelease()
{
}
STDMETHOD(OpenRowset)(IUnknown *pUnk, DBID *pTID, DBID *pInID, REFIID riid,
ULONG cSets, DBPROPSET rgSets[], IUnknown **ppRowset)
{
CmyProviderRowset* pRowset;
return CreateRowset(pUnk, pTID, pInID, riid, cSets, rgSets, ppRowset, pRowset);
}
void SetRestrictions(ULONG cRestrictions, GUID* rguidSchema, ULONG* rgRestrictions)
{
for (ULONG l=0; l<cRestrictions; l++)
{
// 我们支持对表名称(但仅限于表名称)的限制
if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_TABLES))
rgRestrictions[l] = 0x04;
else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_COLUMNS))
rgRestrictions[l] = 0x04;
else if (InlineIsEqualGUID(rguidSchema[l], DBSCHEMA_PROVIDER_TYPES))
rgRestrictions[l] = 0x00;
}
}
BEGIN_PROPSET_MAP(CmyProviderSession)
BEGIN_PROPERTY_SET(DBPROPSET_SESSION)
PROPERTY_INFO_ENTRY(SESS_AUTOCOMMITISOLEVELS)
END_PROPERTY_SET(DBPROPSET_SESSION)
END_PROPSET_MAP()
BEGIN_SCHEMA_MAP(CmyProviderSession)
SCHEMA_ENTRY(DBSCHEMA_TABLES, CmyProviderSessionTRSchemaRowset)
SCHEMA_ENTRY(DBSCHEMA_COLUMNS, CmyProviderSessionColSchemaRowset)
SCHEMA_ENTRY(DBSCHEMA_PROVIDER_TYPES, CmyProviderSessionPTSchemaRowset)
END_SCHEMA_MAP()
};
class CmyProviderSessionTRSchemaRowset :
public CSchemaRowsetImpl< CmyProviderSessionTRSchemaRowset, CTABLESRow, CmyProviderSession>
{
public:
BEGIN_PROPSET_MAP(CmyProviderSessionTRSchemaRowset)
BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
PROPERTY_INFO_ENTRY(IAccessor)
PROPERTY_INFO_ENTRY(IColumnsInfo)
PROPERTY_INFO_ENTRY(IConvertType)
PROPERTY_INFO_ENTRY(IRowset)
PROPERTY_INFO_ENTRY(IRowsetIdentity)
PROPERTY_INFO_ENTRY(IRowsetInfo)
PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
PROPERTY_INFO_ENTRY(CANHOLDROWS)
PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()
HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
{
CmyProviderWindowsFile wf;
CTABLESRow trData;
lstrcpyW(trData.m_szType, OLESTR("TABLE"));
lstrcpyW(trData.m_szDesc, OLESTR("目录表"));
HANDLE hFile = INVALID_HANDLE_VALUE;
TCHAR szDir[MAX_PATH + 1];
TCHAR szWildcard[] = _T("\\*.*");
DWORD cchWildcard = sizeof(szWildcard)/sizeof(szWildcard[0]);
DWORD cbCurDir = GetCurrentDirectory(MAX_PATH - cchWildcard, szDir);
if (!cbCurDir || cbCurDir >= (MAX_PATH - cchWildcard))
return E_FAIL;
lstrcat(szDir, szWildcard);
hFile = FindFirstFile(szDir, &wf);
if (hFile == INVALID_HANDLE_VALUE)
return E_FAIL; // 用户没有 c:\ 驱动器
FindClose(hFile);
lstrcpynW(trData.m_szTable, CT2WEX<MAX_PATH + 1>(szDir), SIZEOF_MEMBER(CTABLESRow, m_szTable));
if (!m_rgRowData.Add(trData))
return E_OUTOFMEMORY;
*pcRowsAffected = 1;
return S_OK;
}
DBSTATUS GetDBStatus(CSimpleRow*, ATLCOLUMNINFO* pInfo)
{
if (pInfo->iOrdinal == 1 || pInfo->iOrdinal == 2)
return DBSTATUS_S_ISNULL;
return DBSTATUS_S_OK;
}
};
class CmyProviderSessionColSchemaRowset :
public CSchemaRowsetImpl< CmyProviderSessionColSchemaRowset, CCOLUMNSRow, CmyProviderSession>
{
public:
BEGIN_PROPSET_MAP(CmyProviderSessionColSchemaRowset)
BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
PROPERTY_INFO_ENTRY(IAccessor)
PROPERTY_INFO_ENTRY(IColumnsInfo)
PROPERTY_INFO_ENTRY(IConvertType)
PROPERTY_INFO_ENTRY(IRowset)
PROPERTY_INFO_ENTRY(IRowsetIdentity)
PROPERTY_INFO_ENTRY(IRowsetInfo)
PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
PROPERTY_INFO_ENTRY(CANHOLDROWS)
PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()
HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
{
CmyProviderWindowsFile wf;
HANDLE hFile = INVALID_HANDLE_VALUE;
TCHAR szDir[MAX_PATH + 1];
TCHAR szWildcard[] = _T("\\*.*");
DWORD cchWildcard = sizeof(szWildcard)/sizeof(szWildcard[0]);
DWORD cbCurDir = GetCurrentDirectory(MAX_PATH - cchWildcard, szDir);
if (!cbCurDir || cbCurDir >= (MAX_PATH - cchWildcard))
return E_FAIL;
lstrcat(szDir, szWildcard);
hFile = FindFirstFile(szDir, &wf);
if (hFile == INVALID_HANDLE_VALUE)
return E_FAIL; // 用户没有 c:\ 驱动器
FindClose(hFile);// szDir 已获得表名称
DBID dbid;
memset(&dbid, 0, sizeof(DBID));
CT2WEX<MAX_PATH + 1> wszDir(szDir);
dbid.uName.pwszName = wszDir;
dbid.eKind = DBKIND_NAME;
return InitFromRowset < _RowsetArrayType > (m_rgRowData, &dbid, NULL, m_spUnkSite, pcRowsAffected);
}
DBSTATUS GetDBStatus(CSimpleRow*, ATLCOLUMNINFO* pInfo)
{
switch(pInfo->iOrdinal)
{
case 1:
case 2:
case 19:
case 20:
case 22:
case 23:
case 25:
case 26:
return DBSTATUS_S_ISNULL;
default:
return DBSTATUS_S_OK;
}
}
};
class CmyProviderSessionPTSchemaRowset :
public CSchemaRowsetImpl< CmyProviderSessionPTSchemaRowset, CPROVIDER_TYPERow, CmyProviderSession>
{
public:
BEGIN_PROPSET_MAP(CmyProviderSessionPTSchemaRowset)
BEGIN_PROPERTY_SET(DBPROPSET_ROWSET)
PROPERTY_INFO_ENTRY(IAccessor)
PROPERTY_INFO_ENTRY(IColumnsInfo)
PROPERTY_INFO_ENTRY(IConvertType)
PROPERTY_INFO_ENTRY(IRowset)
PROPERTY_INFO_ENTRY(IRowsetIdentity)
PROPERTY_INFO_ENTRY(IRowsetInfo)
PROPERTY_INFO_ENTRY(CANFETCHBACKWARDS)
PROPERTY_INFO_ENTRY(CANHOLDROWS)
PROPERTY_INFO_ENTRY(CANSCROLLBACKWARDS)
PROPERTY_INFO_ENTRY_VALUE(MAXOPENROWS, 0)
PROPERTY_INFO_ENTRY_VALUE(MAXROWS, 0)
END_PROPERTY_SET(DBPROPSET_ROWSET)
END_PROPSET_MAP()
HRESULT Execute(LONG* pcRowsAffected, ULONG, const VARIANT*)
{
return S_OK;
}
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?