把CSpreadSheet.h 文件从开源社区下载下来,然后进行头文件和实现文件分离。

添加各种头文件,修改各种属性设置,把字符串前添加 _T(),编译通过。

然后测试:

主函数如下:

int _tmain(int argc, _TCHAR* argv[])
{CSpreadSheet SS("d:\\name1.xls", "Sheet1", false);        // 此处跟进去system("pause");return 0;
}

然后转到CSpreadSheet.cpp 文件的初始化函数:

GetExcelDriver();                // 运行到此处,进入GetExcelDriver(),寻找驱动

CSpreadSheet::CSpreadSheet(CString File, CString SheetOrSeparator, bool Backup) :
m_Database(NULL), m_rSheet(NULL), m_sFile(File),
m_dTotalRows(0), m_dTotalColumns(0), m_dCurrentRow(1),
m_bAppend(false), m_bBackup(Backup), m_bTransaction(false)
{// Detect whether file is an Excel spreadsheet or a text delimited filem_stempString = m_sFile.Right(4);      // 从右边数4个字符m_stempString.MakeLower();               // 转换为小写if (m_stempString == ".xls") // File is an Excel spreadsheet{m_bExcel = true;m_sSheetName = SheetOrSeparator;m_sSeparator = ",;.?";}else // File is a text delimited file{m_bExcel = false;m_sSeparator = SheetOrSeparator;}if (m_bExcel) // If file is an Excel spreadsheet{m_Database = new CDatabase;GetExcelDriver();                // 运行到此处,进入GetExcelDriver(),寻找驱动m_sDsn.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), m_sExcelDriver, m_sFile, m_sFile);if (Open()){if (m_bBackup){if ((m_bBackup) && (m_bAppend)){CString tempSheetName = m_sSheetName;m_sSheetName = "CSpreadSheetBackup";m_bAppend = false;if (!Commit()){m_bBackup = false;}m_bAppend = true;m_sSheetName = tempSheetName;m_dCurrentRow = 1;}}}}else // if file is a text delimited file{if (Open()){if ((m_bBackup) && (m_bAppend)){m_stempString = m_sFile;m_stempSql.Format(_T("%s.bak"), m_sFile);m_sFile = m_stempSql;if (!Commit()){m_bBackup = false;}m_sFile = m_stempString;}}}
}

GetExcelDriver();     // 运行到此处,进入GetExcelDriver(),寻找驱动。

函数如下:其中char 改为 wchar_t , strstr 改为 _tcsstr, strchr 改为 wcschr

void CSpreadSheet::GetExcelDriver()
{//char szBuf[2001];//char *pszBuf = szBuf;        // 修改如下,把char 改为 wchar_twchar_t szBuf[2001];wchar_t *pszBuf = szBuf;wchar_t excl[] = L"Excel";WORD cbBufMax = 2000;WORD cbBufOut;// Get the names of the installed drivers ("odbcinst.h" has to be included )if(!SQLGetInstalledDrivers(szBuf,cbBufMax,&cbBufOut)){m_sExcelDriver = "";return;         // 添加}// Search for the driver...do{//if(strstr(pszBuf, "Excel") != 0)        // strstr改为 _tcsstrif(_tcsstr(pszBuf, excl) != 0){// Found !m_sExcelDriver = CString(pszBuf);break;}//pszBuf = strchr(pszBuf, '\0') + 1;pszBuf = wcschr(pszBuf, '\0') + 1;           // strchr 改为wcschr}while(pszBuf[1] != '\0');return;
}

当运行到 if(!SQLGetInstalledDrivers(szBuf,cbBufMax,&cbBufOut)) 语句时, 跳转到strsafe.h文件中

