超级郁闷问题!都进来看看,不管你现在用不用得到,一定有帮助。。。请求版主帮忙置顶!!!

Comer 2006-01-05 09:49:23
由于要在PB下调用,所以封装了一个DLL,用于读EXCEL内容,读单个EXCEL文件(不管有多少SHEET页)都没问题,如果连续读多个excel文件,不管是PB调用还是在delphi下,某些(注意:不是全部,并且出乱码的单元格,每次都乱码)单元格会出现乱码(只有最后一个字是乱码)。

类似的方法,如果不用DLL,直接在delphi的应用程序里读excel文件的话,则不会出现乱码。
也是类似的方法,封装个COM+组件,在delphi,c#下调用都没问题,不会出现乱码。

郁闷至极,快一个月了,也没有解决,在网上找了些做DLL方面的资料,都只是强调string类型要用pchar之类的文章。

用到的第三方控件下载地址:http://www.axolot.com

我的DLL的代码:
library readExcel;

uses
XLSReadWriteII2,
ActiveX, Forms,
System,
SysUtils,
Classes,
Windows;

var
XlsRW: TXLSReadWriteII2;

{$R *.res}

//创建 XLSReadWriteII 对象
function XLSCreate: Integer; stdcall;
begin
try
Coinitialize(nil);

XlsRW := TXLSReadWriteII2.Create(Application);
Result := 1;
except
//创建对象失败
Result := -1;
Exit;
end;
end;

exports
XLSCreate;

//退出,释放变量
procedure XLSClose; stdcall;
begin
XlsRW.Free;
CoUnInitialize();
end;

exports
XLSClose;

//打开 Excel 文件
//openMode:1:新建文件(如果文件存在则覆盖原文件),0:打开现有文件
function XLSOpen(openMode: Integer; const SrcFile: PChar): Integer; stdcall;
begin
if UpperCase(ExtractFileExt(StrPas(SrcFile))) <> '.XLS' then
begin
//不是excel格式文件,不处理
Result := -100;
Exit;
end;

try
XlsRW.Filename := StrPas(SrcFile);

if ( openMode = 0 ) then
XlsRW.Read;
Result := 1;
except
//文件不存在
Result := 0;
end;
end;

exports
XLSOpen;

//保存
procedure XLSSave; stdcall;
begin
try
XlsRW.Write;
except
raise Exception.Create('Save To Excel File Failed.');
end;
end;

exports
XLSSave;

//取单元格的值,返回类型:PChar
function XLSGet_AsString(iSheet, iRow, iCol: Integer): PChar; stdcall;
var
ws: WideString;
s: String;
begin
try
ws := XlsRW.Sheets[iSheet - 1].AsString[iCol - 1, iRow - 1];

WideCharToStrVar(PWideChar(ws), s);
Result := Pchar(s);
except
raise Exception.Create('List index out of bounds (' + IntToStr(iSheet) + ')');
end;
end;

exports
XLSGet_AsString;

begin
end.
...全文
410 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
Randomize 2006-01-09
  • 打赏
  • 举报
回复
學習了!CopyMemory方法用的恰當啊.
xili 2006-01-08
  • 打赏
  • 举报
回复
请问 免费下载的 TXLSReadWriteII2 有什么使用限制?
clasj 2006-01-08
  • 打赏
  • 举报
回复
正好赶上接分:)
Comer 2006-01-07
  • 打赏
  • 举报
回复
我的email: comerliang@163.com
QQ: 230043

欢迎交流

发信请把该贴地址复制过去
Comer 2006-01-07
  • 打赏
  • 举报
回复
DLL修改如下:
function XLSGet_AsString(iSheet, iRow, iCol: Integer; OutStr:PChar; aLen: integer): Integer; stdcall;
var
ws: WideString;
s: String;
begin
try
ws := XlsRW.Sheets[iSheet - 1].AsString[iCol - 1, iRow - 1];
WideCharToStrVar(PWideChar(ws), s);
Result := length(s);
if aLen = 0 then
exit;

if Result > aLen then
Result := aLen;
CopyMemory(OutStr, PChar(s), Result);
except
result := -1;
end;
end;

exports
XLSGet_AsString;

delphi下的调用就不用说了吧,说说PB下调用:
int i
string s
i = XLSGet_AsString(1, 1, 1, s, 0)
s = space(i)
XLSGet_AsString(1, 1, 1, s , i)

搞定
ztenv 2006-01-07
  • 打赏
  • 举报
回复
顶一下...
xili 2006-01-06
  • 打赏
  • 举报
回复
请问 控件 TXLSReadWriteII2 是不是免费?
harryduan 2006-01-06
  • 打赏
  • 举报
