问一个调用DLL的问题(100分)

  • 主题发起人 主题发起人 BlueGhost
  • 开始时间 开始时间
B

BlueGhost

Unregistered / Unconfirmed
GUEST, unregistred user!
DLL的源文件如下:
library Encode_dll;

uses
Encode in 'Encode.pas';

{$R *.res}
exports
Encode2;

begin
procSaveExit:=Exitproc;
Exitproc:=@EnCode1;
end.

Encode.pas的内容如下:
unit Encode;

interface

uses windows,messages;

var
procSaveExit:pointer;
function Encode2(Code:string):string;
procedure EnCode1;

implementation

function Encode2(Code:string):string;
begin
Result:=Code+'Hello';
end;

procedure EnCode1;
begin
messagebox(0,'结束调用','结束调用',MB_OK);
ExitProc:=procSaveExit;
end;

end.

我在另外一个程序中调用Encode2这个函数的时候报错为“Invalid pointer operation”
这是怎么回事?
 
我也遇到过,因为你使用string型的返回值。
解决方法是:
1)换用Char型。
2)library Encode_dll;
uses
ShareMem,---------加上这个,第一个引用。
Encode in 'Encode.pas';

在应用程序的
program Project1;

uses
ShareMem,---------加上这个,第一个引用。
Forms,

另外在delphi安装目录下查找:borlndmm.dll 拷贝到应用程序目录中。

 
ShareMem刚刚加上去了,这次可以正确运行出结果了,但是,在我结束调用Encode2函数的程序的时候又报错了
还是Invalid pointer operation,怎么回事?
我的函数的作用就是需要处理一个string啊,返回值也必须要是string啊~
 
geluyx说得对,我推荐使用第一个方法,用PChar
 
dll里还是用PChar保险
 
你那个函数function Encode2(Code:string):string;可以写成
function Encode2(Code:string):string;stdcall;
然后在主程序中直接调用,就行了,为什么要使用初始化块呢?
begin
//procSaveExit:=Exitproc;
//Exitproc:=@EnCode1;
end.
这里不需要写任何东西呀
 
我也来学习学习一下啊:)
 
加了stdcall就报“access violation at 0x000313a1:write of address 0x10c00000”。。。。
 
你把你的调用源码也贴出来吧
 
申明函数
function Encode2(Code:string):string;external 'EnCode_Dll.dll';
调用
edit1.text:=Encode2(edit2.text);
 
申明函数
function Encode2(Code:string):string;stdcall;external 'EnCode_Dll.dll';
 
是啊,DLL输出函数的参数用PCHAR不要STRING啊
 
不要使用string作为DLL中导出的函数的参数或返回值,那样会使你的程序在被其它语言调用
时遇到问题,应使用PChar,但返回一个PChar会有内容访问方面的问题(比如重入问题),
建议设成[out]类型的参数,由调用者分配内存。
procedure Encode2(const Src:PChar; Dest: PChar);
 
后退
顶部