STRSAFEAPI
StringCchPrintfA(__out_ecount(cchDest) STRSAFE_LPSTR pszDest,__in size_t cchDest,__in __format_string STRSAFE_LPCSTR pszFormat,...)
{HRESULT hr;hr = StringValidateDestA(pszDest, cchDest, STRSAFE_MAX_CCH);if (SUCCEEDED(hr)){va_list argList;va_start(argList, pszFormat);hr = StringVPrintfWorkerA(pszDest,cchDest,NULL,pszFormat,argList);            // 卡到此处va_end(argList);}return hr;
}

卡住以后,显示中断,readExcel.exe 中的 0x02e4b1e9 处有未经处理的异常: 0xC0000005: Access violation

显然是内存泄漏造成的。

但是,还没找到原因。

参考链接:

https://blog.csdn.net/android_lover2014/article/details/52755936

https://blog.csdn.net/u013472838/article/details/51338263

CSpreadSheet.h 中 SQLGetInstalledDrivers(szBuf,cbBufMax,cbBufOut) 函数调用崩溃问题相关推荐

  1. time.h中的相关计时函数time,localtime,clock等详解

    C++对时间的操作也有许多值得大家注意的地方.最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作.获取和显示等等的问题.下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法 ...

  2. c语言resource files的作用,c – resource.h中的宏用于什么?

    在visual studio中创建资源文件时,IDE会自动生成一个名为resource.h的头文件,其中包含以下文本: //{{NO_DEPENDENCIES}} // Microsoft Visua ...

  3. C语言 string.h 中函数的实现

            最近是校招很热的季节,实验室里讨论最多的也就是算法,面试和笔试的必备知识储备.昨天想起 C 语言中 string.h 中的函数在操作字符串时很方便,所以,就想起写写那些函数.     ...

  4. C语言试题二十五之编写一个函数float function(double h),函数的功能使对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h中的值位正数)。

    1. 题目 编写一个函数float function(double h),函数的功能使对变量h中的值保留2位小数,并对第三位进行四舍五入(规定h中的值位正数). 2 .温馨提示 C语言试题汇总里可用于 ...

  5. 微信小程序引用php函数,微信小程序Page中data数据操作和函数调用详细介绍

    这篇文章主要介绍了微信小程序 详解Page中data数据操作和函数调用的相关资料,需要的朋友可以参考下 微信小程序 详解Page中data数据操作和函数调用 Page() 函数用来注册一个页面.接受一 ...

  6. HTS快速交易接口——itpdk_typedef.h中关于ifdef _Windows系统无法识别的问题

    天哪,最近在捣鼓HTS快速交易接口.如果有同样捣鼓却遇到问题的朋友可以借鉴.博主是windows系统 先上解决方案:将原版接口中的"#ifdef _Windows"替换成" ...

  7. UG二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

    文章出自https://blog.csdn.net/qq_41843732/article/details/91422764 在UG二次开发中,若使用MFC库,一旦加上#include<Afx. ...

  8. NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

    NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突 在UG二次开发中,若使用MFC库,一旦加上#include<Afx.h>头文件,或者使用<wi ...

  9. c++头文件iomanip.h中setw()、setprecision()、setbase用法示例详解

    c++头文件iomanip.h中setw().setprecision().setbase #include <iostream>    //不要用iostream.h ,会出现好多问题 ...

最新文章

  1. python培训班 费用-参加线上python培训班要多少钱?
  2. 论如何优雅的处理回文串 - 回文自动机详解
  3. 转载:力扣:整数翻转(难点:整数溢出)
  4. 智能驾驶板块_智能驾驶股票有哪些?智能驾驶股票一览
  5. Spring Boot 模板引擎FreeMarker集成
  6. 交个朋友回应罗永浩撰文事故:系没有处理好内部流程导致的误解
  7. 小白用python处理excel文件-Python3操作Excel文件(读写)的简单实例
  8. 大数据分析应用于政府的12个案例
  9. 什么软件可以编辑PDF文件
  10. 石开kk高中计算机考试,石开KK电脑考试软件
  11. Java题 细胞分裂
  12. CAD不支持实时调试
  13. HCNP——DR和BDR的概念
  14. no-repeat失效
  15. 微机原理与接口技术重要的知识点
  16. 360安全服务器组件怎样禁止,如何禁用360安全浏览器服务组件?如何正确的操作...
  17. 2017.7.10 noi2008 假面舞会
  18. switch完成输出星期一到七
  19. 适合中介的二手房房源管理系统
  20. android elevation 白色,关于android:elevation的疑问

热门文章

  1. 2022.1.28 力扣-每日一题-游戏中弱角色的数量
  2. 网络通信基础知识(一)
  3. 安全的应用程序开发和应用程序安全防御
  4. c++ 迭代公式:使用用迭代公式X(n+1)=(Xn+a/Xn) /2 (n=0,2···;x0=a/2)编程求某一正数a的平方根
  5. 网卡清空缓存命令_怎么清除dns缓存 查看与刷新本地DNS缓存方法 (全文)
  6. 番外篇——直流电机桥源码分析LED驱动例程开发
  7. 程序猿生存指南-16 农村青年
  8. unity LeapMotion 手势旋转,位移,缩放
  9. EAS F7控件弹出表格隐藏某列
  10. 21页报告揭秘华为鸿蒙OS,七年沉淀、称霸5G+IoT时代的野心 | 附下载