回复
很明显,你的pb调用代码写的不对,^_^
柯本 2006-01-06
  • 打赏
  • 举报
回复
我也一直用TXLSReadWriteII2;虽然没有碰到楼主的问题(我不用PB),但也希望楼主能贴出解决方案,谢谢!
Mr_Yang 2006-01-06
  • 打赏
  • 举报
回复
学习。
才子鸣 2006-01-06
  • 打赏
  • 举报
回复
UP楼上的
summersky204608 2006-01-06
  • 打赏
  • 举报
回复
学习下!
hthunter 2006-01-06
  • 打赏
  • 举报
回复
不厚道,解决了也不说说方法
Comer 2006-01-06
  • 打赏
  • 举报
回复
自己搞定了,爽

居然成了热门贴,那就下周在揭帖吧!!!
ysai 2006-01-05
  • 打赏
  • 举报
回复
那你查查取得的值与函数的返回值的二进制数据看看是否一样的再确实原因在哪,在DLL中的值写到A文件中,EXE中函数调用的返回值写到B文件中,用UEDIT对比一下
swimming8243 2006-01-05
  • 打赏
  • 举报
回复
只能说borland不是ms啊~么办法了
Comer 2006-01-05
  • 打赏
  • 举报
回复
to ysai(所有真的都是假的真,所有假的都是真的假) :
刚刚试过了,还是不行,读出来的内容:

资 产 负 债 表奂剖?
内 部 现 金 流 量 抵 销 资 料 表?
快乐老猫 2006-01-05
  • 打赏
  • 举报
回复
1.不可以在DLL里面分配字符串空间给调用函数,字符串空间必须在外部分配。
2.不可以将字符串作为返回值,你看见那个WIN API有字符串返回值了。
3.一般都要传递给函数PCHAR的空间长度,避免字符串空间不足。
4.XlsRW.Sheets[iSheet - 1].AsString[iCol - 1, iRow - 1]; 返回的应该是string吧,应该没必要用WIDESTRING变量。

常见写法

fun xxx(ps: pchar; ilen: integer): integer
var
s: string;
begin
s := 'abc';
result := length(s);
if ilen = 0 then
exit;
if result > ilen then
result := ilen ;
CopyMemory(ps, PChar(s), result);
end;

var
ss: string;
i: integer;
begin
i := xxx(PChar(ss), 0);
SetLength(ss, i);
i := xxx(pChar(ss), i);
end;
Comer 2006-01-05
  • 打赏
  • 举报
