BCB6 DLL中操作Excel的问题

csinfo_hou 2009-08-29 11:17:12
直接在工程中能够实现对Excel的操作(Variant方式),但在 DLL 文件中,
却老是不能成功。即便是如下的简单代码也不能build啊!
现象:勾选"Build with runtime pakages",则正确,清除该选项则报告如下错误信息:
[Linker Fatal Error] Fatal: Unable to open file 'EXCEL_2K_SRVR.OBJ'

代码:
//---------------------------------------------------------------------------
#include <vcl.h>
#include "Excel_2K_SRVR.h"

//#include <windows.h>
#pragma hdrstop

// ...... 自定义 export函数 ......

#pragma link "Excel_2K_SRVR"

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
环境:xp + bcb6 + office2003

???为什么呢 ????
...全文
123 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
csinfo_hou 2009-08-30
  • 打赏
  • 举报
回复
我作了测试,目前看来,好像不是因为为包含"ComObj.hpp"的问题。
csinfo_hou 2009-08-30
  • 打赏
  • 举报
回复
感谢各位!问题解决,结贴了。接分哈!
sczyq 2009-08-29
  • 打赏
  • 举报
回复
OLE 操作,可能要增加

#include <Comobj.hpp>
csinfo_hou 2009-08-29
  • 打赏
  • 举报
回复
现在只用OLE代码,在DLL文件中实现操作XLS文件。
在成功打开.XLS文件后,想根据其活动工作表新建一个.DBF表。链接时报错:
[Linker Fatal Error] Fatal: Unable to open file 'EXTCTRLS.OBJ'

目前的完整代码如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#include <DB.hpp>
#include <DBCtrls.hpp>
#include <DBTables.hpp> // TTable
#include <OleServer.hpp> // OLE

extern "C" __declspec(dllexport) void __stdcall XLStoDBF( const char *cpXLS, const char *cpDBF );
bool __fastcall openXLSFile( const String sXLSFile );
bool __fastcall creatNewTmpDBF( const String sOutDBF );

//------- OLE函数 宏定义 -------------------------
#define PG OlePropertyGet // 取属性
#define PS OlePropertySet // 设置属性
#define FN OleFunction // 函数调用
#define PC OleProcedure // 过程调用
//------- OLE 常用变量定义 -----------------------
Variant ExcelApp; // Excel Application 对象
Variant WorkB, WorkS; // 工作簿, 工作表
//------- 全局变量定义 ---------------------------
String sXLS, sDBF; // 全路径:原.XLS文件,临时DBF表
int iColCnt, iRowCnt, iColWidth; // .XLS文件 列数.行数.列宽

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------

