• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > ATL编制的DLL在excel中应用所碰到的问题

ATL编制的DLL在excel中应用所碰到的问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了atl71.dll修复,atl71.dll,atl80.dll官方下载,atl100.dll下载,穿越火线atl71.dll等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: ATL编制的DLL在excel中应用所碰到的问题
描述:

江湖救急:~~~~~
项目背景介绍:
1. 应用环境:金融行业的金融衍生工具定价。
2. 软件平台:vc.net,excel
3. 项目简介:输入数据源为 excel中的若干列数据,通过一系列运算后,输出最后得到一个的价格到 excel. 
由于运算的数据量很大,并相对速度要求比较高,所以老板要求中间运算使用c/c++编写。
所以我的解决方案是 用c++ 编写 dll, 然后在 vba中引用。。
4. 目前进展: 中间程序已经在VC++中编写成功,不过使用的是MFC界面编制的,通过触发控件事件调用了中间的运算过程。(编制的流程以及对EXCEL的控制参考自 徐景周的 “直接通过ODBC读写Excel表格文件”译文)
接着我在运用ATL封装中间程序后生成DLL也运行成功,但是在VBA中引用时,却出现了毁灭性错误,EXCEL总是自动关掉。
在DUBUG时推断,是数据集打开有问题。执行到这句话EXCEL就自动关掉,recset.Open(CRecordset::forwardOnly,sSql);
5.我的推断:是不是因为excel所调用的dll通过odbc又访问了本excel来获得数据源,所以出错??? 我只能想到这个原因,如果是这个原因,我还能通过别的什么办法在编制dll的时候来获得excel中的数据源呢?
请各路大虾指点迷经?
ps:本人学金融的,编程水平比较菜,一般纯C,C++还可以。。但是没有系统的研究过VC++,所以还请见谅!。。。。
主要代码:
DLL中的ATL_Tree事件函数:
STDMETHODIMP CATL_BDT::ATL_Tree(void)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // TODO: 在此添加实现代码
    CDatabase database;
    CString sSql,sDriver,sDsn,sFile,sPath;
                                    
    //获取主程序所在路径,存在sPath中。 实际上DLL就嵌在 DEMO中应用。
    GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
    sPath.ReleaseBuffer ();
    int nPos;
    nPos=sPath.ReverseFind ('\\');
    sPath=sPath.Left (nPos);
    sFile = sPath + "\\Demo.xls";             // 将被读取的Excel文件名
    sDriver="MICROSOFT EXCEL DRIVER (*.XLS)";
        if (sDriver.IsEmpty())
        {
           // 没有发现Excel驱动
          AfxMessageBox("没有安装Excel驱动!");
          return 0;
        }
    
      // 创建进行存取的字符串
    sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
        // 打开数据库(既Excel文件)
          database.Open(NULL, false, false, sDsn);
      
    CRecordset recset(&database);
      // 设置读取的查询语句.
        sSql = "SELECT * FROM Exceldemo " 
        "WHERE Id is not null";
                "ORDER BY Id ";
   
  //      // 执行查询语句------出错语句,,就在EXCEL执行到DLL下面的这句话时,自动关闭了。。不知道是啥原因。。。
       recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
            
    
    // 获取查询总纪录数
      
          while (!recset.IsEOF())
        {
        sItemCount = recset.GetRecordCount();
             recset.MoveNext();
            t++;       
         }     
    
        database.Close();  
    。。。。。。
。。。。。。。
。。。。。。
省略
    return S_OK;
}
在VBA中的引用时的语句:
    Dim objTestATL As test123Lib.ATL_BDT
    Set objTestATL = New ATL_BDT
    objTestATL.ATL_Tree
    
    Set objTestATL = Nothing


解决方案1:

可能的原因:
1 你的EXCEL表中的数据类型(列)不一致(虽然看起来象一样的,但类型不一样);
2 你的EXCEL表中的数据不对齐;
看看你的EXCEL表中的数据对不对
把你的代码和Excel发给我的邮箱看看:IUnknown886@yahoo.com.cn
不过,为什么要用odbc打开EXCEL呢?
如果使用ATL,就直接写个COM访问EXCEL中的对象实例就行了,比如WorkBook WorkSheet,
   做一个COM,在stdafx.h中加下面代码:
#import "d:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" rename_namespace("Office")
using namespace Office;
#import "d:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6")
using namespace VBE6;
#import "d:\\Program Files\\Microsoft Office\\OFFICE11\\excel.exe" rename("RGB","RBGEx"),rename("DialogBox","DialogBoxEx"),named_guids,rename_namespace("Excel")
using namespace Excel;
  在接口中定义函数:
GetExcelApp(LPDISPATCH lpApp)
{
Excel::_ApplicationPtr ptrXlApp;
Excel::WorkbooksPtr ptrWbs;
Excel::_WorkbookPtr ptrWb;
Excel::_WorksheetPtr ptrWs;
Excel::RangePtr ptrRange;
ptrXlApp=lpApp;
ptrWbs=ptrXlApp->GetWorkbooks();
         ......  //由Application得到WorkBook,再由WorkBook得到WorkSheet,再得到Range等,和VBA中差不多的.这种直接访问应该比ODBC的间接访问速度更快.
}
个人观点,仅供参考:)


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 疑惑:如何使用通过atl工程编写的类接口
  • ATL怎么实现可变参数的接口?
  • 谁能帮我看一下关于ATL编写COM组件
  • 采用ATL写的COM组件,Debug没问题,Release就出问题了。
  • 散分~~顺便大家来聊聊ATL以及COM的未来
  • ATL控件2问
  • ATL能不能继承VB编写的COM组件再封装成COM组件?
  • 请高人指教ATL做的DLL如何屏蔽弹出广告,浮动广告
  • 一个ATL做的IE工具条。测试时出现问题。望各位大哥大姐指教。。
  • 一个类似的问题~~~~~ATL与数据库~~高人指教感激不敬!

相关文章

  • 2017-06-04 atl和wtl的头文件要安装什么才有啊,我怎么装了vsnet和platformsdk怎么都没有啊?
  • 2017-06-04 afxwnd42是什么窗口类?
  • 2017-06-05 ActiveX控件中长时间处理数据时,IE无响应
  • 2017-06-05 一个UI和Worker线程通讯问题
  • 2017-06-05 不能调用DLL中带参数的函数问题
  • 2017-06-04 为什么不能得到lnk的路径,只能得到快捷方式指向的文件路径。其他文件都能得到路径。
  • 2017-06-04 为什么我总是入不了门?
  • 2017-06-04 在线等,急问ATL
  • 2017-06-05 VC导出Excel数据,excel后台程序无法退出
  • 2017-06-05 请教高手?在MDI主窗口中通过dll建立其子窗口,要求和在主程序中new出来的效果相同

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ###我想设计一个支持多线程的工具dll,不知道和只支持单线程的dll有什么区别?###
    • m_spInPlaceSite的区别m_spClientSite
    • chtmlview导航后提示未登录
    • 蔡鸟问题,如何写dll
    • 高分求教!希望高手能够指点!
    • 关于使用RICHEDCTRL以及界面线程在98下所碰到的问题
    • ATL对话框继承cdialogimpl
    • 请问如何创建一个DLL无进程的线程
    • 如何实现将几个视频流写入一个文件
    • 求各位大虾帮帮忙!50分求助!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有