回复
to aiirii(ari-http://spaces.msn.com/members/aiirii/) :
转化前,转化后都没有问题,我在DLL里用showmessage测试过,正确


to ysai(所有真的都是假的真,所有假的都是真的假) :
--还是老实参照API的做法,谁分配谁释放.
试过了,只是没用使用过这句:
CopyMemory(OutStr, PChar(s), l);

我试试看,解决马上揭帖!!!
ysai 2006-01-05
  • 打赏
  • 举报
回复
function XLSGet_AsString(iSheet, iRow, iCol: Integer; OutStr:PChar;AMaxCount:integer): boolean; stdcall;
var
ws: WideString;
s : String;
l : integer;
begin
try
ws := XlsRW.Sheets[iSheet - 1].AsString[iCol - 1, iRow - 1];
WideCharToStrVar(PWideChar(ws), s);
l := length(s);
if l > AMaxCount then
l := AMaxCount;
CopyMemory(OutStr, PChar(s), l);
Result := true;
except
result := false;
end;
end;

procedure TForm1.Button18Click(Sender: TObject);
var
p : array[0..MAXBYTE] of char;
begin
FillMemory(@p[0], MAXBYTE + 1, 0);
XLSGet_AsString(1, 1, 1, p, MAXBYTE);
caption := p;
end;

明显是最后半个汉字,也就是最后一个字符没取出来
我连函数返回值都不用PChar,因为内在是在DLL中分配的,还是老实参照API的做法,谁分配谁释放.
加载更多回复(16)
KesionCMS是漳州科兴信息技术有限公司开发的一套万能建站产品,是CMS行业最流行的网站建设解决方案之一,V9.0采用ASP ACCESS/MSSQL架构,系统具有极强的可扩展性,并且一直以来完全开放源代码;这套系统自2006年发布的第一个版来以来,以其简单易用、功能强大、拓展性极灵活而倍受广大用户的青睐,至今已累计数十万的用户群。     拥有CMS业界最全的功能,是适合任何网站的最佳解决方案 功能模型十分齐全,系统拥有CMS业界最全的功能,含文章、图片、下载、商城、供求、人才、动漫、微博、影视、考试、团购、房产、问答、论坛、会员、博客空间、黄页、产品库、专题等十几个主系统和采集、调查、评论、搜索、公告、PK、心情指数、顶客DIGG、签收等几十项子系统组合而成,代码完全开源化,在尊重版权的前提下能极大的满足站长对于网站程序进行二次开发,以满足任意网站的任何需求;系统采用模型拓展,用户可以根据网站的需要,自行在后台通过自定义模型和字段来实现各种网站的功能需求,通过自定义表单实现在线报修,报名,在线反馈等系统;系统在安全性、稳定性、易用性方面具有较高的声誉,深受广大站长推崇,其灵活的产品架构、极强的可扩展性和可伸缩性完全能最大化满足站长目前及今后的应用需求   人性化的管理操作平台,灵活的模板标签管理 人性化的管理操作平台和灵活的模板标签管理,倍受广大用户的喜爱,系统将前台的模板和标签分离,全面支持table和div css,让模板制作更加灵活,不局限于某种风格,随心所欲的DIY,让您的网站页面可以随时更换风格随时更改布局,万能标签让您实现各式各样的网站效果,不懂代码没关系,我们还有多种标签样式可以选择,只需轻松的点点您的鼠标,一个网站就做好了。 栏目无限级分类并支持绑定顶级或二级域名 系统支持栏目无限级分类,并可对系统栏目进行一级或N级栏目的排序操作,对栏目之间的内容进行复制(CTRL C),粘贴(CTRL V)操作,对栏目的内容进行合并,对栏目或文章进行批量的绑定模板或设置文章的属性,点击次数等; 另外新版中栏目支持绑定顶级或二级域名,满足为了方便用户记忆或便于SEO或者大型网站的需要。 强大的搜索引擎(SEO),自定义生成路径 系统支持动态asp,伪静态(带组件和不带组件),全静态三种生成方式,并且可以自定义生成的Html路径,方便自己做SEO,用户可以根据网站的需求随意选择。     无处不在的SNS互动元素,让您的爱站更具交流互动性 在这个日新月异的网络时代,KesionCMS始终以用户体验为导向,在本次V8.0版本中,融入更多的SNS。博客日志管理功能、相册管理功能、朋友圈管理功能、群组讨论管理功能、新鲜事、网友动态、最近谁来看过我、空间留言、日志评论、RSS在线订阅管理功能、收藏夹管理功能、邮件群发功能、短消息服务等实用功能;无处不在的SNS互动元素,让您的爱站帮助所有用户在浏览您的网站时更好的交流互动。     灵活的商业运营模式,完善的用户权限分配系统和资金明细 KesionCMS系统拥有一套健全完善的会员体系和完整的支付平台接口。可以在后台自由设置会员组,可以对栏目和文章设置会员浏览时权限及查阅所需消耗的科汛币金额;会员在会员中心可以在线充值或购买点卡进行充值;另外,网站的管理员在后台可以详细的查看资金明细,用户在前台会员中心也有详细的资金明细表。这样一来,网站可以通过销售点券,积分,充值卡,资金等来进行盈利。     打破传统CMS系统瓶颈,系统自带功能强大的论坛BBS KesionCMS打破CMS系统瓶颈,系统自带功能强大的BBS,不再为了整合第三方论坛平台而烦恼,一站式用户登录,系统还集成腾讯QQ,新浪微博及支付宝快捷登录,只需绑定下帐户,以后可以直接用QQ号或支付宝帐户登录。论坛拥有大型论坛的功能,可自定义版面分类、版规说明、版主分配、权限分配、设置积分和威望、论坛等级头衔设置,还可以将版面设置为认证版面,只有特定权限的用户才能进入认证版面发帖。发表主题后,可以只看该作者及查看该作者发表的主题;可以在会员中心查看自己发表的主题;可以对用户帖子进行点评,回复,还可对精典的帖子内容进行置顶,加精等操作。     2013-6-25更新说明: 1、修复通用筛选文件item/index.asp存在SQL注入漏洞 2、修复下载系统存在的漏洞,前台启用下载系统允许投稿的情况下,可能导致conn.asp文件被下载 3、修复user/reg/UserRegResult.asp,在请求HTTP_REFERER时候没有做过滤就带入到insert中去了 4、修复会员中心的短消息存在的跨站xss漏洞 5、修复空间门户里留言可以存在的跨站xss漏洞
KesionCMS是漳州科兴信息技术有限公司开发的一套万能建站产品,是CMS行业最流行的网站建设解决方案之一,V9.03采用ASP ACCESS/MSSQL架构,系统具有极强的可扩展性,并且一直以来完全开放源代码;这套系统自2006年发布的第一个版来以来,以其简单易用、功能强大、拓展性极灵活而倍受广大用户的青睐,至今已累计数十万的用户群。   拥有CMS业界最全的功能,是适合任何网站的最佳解决方案功能模型十分齐全,系统拥有CMS业界最全的功能,含文章、图片、下载、商城、供求、人才、动漫、微博、影视、考试、团购、房产、问答、论坛、会员、博客空间、黄页、产品库、专题等十几个主系统和采集、调查、评论、搜索、公告、PK、心情指数、顶客DIGG、签收等几十项子系统组合而成,代码完全开源化,在尊重版权的前提下能极大的满足站长对于网站程序进行二次开发,以满足任意网站的任何需求;系统采用模型拓展,用户可以根据网站的需要,自行在后台通过自定义模型和字段来实现各种网站的功能需求,通过自定义表单实现在线报修,报名,在线反馈等系统;系统在安全性、稳定性、易用性方面具有较高的声誉,深受广大站长推崇,其灵活的产品架构、极强的可扩展性和可伸缩性完全能最大化满足站长目前及今后的应用需求   人性化的管理操作平台,灵活的模板标签管理 人性化的管理操作平台和灵活的模板标签管理,倍受广大用户的喜爱,系统将前台的模板和标签分离,全面支持table和div css,让模板制作更加灵活,不局限于某种风格,随心所欲的DIY,让您的网站页面可以随时更换风格随时更改布局,万能标签让您实现各式各样的网站效果,不懂代码没关系,我们还有多种标签样式可以选择,只需轻松的点点您的鼠标,一个网站就做好了。     栏目无限级分类并支持绑定顶级或二级域 系统支持栏目无限级分类,并可对系统栏目进行一级或N级栏目的排序操作,对栏目之间的内容进行复制(CTRL C),粘贴(CTRL V)操作,对栏目的内容进行合并,对栏目或文章进行批量的绑定模板或设置文章的属性,点击次数等; 另外新版中栏目支持绑定顶级或二级域名,满足为了方便用户记忆或便于SEO或者大型网站的需要。     强大的搜索引擎(SEO),自定义生成路径 系统支持动态asp,伪静态(带组件和不带组件),全静态三种生成方式,并且可以自定义生成的Html路径,方便自己做SEO,用户可以根据网站的需求随意选择。     无处不在的SNS互动元素,让您的爱站更具交流互动性 在这个日新月异的网络时代,KesionCMS始终以用户体验为导向,在本次V8.0版本中,融入更多的SNS。博客日志管理功能、相册管理功能、朋友圈管理功能、群组讨论管理功能、新鲜事、网友动态、最近谁来看过我、空间留言、日志评论、RSS在线订阅管理功能、收藏夹管理功能、邮件群发功能、短消息服务等实用功能;无处不在的SNS互动元素,让您的爱站帮助所有用户在浏览您的网站时更好的交流互动。     灵活的商业运营模式,完善的用户权限分配系统和资金明细 KesionCMS系统拥有一套健全完善的会员体系和完整的支付平台接口。可以在后台自由设置会员组,可以对栏目和文章设置会员浏览时权限及查阅所需消耗的科汛币金额;会员在会员中心可以在线充值或购买点卡进行充值;另外,网站的管理员在后台可以详细的查看资金明细,用户在前台会员中心也有详细的资金明细表。这样一来,网站可以通过销售点券,积分,充值卡,资金等来进行盈利。 打破传统CMS系统瓶颈,系统自带功能强大的论坛BBS     KesionCMS打破CMS系统瓶颈,系统自带功能强大的BBS,不再为了整合第三方论坛平台而烦恼,一站式用户登录,系统还集成腾讯QQ,新浪微博及支付宝快捷登录,只需绑定下帐户,以后可以直接用QQ号或支付宝帐户登录。论坛拥有大型论坛的功能,可自定义版面分类、版规说明、版主分配、权限分配、设置积分和威望、论坛等级头衔设置,还可以将版面设置为认证版面,只有特定权限的用户才能进入认证版面发帖。发表主题后,可以只看该作者及查看该作者发表的主题;可以在会员中心查看自己发表的主题;可以对用户帖子进行点评,回复,还可对精典的帖子内容进行置顶,加精等操作。   2013-6-25更新说明: 1、修复通用筛选文件item/index.asp存在SQL注入漏洞 2、修复下载系统存在的漏洞,前台启用下载系统允许投稿的情况下,可能导致conn.asp文件被下载 3、修复user/reg/UserRegResult.asp,在请求HTTP_REFERER时候没有做过滤就带入到insert中去了 4、修复会员中心的短消息存在的跨站xss漏洞 5、修复空间门户里留言可以存在的跨站xss漏洞

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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