type Tmyint: array [0..9] of integer;funciton ReadMessage(cardmessage:Tmyint):boolean;stdcall;external 'TestDll.dll'var cardID:Tmyint; i:integer; begin if ReadCardMessage(cardID) then for i:=0 to 9 do showmessage(inttostr(cardID[i])); end;
type card=array [0..9] of integer; var cardid:card; begin if ReadCardMessage(@cardID) then showmessage(''); end
to vcshcn(黑色的星星) : 你的方法与我的方法是一样的 var cardID:array [0..9] of integer; begin if ReadCardMessage(@cardID) then showmessage(''); end;编译时会出错:(好像是分配内存的问题) Incompatible types:'Integer' and 'Pointer'
type TMyIntArray = Array[0..9]of Integer;function ReadMessage(CardMessage:TMyIntArray):bool;stdcall;external 'TestDll.dll';var cardID:TMyIntArray; begin if ReadCardMessage(cardID) then showmessage(''); end; 这样好像不通用如果dll是你自己写的, 不如改写成: API bool ReadMessage(int *cardMessage;int Len);//好像你那样声明[10]是没有用的!Delphi中这样声明:function ReadMessage(cardMessage:PInteger;Len:Integer):Boolean;var CardId:Array[1..10]of Integer; begin FillChar(CardId,0,Length(CardId));//这句要不要看你的VC中是怎么实现的了 if ReadMessage(@CardId,Length(CardId)) then begin end; end;
type
Tmyint: array [0..9] of integer;funciton ReadMessage(cardmessage:Tmyint):boolean;stdcall;external 'TestDll.dll'var
cardID:Tmyint;
i:integer;
begin
if ReadCardMessage(cardID) then
for i:=0 to 9 do
showmessage(inttostr(cardID[i]));
end;
定义有问题
ReadMessage(int &cardMessage[10]);
funciton ReadMessage(var cardmessage:Tmyint):boolean;stdcall;external 'TestDll.dll'
编译通不过
这个函数的意义是:当你把 CardID 传入 ReadMessage 后,返回一个 Bool
值,表示成功或失败,其中并没有可以返回的其他参数.如果你确信CardID将
被重新填充后返回,那在你调用程序中必须为CardID分配好内存,而不是简单
地把数组名传递出去,因为你这样传递实际上只传出了CardID数组的第一个
元素.外部程序并不知道你的第一个后面还有9个空格,如果成功调用,也是违
反了内存管理——你无法越界读取.具体例子就免了,自己再看看.
var cardid:card;
begin
if ReadCardMessage(@cardID) then
showmessage('');
end
你的方法与我的方法是一样的
var
cardID:array [0..9] of integer;
begin
if ReadCardMessage(@cardID) then
showmessage('');
end;编译时会出错:(好像是分配内存的问题)
Incompatible types:'Integer' and 'Pointer'
关键是怎么样给CardID分配好内存API bool ReadMessage(int cardMessage[10]);
cardMessage[10]:为10个字节信息.
cardID:array [0..9] of integer;
begin
if ReadCardMessage(cardID) then
showmessage('');
end;
ReadCardMessage(cardID) 是取CarID的内容,这样是不行的
引用AleTiff()的话是很有道理的:这个函数的意义是:当你把 CardID 传入 ReadMessage 后,返回一个 Bool
值,表示成功或失败,其中并没有可以返回的其他参数.如果你确信CardID将
被重新填充后返回,那在你调用程序中必须为CardID分配好内存,而不是简单
地把数组名传递出去,因为你这样传递实际上只传出了CardID数组的第一个
元素.外部程序并不知道你的第一个后面还有9个空格,如果成功调用,也是违
反了内存管理——你无法越界读取
TMyIntArray = Array[0..9]of Integer;function ReadMessage(CardMessage:TMyIntArray):bool;stdcall;external 'TestDll.dll';var
cardID:TMyIntArray;
begin
if ReadCardMessage(cardID) then
showmessage('');
end;
这样好像不通用如果dll是你自己写的,
不如改写成:
API bool ReadMessage(int *cardMessage;int Len);//好像你那样声明[10]是没有用的!Delphi中这样声明:function ReadMessage(cardMessage:PInteger;Len:Integer):Boolean;var
CardId:Array[1..10]of Integer;
begin
FillChar(CardId,0,Length(CardId));//这句要不要看你的VC中是怎么实现的了
if ReadMessage(@CardId,Length(CardId)) then
begin
end;
end;