关于DLL的参数传递。 ( 积分: 200 )

  • 主题发起人 主题发起人 sy.zhuang
  • 开始时间 开始时间
S

sy.zhuang

Unregistered / Unconfirmed
GUEST, unregistred user!
想写一个DLL函数。它的格式是这样:
function abcd(byte_1:array of byte):integer;stdcall;
它的返回值是integer,如果为-1,就说明无返回数据,如果返回是100。则说明byte_1这个数组里面有100个BYTE.也就是说,byte_1即作为输入,当函数有返回值时,byte_1中也有输出数据。(这种模式也是标准的windows编程的模式。)大概应该如何实现?请给一个demo。谢谢!
 
function abcd(var byte_1:array of byte):integer;stdcall;
即可
 
稍微些个示例的函数体给我,okay?谢谢!
 
library testapp;

function abcd(var v): integer;stdcall;
type
TArrByte = array of Byte;
begin
result:= -1;
if @v = nil then Exit;
result:= Length(TArrByte(v));
if result >= 4 then begin
Pinteger(@v)^:= Random(result);
result:= 4;
end;
end;

exports
abcd;
begin
end. //}

program Project1;
uses Windows;
function abcd(var v): integer;stdcall;external 'testapp.dll';
var
v: array of byte;
s: string;
i: integer;
begin
str(abcd(pointer(nil)^), s);
MessageBox(0, @s[1], nil, 0);
str(abcd(v), s);
MessageBox(0, @s[1], nil, 0);
SetLength(v, 1000);
str(abcd(v), s);
MessageBox(0, @s[1], nil, 0);
str(abcd(s), s);
MessageBox(0, @s[1], nil, 0);
str(abcd(i), s);
MessageBox(0, @s[1], nil, 0);
end. //}
 
最好用指针不要用动态数组array of byte
function abcd(byte_1:PByte):integer;stdcall;
var
data:integer;
begin
data:=10000;
getmem(byte_1,sizeof(integer));//分配空间
move(data,pbyte,sizeof(integer));//赋值
result:=sizeof(integer);
end;
调用者要注意释放空间
 
使用const和var修饰的参数本质传递的就是指针。
maze的做法违背了dll调用中,谁申请的资源由谁来释放的惯例。
 
1.最好用Pointer
2.最好制定结束标志!否则无法知道数组长度!
 
使用PByte或者PChar
 
maze和trustme能否给出一个具体的实例,谢谢/
 
我给的不是一个具体的实例么!?
 
trustme,maze,我试了你们两的代码,都不行,也许试我愚笨.可否贴上完整的代码.谢谢.
 
谢谢各位!结贴啦!
 
后退
顶部