焦头烂额一个上午还是搞不定,跪地相求大家,朋友帮忙啊。。。 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061218121845242.html
library MYDLL;
uses
sharemem,
SysUtils,
StdCtrls;
var
fjmain : TADODataSet;
type
Tps = Record
sno: integer;
fjcode:pchar;
fjname:pchar;//
End;
Tp=array of Tps;
{$R *.RES}
function Select(transmode:pchar;var PResult:Tp):integer; export; stdcall;
var
fjcode,t1,t2:pchar ;
totalnum:integer;
begin
fjmain:= TADODataSet.Create(nil);
ADO配置过程......(OK的)
fjmain.Connection := ADOConnection;
try
fjmain.Close;
fjmain.CommandText:= 'Select * From fjmain order by fjid';
fjmain.Open;
t1:=pchar(fjMain.fieldbyname('fjcode').asstring);
t2:=pchar(fjMain.fieldbyname('fjname').asstring);
while not fjmain.eof do
begin
if (满足条件) then
begin
totalnum:=totalnum+1;
setlength(PResult,totalNum);
PResult[totalNum-1].sno:=totalnum;
PResult[totalNum-1].fjcode:=t1;
PResult[totalNum-1].fjname:=t2;
end;
fjmain.next;
end;
Result := totalnum;
finally
fjmain.Free;
CoUnInitialize;
end;
end;
exports
Select;
begin
end.
以上是我的代码,现在的问题是
第一:我在fjmain表循环的时候,有很多满足条件的记录,我看了结果仅仅最后一条记录中的fjcode,fjname字符串是正确的,其他的都是乱78糟的字符,或者是字符的前几个字母后面的字母是乱码,为什么呢?
第二:当我连续两次调用该DLL的时候,会出现内存错误,难道我什么地方没有释放字符串PCHAR变量,就是t1,t2变量么?
这个问题我已经搞了一个上午了,反复的换pchar,string来试,结果还是有内存问题,大家帮我看看程序的什么地方有问题呢?
totalnum的初始数值是多少
应该不是这个问题,初始值是0 啊
array of 是Delphi特有的开放数组
作为DLL的接口,恐怕有问题的
直接使用fieldbyname().value试试?
totalnum的初始数值?
初始值我说了是0啊,我前面有这样语句的,我的问题还是在于STRING使用上的问题,因为我一旦去掉 setlength(PResult,totalNum);
PResult[totalNum-1].sno:=totalnum;
PResult[totalNum-1].fjcode:=t1;
PResult[totalNum-1].fjname:=t2;这几句,怎么运行都不会出问题的。
1、totalnum的初始值?
2、t1,t2是PChar类型,Pchar是指针,不能用来保存数据,当fjmain.Next后,应该指向了无效地址空间。
3、array of 是Delphi特有的开放数组,作为DLL的接口,肯定有问题的。
4、在循环中反复使用setlength(PResult,totalNum);分配内存空间,可能造成前面已经赋值的记录数据丢失,造成乱码
谢谢以上各位兄弟们的关心和回答,尽管我问题还没有完全处理掉,但给我了很好的思路,先结帖,顺便关于下面的这个问题,问下大哥:
3、array of 是Delphi特有的开放数组,作为DLL的接口,肯定有问题的。
(我ARRAY OF只在函数中单独定义单独使用,不作为DLL程序和外界程序的接口,可以使用么?)
我ARRAY OF只在函数中单独定义单独使用,不作为DLL程序和外界程序的接口,可以使用么?
===================================================================================
那应该没问题的,另外需要指出的是,输出记录地址最好由程序调用Dll函数前分配,不要在Dll中分配