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函数,参数传地址的方式如何完成!!!

解决方案 »

  1.   

    //声明时
    function SetPicture(pBuf: PByte): Integer; safecall;//调用时
    var
      Buffer: array[0..2028] of byte;
    begin
      if SetPicture(@Buffer[0])=1 then showmessage('加载正确!');
    end;//请测试看看~~
      

  2.   

    “我觉得这显然不对,因为dll中的本意是传入指向字节的指针
    为32位,而非传入8位字节。”哥哥,dll中的本意是传入BYTE而不是传入指针!
    Delphi自动生成是正确的,呵呵。
      

  3.   

    它还要传入一个返回地址,也就是一个参数和一个返回 2 * 32 Bit = 8 Byte
      

  4.   

    它还要传入一个返回地址,也就是一个参数和一个返回 2 * 32 Bit = 8 Byte
    //*******************************************请问如何个写法?麻烦指教!
      

  5.   

    调用方式就是上面写的
    SetPicture(pDataArea->Buf);
    //其中:pDataArea->Buf为:BYTE Buf[THE_SIZE];该函数为一个接口的成员函数。
      

  6.   

    BYTE Buf[THE_SIZE]
    不就是
    BYTE数组吗?Buf[THE_SIZE]不是BYTE?
    是什么?
      

  7.   

    关于搂主说的参数传地址的方式:我个人认为,Delphi的变量参数(VAR)实际传递的就是参数的地址。
    例如:function func1( var i:Integer ):boolean;
    编译器实际传递的是@i。
      

  8.   

    flyinwuhan(★★★★★高手)(CSDN提醒:假的!) 在vc中 
    BYTE Buf 的话传递的是byte但BYTE Buf[The_Size] 的话传递的是数组的首指针,而非byte。我用你说的 @Buffer[0]取得的地址不知为什么不对,函数运行仍然不正确。这问题困扰了我好久真麻烦
      

  9.   

    我个人认为,Delphi的变量参数(VAR)实际传递的就是参数的地址。
    例如:function func1( var i:Integer ):boolean;
    编译器实际传递的是@i。
    既然加了VAR,就不能再用变量地址了!
      

  10.   

    如果你非要用地址,试试把声明中的VAR去掉看看。
      

  11.   

    原来是:function SetPicture(var pBuf: Byte): Integer; safecall;
    你改为: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])----就可以了!
    可是为什么要这么麻烦?根本不用改的!
      

  12.   

    flyinwuhan(★★★★★高手)(CSDN提醒:假的!) 你讲的有道理!
    想通了!谢谢!是我自己绕了一大圈!