dll的一个简单问题(100分)

  • 主题发起人 主题发起人 songhb
  • 开始时间 开始时间
S

songhb

Unregistered / Unconfirmed
GUEST, unregistred user!
一个简单的dll,请大家看看错在何处。

dll部分:
library mydll;

uuses
SysUtils,
StdCtrls,
Classes;

function myfunc(s: string): string; export; stdcall;
begin
result := s;
end;

exports
myfunc;

{$R *.RES}

begin

end.

调用部分的.pas:
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;

var
Form1: TForm1;

function myfunc(s: string): string; stdcall; external 'mydll.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(myfunc('asfds00000'));
end;

end.

编译没错误,执行时在调用结束后出现'Invalid pointer operation.'错误。请问该如何解决。
是不是在创建dll时不能使用这种引用方式,而一定要使用一个unit单元?
 
function myfunc(s: string): string; export; stdcall;
改成
function myfunc(s: PChar): PChar; export; stdcall;

 
制作dll时你没有看注释吗?呵呵……
 
不看帮助的结果。
library mydll;
uses
ShareMem,
//...
program Project1;
uses
ShareMem,
//...
 
我试过sharemem,可退出时还是报同样的错,要怎样改呢?
 
要象savenight写的一定要放在工程的USES下的第一行。
 
可以下面这样修改,可能是因为String的自动回收功能作怪

dll部分:
library mydll;

uses
SysUtils,
StdCtrls,
Classes;

function myfunc(s: PChar): PChar; export; stdcall;
begin
result := s;
end;

exports
myfunc;

{$R *.RES}

begin

end.

调用部分的.pas:

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;

var
Form1: TForm1;

function myfunc(s: PChar): PChar; stdcall; external 'mydll.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(myfunc('aaaaassdf'));
end;

end.
 
看看d动态连接库工程文件中的注释吧!
libiary *** 后面的部分(英文),
Delphi告诉我们最好用Shortstring或 Pchar代替string类型的传入参数。
而且,在工程源文件(project->view source调出)加入,ShareMem,并且在第一行。
你自己的Dll文件中ShareMem也是这个位置。试试吧。:)
还有,不呀忘了在系统发行时,带上BORLNDMM.DLL。
 
DLL中的函数的返回值不能为String型,换成PCHAR
 
改成 shortString ,比较好操作。
 
DLL中的String 變量的傳遞只能用PCHAR,
 
后退
顶部