bool __fastcall openXLSFile( const String sXLSFile )
{// 打开指定的.XLS文件
try
{ ExcelApp = CreateOleObject( "Excel.Application" ); }
catch(...)
{ MessageBox( NULL, "MS Office 的 Excel组件可能未安装 ! ",
"错误", MB_OK|MB_TOPMOST|MB_ICONERROR|MB_APPLMODAL);
return false;
}
ExcelApp.PG("WorkBooks").PC( "Open", sXLSFile.c_str() );
WorkB = ExcelApp.PG( "ActiveWorkBook" ); // 工作薄
WorkS = WorkB.PG( "ActiveSheet" ); // 活动工作表
ExcelApp.PS( "Visible", false ); // 隐藏 excel窗口

iColCnt = WorkS.PG("UsedRange").PG("Columns").PG("Count"); // 列数
iRowCnt = WorkS.PG("UsedRange").PG("Rows").PG("Count"); // 行数

return true;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
bool __fastcall creatNewTmpDBF( const String sTmpDBF )
{//根据先前打开的.XLS文件活动表,创建空.DBF表
if ( FileExists(sTmpDBF) )
if ( ! DeleteFile( sTmpDBF ) )
{ MessageBox( NULL, "删除原有临时数据表时出错!", "删除临时数据表",
MB_OK|MB_TOPMOST|MB_ICONERROR|MB_APPLMODAL );
return false;
}

TTable * tableTmp = new TTable(NULL);
TFieldDef * pNewDef; // 表 字段定义
tableTmp->Active = false;
tableTmp->TableName = sTmpDBF; // 表 名称
tableTmp->TableType = ttDefault; // 表 类型
tableTmp->FieldDefs->Clear(); // 清除 字段定义
try {
for( int i=1; i<=iColCnt; i++ )
{
pNewDef = tableTmp->FieldDefs->AddFieldDef(); // 添加一个 字段定义表
pNewDef->Name = WorkS.PG("Cells",1,i).PG("Value"); // 字段名:XLS工作表首行
pNewDef->DataType = ftString; // 字段类型:String
iColWidth = ExcelApp.PG("Columns",i).PG("ColumnWidth"); // 当前i列宽度
pNewDef->Size = iColWidth; // 字段大小
pNewDef->Required = false; // 不强制要求值
}
tableTmp->CreateTable(); // 根据.XLS表 生成空.DBF表
delete tableTmp;
}
catch(...)
{ ...(略) ... }

return true;
}
//---------------------------------------------------------------------------

void __stdcall XLStoDBF( const char *cpXLS, const char *cpDBF )
{//DLL文件 输出函数
sXLS = String( cpXLS );
sDBF = String( cpDBF );

if ( openXLSFile( sXLS ) ) // 打开指定 .XLS表
creatNewTmpDBF( sDBF ); // 创建 新的 .DBF表
}
//---------------------------------------------------------------------------
Behard 2009-08-29
  • 打赏
  • 举报
回复
哦 你使用了哪些类进行操作?
简单的代码呢
csinfo_hou 2009-08-29
  • 打赏
  • 举报
回复
首先谢谢Behard的回复!

问题依旧存在:
参考你的代码,去掉 #pragma link "Excel_2K_SRVR",则报了30来个诸如以下的错误:
Build
[Linker Error] Unresolved external 'Oleserver::TOleServer::' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Excel_2k::TExcelOLEObject::BeforeDestruction()' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Oleserver::TOleServer::~TOleServer()' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Oleserver::TOleServer::Loaded()' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__stdcall Oleserver::TOleServer::QueryInterface(const _GUID&, void *)' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Oleserver::TOleServer::TOleServer(Classes::TComponent *)' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Excel_2k::TExcelOLEObject::InitServerData()' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Oleserver::TOleServer::GetServer()' referenced from F:\MYBCB\DLL\DLLXLS\UNIT1.OBJ

在#include <Excel_2K_SRVR.h>之后,加上 #pragma link "Excel_2K_SRVR"则只报告:
[Linker Fatal Error] Fatal: Unable to open file 'EXCEL_2K_SRVR.OBJ'

郁闷!

Behard 2009-08-29
  • 打赏
  • 举报
回复
取消 #pragma link "Excel_2K_SRVR"


#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#include <Excel_2K_SRVR.h>

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH: //初始化 COM
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH: //释放 COM
CoUninitialize();
break;

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
Grid++Report是一款C/S与B/S集成报表工具,功能全面易学易用。C/S开发适用于VB.NET, C#, VB, VC, Delphi, BCB, 易语言等。B/S开发适用于ASP.NET, ASP, PHP, JSP(Java)等,支持所有操作系统服务器与WEB服务器。开发C/S报表与B/S报表共享相同的开发知识与设计资源。提供独有的报表查询显示功能,让报表查询显示、打印、打印预览及数据导出等功能集成一体化实现。轻松实现表格报表、动态报表、多层表头、票据套打、交叉表、统计图表、表表及各种特殊报表等,是式报表的最佳开发工具。提供详尽帮助文档与各种编程平台下的丰富例子,安装包括可直接运行例子程序,安装后即刻体验此报表工具。Unicode编码,多国语言集成支持。历经数年发展,多家有影响力的通用软件厂商选用,用户遍布各行各业,已经成为用户受众面最广的国产报表工具。 Grid++Report 报表组件具有如下特点: 1、支持C/S报表与B/S报表开发,支持全部主流开发语言。C/S开发:VB.NET、C#、VB、VC、Delphi等,B/S开发:ASP.NET、ASP、PHP、JSP等,支持所有WEB服务器。 2、多国语言集成支持与UNICOD E编码支持,方便开发多国语言软件。 3、功能强大,稳定高效:实现表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,适合开发通用软件的动态报表。 4、独有的报表查询显示功能:提供报表查询与输出的集成一次性实现,保证数据不同展现方式的一致性与完整性。 5、报表数据来源丰富:支持绑定(报表数据拉模式)与非绑定(报表数据推模式),一切数据库数据与其它数据都可以作为报表数据源。 6、提供图表功能,包括:饼图、叠加饼图、柱状图、气泡图、折线图、曲线图、散列点图等,支持三维图形。 7、报表数据导出格式丰富,格式包括:Excel、RTF、PDF、图像、HTML、文本,CSV 等。 8、支持数十种一维条码,支持PDF417与QRCode这两种最常用的二维条码,条码打印精度高且易读取。 9、提供脚本编程功能,直接在报表模板自定义报表行为,采用通用的JScript与VBScript脚本引擎。 10、特有的分组单元格合并功能,轻松实现常见的国式报表分组在列展现并垂直居要求。 11、全文界面,针对国式报表进行了很多专门实现,如:表格报表、财务金额线、大写金额、发票圈叉图标、负数红字、多层表头等。很多在国外报表工具很难实现的功能都可以轻易实现。 12、提供丰富交互事件,轻松实现报表行为自定义、穿透(透视)查询和报表交互。 13、重新发布简单:C/S报表只需分发两个DLL文件;B/S报表只要在WEB服务器布署报表网页与报表插件安装包,服务端不需其它配置,客户端零配置。 14、易学易用:完全可视化设计,完善的复制/剪切/粘贴(Copy/Cut/Paste)和恢复重做(Undo/Redo)功能,专业的拖放操作与即时编辑功能。 15、编写了完整详尽的帮助文档。提供了丰富例程,C/S报表包括VB.NET、C#、VB、VC、Delphi、C++Builder、VFP、文编程易语言,B/S报表包括ASP.NET,ASP,PHP,JSP。 Grid++Report 网站:http://www.rubylong.cn Grid++Report 演示:http://www.rubylong.cn/WebReport

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