vc 下写了如下动态库的函数(Com形式),其中一函数如下:
SetPicture(pDataArea->Buf);
//其中:pDataArea->Buf为:BYTE Buf[THE_SIZE];在delphi中引用时,用Import type Library自动生成了一个单元,其中:
...
PByte1 = ^Byte; {*}
...
function SetPicture(var pBuf: Byte): Integer; safecall;调用是的方式为:
...
pBitmapImage : PByte1;
...
if SetPicture(pBitmapImage^)=1 then showmessage('加载正确!');
//************************************************************
这样调用没有程序错误,但是我觉得这显然不对,因为dll中的本意是传入指向字节的指针
为32位,而非传入8位字节。
所以我将delphi自动完成的单元中改为如下的声明方式:
...
PByte1 = ^Byte; {*}
...
function SetPicture(var pBuf: PByte1): Integer; safecall;
调用时:
if SetPicture(pBitmapImage^)=1 then showmessage('加载正确!');结果运行出现内存地址错误!
改用Buffer: array[0..2028] of byte;
...
if SetPicture(Buffer[0])=1 then showmessage('加载正确!');
也不行!求高人指点迷津!!! 对于delphi调用vc Dll函数,参数传地址的方式如何完成!!!
SetPicture(pDataArea->Buf);
//其中:pDataArea->Buf为:BYTE Buf[THE_SIZE];在delphi中引用时,用Import type Library自动生成了一个单元,其中:
...
PByte1 = ^Byte; {*}
...
function SetPicture(var pBuf: Byte): Integer; safecall;调用是的方式为:
...
pBitmapImage : PByte1;
...
if SetPicture(pBitmapImage^)=1 then showmessage('加载正确!');
//************************************************************
这样调用没有程序错误,但是我觉得这显然不对,因为dll中的本意是传入指向字节的指针
为32位,而非传入8位字节。
所以我将delphi自动完成的单元中改为如下的声明方式:
...
PByte1 = ^Byte; {*}
...
function SetPicture(var pBuf: PByte1): Integer; safecall;
调用时:
if SetPicture(pBitmapImage^)=1 then showmessage('加载正确!');结果运行出现内存地址错误!
改用Buffer: array[0..2028] of byte;
...
if SetPicture(Buffer[0])=1 then showmessage('加载正确!');
也不行!求高人指点迷津!!! 对于delphi调用vc Dll函数,参数传地址的方式如何完成!!!
function SetPicture(pBuf: PByte): Integer; safecall;//调用时
var
Buffer: array[0..2028] of byte;
begin
if SetPicture(@Buffer[0])=1 then showmessage('加载正确!');
end;//请测试看看~~
为32位,而非传入8位字节。”哥哥,dll中的本意是传入BYTE而不是传入指针!
Delphi自动生成是正确的,呵呵。
//*******************************************请问如何个写法?麻烦指教!
SetPicture(pDataArea->Buf);
//其中:pDataArea->Buf为:BYTE Buf[THE_SIZE];该函数为一个接口的成员函数。
不就是
BYTE数组吗?Buf[THE_SIZE]不是BYTE?
是什么?
例如:function func1( var i:Integer ):boolean;
编译器实际传递的是@i。
BYTE Buf 的话传递的是byte但BYTE Buf[The_Size] 的话传递的是数组的首指针,而非byte。我用你说的 @Buffer[0]取得的地址不知为什么不对,函数运行仍然不正确。这问题困扰了我好久真麻烦
例如:function func1( var i:Integer ):boolean;
编译器实际传递的是@i。
既然加了VAR,就不能再用变量地址了!
你改为:function SetPicture(var pBuf: PByte1): Integer; safecall;//参数变成了指针然后
SetPicture(pBitmapImage^)----肯定不行,实际参数是BYTE;
SetPicture(Buffer[0])----肯定也不行,实际参数还是BYTE;
SetPicture(@Buffer[0])----肯定还是不行,形式参数是变参(var),实际参数是一个常量;
如果把声明改为:
function SetPicture(pBuf: PByte1): Integer; safecall;//去掉var
那么,SetPicture(@Buffer[0])----就可以了!
可是为什么要这么麻烦?根本不用改的!
想通了!谢谢!是我自己绕了一大圈!