在用MFC读写Excel的时候,需要用到ODBC的方式。这个时候,如果不想手动输入Excel的驱动名称,就需要自动获取。
下面是两种情况的下的获取方式。
方式一:多字符集
CString MyDlg::GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver;
// 获取已安装驱动的名称(涵数在odbcinst.h里)
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return "";
// 检索已安装的驱动是否有Excel...
do
{
if (strstr(pszBuf, "Excel") != 0)
{
//发现 !
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, '\0') + 1;
}
while (pszBuf[1] != '\0');
return sDriver;
}
方式二:Unicode
CString MyCDlg::GetExcelDriver()
{
wchar_t szBuf[2056]; // 不知为啥是2056,很奇怪
memset(szBuf, 0, sizeof(szBuf));
WORD cbBufMax = 2000;
WORD cbBufOut;
wchar_t *pszBuf = szBuf;
CString sDriver = L"";
string s;
char *ret;
// 获取已安装的驱动的名称(函数在odbcinst.h里)
// 经过此判断,所有的驱动均存储在szBuf中。
// 需要从szBuf中,将EXCEL的驱动,提取出来
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
{
MessageBox(L"Error: 没有获取到Excel驱动!");
return L"";
}
do
{
if (wcsstr(pszBuf, _T("Excel")) != 0)// 或有多个包含Excel,所有需要获取第一个,然后break
{
sDriver = pszBuf;
break;// 有的人计算机可能不是第一个
}
pszBuf = wcschr(pszBuf, '\0') + 1;
} while (pszBuf[1]!='\0');
return sDriver;
}