创建dll问题 调用时出错 ( 积分: 100 )

  • 主题发起人 主题发起人 xusiqi8868
  • 开始时间 开始时间
X

xusiqi8868

Unregistered / Unconfirmed
GUEST, unregistred user!
function FormatNumber(value, lengths: integer): string;
STDCALL;
var i,len:integer;// 变量分别表示循环控制变量和字符长度
str:string;
//数字字符
begin
str:=intToStr(value);
len:=Length(str);
len:=lengths - len;
//格式化长度 - 数字字符长度
if len>0 then
//如果字符长度不够前面补‘0’
for i:=1 to lendo
str:='0' + str;
FormatNumber:=str;
end;
EXPORTS FormatNumber NAME 'FormatNumber';
调用时出错
Invalid Poninter Operation
但是
这段程序直接在delphi中不出错
 
function FormatNumber(value, lengths: integer): string;
STDCALL;
var i,len:integer;// 变量分别表示循环控制变量和字符长度
str:string;
//数字字符
begin
str:=intToStr(value);
len:=Length(str);
len:=lengths - len;
//格式化长度 - 数字字符长度
if len>0 then
//如果字符长度不够前面补‘0’
for i:=1 to lendo
str:='0' + str;
FormatNumber:=str;
end;
EXPORTS FormatNumber NAME 'FormatNumber';
调用时出错
Invalid Poninter Operation
但是
这段程序直接在delphi中不出错
 
function FormatNumber(value, lengths: integer): PChar;
STDCALL;
exports FormatNumber;
 
如楼上所写,在 DLL 中要使用 PChar,而非 string
 
我来说原因,呵呵:
如果DLL中的导出函数或过程以字符串或动态数组作为参数或返回值,那么ShareMem
必须是DLL和项目的uses子句中的第一单元。这应用于应用程序和DLL的一切字符串的传递,
甚至隐含在记录和类中的字符串。ShareMem是共享的内存管理器Borlndmm.dll的接口单元,
Borlndmm.dll必须与DLL一起发布。要避免使用Borlndmm.dll,就得用PCar或者ShortString来传递字符串信息。
只有当模块间传递字符串和动态数组并且需要传递内存的隶属关系时,才需要ShareMem
单元。将一个内部字符串强制类型转换为PChar并将其作为PChar传递给另一个模块时,不传递字符串内存的隶属关系到调用模块,那么就不需要ShareMem单元了。
注意ShareMem单元只应用于Delphi/BCB DLL之间或其与EXE之间以字符串或动态数组为
传递参数时使用。反之,如果是在非Delphi的DLL或宿主应用程序之间的话,也就不需要
ShareMem单元了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
806
import
I
I
回复
0
查看
550
import
I
后退
顶部