求救,急!!(dll)(100分)

  • 主题发起人 主题发起人 ningliu
  • 开始时间 开始时间
N

ningliu

Unregistered / Unconfirmed
GUEST, unregistred user!
本人写了一个dll,输出一个函数,这个函数用来将一个我自己定义格式的
文件(由几个文件的压缩数据合成)拆开,用到了Stream操作,以及一个
得到的压缩单元(zlib),拆开解压后直接写到磁盘上,我的问题是我的
dll调试通过了,调用后出错,但文件已经解开,单步执行时发现,到函数
结尾(end)时,出错,说什么存取侵权,CPU窗口显示正在调用什么,大概
是这样写的
xxxxx call dword ptr ..
^^^^地址
我所用到的Stream可都是释放了的。
请各位大虾发发言!还有什么其他可能的错误。
另,我的dll就一个文件,有三个函数,一个是输出的,另两个被调用。
 
呵呵, dll和主程序的函数声明不匹配. dll运行完无法找到返回地址了.
 
是不是一个声明了stdcall, 而另一个忘了?
 
DLL输出例程都要加StdCall保留字,别忘了
 
应当是EYES和JETIDEAS说的STDCALL没加.
 
都加过了
 
我的程序就这么简单也出错,大伙看看;
以下是dll源程序
library Test;
uses
SysUtils,
Classes;
{$R *.RES}
function Add(Str1,Str2: PChar): PChar;
stdcall;
begin
Result := #0;
StrPCopy(Result,StrPas(Str1)+StrPas(Str2));
end;

exports
Add;
begin
end.

以下是调用的程序:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function Add(Str1,Str2: PChar): PChar;
stdcall;
external 'Test.dll';
var
Form1: TForm1;
implementation

{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(StrPas(Add('aaa','bbb')));
end;

end.

到底那里有毛病?????
 
这是你dll的function写错了!
 
pchar要alloc空间
比如:
GetMem(a,20);
StrPCopy(a,'aaa'+'bbb');
ShowMessage( StrPas(a) );
FreeMem(a,20);

 
给你完整的离子:
(调用程序)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function Add(Str1,Str2: PChar): PChar;
stdcall;
external 'Test.dll';
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
a : pchar;
begin
GetMem(a,20);
strCopy(a,Add('aaa','bbb'));
ShowMessage( StrPas(a) );
FreeMem(a,20);
end;

end.

(dll程序)
library test;
uses
SysUtils,
Classes;
{$R *.RES}
function Add(Str1,Str2: PChar): PChar;
stdcall;
var
a: array [0..100]of char;
begin
Result := #0;
StrPCopy(a,string(Str1)+STrPas(Str2));
Result := a;
end;

exports
Add;
begin
end.
 
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(StrPas(Add('aaa','bbb')));
end;
//这样也可以!
 
如果只是Delphi调用的话,就不要用PChar了,直接用String就行了,方便
 
hehe, 不用DELPHI也可以使用STRING!
 
当然错了!
定义的函数
function Add(Str1,Str2: PChar): PChar;
stdcall;
external 'Test.dll';
应置于Implementation后。
另:你有好的dll工具(源程序)是否可加到本人的Dll库中?
 
多人接受答案了。
 
后退
顶部