超级郁闷问题!都进来看看,不管你现在用不用得到,一定有帮助。。。请求版主帮忙置顶!!!
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.