Blue
Red
Green
Orange
Voilet
Slate
Dark

delphi动态链接库编程中遇到的问题!请大家帮忙!谢谢!(50分)

  • 主题发起人 tigerhacker
  • 开始时间
T

tigerhacker

Unregistered / Unconfirmed
GUEST, unregistred user!
下面这个是我写的动态链接库文件,功能是传入两个任意位数的整数,输出结果为两个数的和,我把生成的动态链接库放在我的主程序目录下,然后在我的主程序里面调用这个动态链接库,语句是:
function addab(num1,num2:string):string;stdcall;external 'project2.dll';
showmessage(addab('123','11111'));
输出结果正确,可是出现错误提示框说"非法的指针操作",请大家帮忙研究下!谢谢
library Project2;
uses
SysUtils,
Classes;
const n=100;
type arrtype=array[1..n] of byte;
{$R *.res}
function addab(num1,num2:string):string;stdcall;
var
a,b:arrtype;
i:integer;
shuchu:string;
T,s:byte;
begin
for i:=1 to ndo
begin
a:=0;
b:=0;
end;
for i:=1 to length(num1)do
a[n+1-i]:=ord(num1[length(num1)+1-i])-48;
for i:=1 to length(num2)do
b[n+1-i]:=ord(num2[length(num2)+1-i])-48;
T:=0;
for i:=ndo
wnto 1do
begin
s:=a+b+T;
a:=s mod 10;
t:=s div 10;
end;
i:=1;
while (a=0) and (i<n)do
inc(i);
shuchu:='';
while i<=ndo
begin
shuchu:=shuchu+inttostr(a);
inc(i);
end;
Result:=shuchu;
end;
exports //引出函数名
addab;
end.
 
T

tigerhacker

Unregistered / Unconfirmed
GUEST, unregistred user!
难道说就没有人知道么?
 
R

rabbitlzx

Unregistered / Unconfirmed
GUEST, unregistred user!
我不明白你为什么用string类型的参数,用整形不行么
如果你非用字符型的话,在uses最前面好像应该加上ShareMem,而且最好用shortstring
 
K

kaida

Unregistered / Unconfirmed
GUEST, unregistred user!
我用你的代码试了一下,没发现问题。
 
T

tigerhacker

Unregistered / Unconfirmed
GUEST, unregistred user!
可以运行正常,可是输出结果后,会弹出一个错误提示框,抛出异常也不可以!结果也是正确的!我就是想知道哪个错误框的原因是什么!
 
T

tigerhacker

Unregistered / Unconfirmed
GUEST, unregistred user!
我如果把这个动态连接库的代码直接放在主程序里面是没有问题的,可是作成动态连接库静态调用就会说&quot;非法指针操作&quot;!
 
K

kaida

Unregistered / Unconfirmed
GUEST, unregistred user!
library Project2;
uses
SysUtils,
Classes;
{$R *.res}

procedure addab(num1,num2:string;
var Str:string);stdcall;
const
n=100;
type
arrtype=array[1..n] of byte;
var
a,b:arrtype;
i:integer;
shuchu:string;
T,s:byte;
begin
for i:=1 to ndo
begin
a:=0;
b:=0;
end;
for i:=1 to length(num1)do
a[n+1-i]:=ord(num1[length(num1)+1-i])-48;
for i:=1 to length(num2)do
b[n+1-i]:=ord(num2[length(num2)+1-i])-48;
T:=0;
for i:=ndo
wnto 1do
begin
s:=a+b+T;
a:=s mod 10;
t:=s div 10;
end;
i:=1;
while (a=0) and (i<n)do
inc(i);
shuchu:='';
while i<=ndo
begin
shuchu:=shuchu+inttostr(a);
inc(i);
end;
StrCopy(PChar(Str), PChar(shuchu));
end;
exports //引出函数名
addab;
end.
-------
调用:
procedure addab(num1,num2:string;
var Str:string);stdcall;external 'project2.dll';
。。。
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
begin
setlength(str,100);
addab('123','11111', str);
showmessage(str);
end;

动态库中不能用 string 作为返回值,因为返回时内存就释放了,会引起&quot;非法的指针操作&quot;。
 
T

tigerhacker

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢你!kaida,问题解决了!以后有不懂的地方还的多多请教!
 

Similar threads

I
回复
0
查看
751
import
I
I
回复
0
查看
598
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
612
import
I
顶部 底部