您的位置:程序门 -> delphi -> 语言基础/算法/系统设计



vc编写的dll函数接口,delphi调用出错,请指教


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


vc编写的dll函数接口,delphi调用出错,请指教[无满意答案结贴,结贴人:liongo_007]
发表于:2007-06-21 18:22:14 楼主
vc的函数接口:
int   unpackage(const   unsigned   char   *pdata,   int   ndatasize,
unsigned   short   *pobjid,   unsigned   char   *perrorcode,   unsigned   char   *pobjsize,   unsigned   char   *pobjbuffer,   unsigned   char   nobjbuffersize)


delphi中我编写的接口:
function   unpackage(pdata:   pbytearray;   ndatasize:   integer;
    var   pobjid:   word;   var   perrorcode:   byte;   var   pobjsize:   byte;   pobjbuffer:   pbytearray;
    nobjbuffersize:   byte):   integer;   stdcall;   external   'test.dll ';

实际调用过程中,总是出现错误,查不出什么原因,请各位大虾指教.
发表于:2007-06-21 21:50:201楼 得分:0
function   unpackage(const   pdata:   pbyte;  
                                            ndatasize:   integer;  
                                            var   pobjid:   word;  
                                            var   perrorcode:   byte;  
                                            var   pobjsize:   byte;  
                                            var   pobjbuffer:   byte;  
                                            nobjbuffersize:   byte):   integer;   cdecl;
发表于:2007-06-21 21:52:512楼 得分:0
特别要注意的是第一个参数要用对
发表于:2007-06-22 08:24:083楼 得分:0
不好意思,如果用
function   unpackage(const   pdata:   pbyte;  
                                            ndatasize:   integer;  
                                            var   pobjid:   word;  
                                            var   perrorcode:   byte;  
                                            var   pobjsize:   byte;  
                                            var   pobjbuffer:   byte;  
                                            nobjbuffersize:   byte):   integer;   cdecl;
该方式似乎有点问题.
还有就是做为指针,没什么改变不改变的,加不加const一样的.
而且这样定义,我传入的数据就只能是一个byte了.我需要的传入一串数据.
ndatasize   和   nobjbuffersize   就是指定数据区域长度的,使用前使用
getmem开辟空间.
发表于:2007-06-22 09:18:474楼 得分:0
这说明你对delphi的数组指针没有领会
指向第一个元素的指针,才是数组的指针
对于静态数组,@a和@a[0]没有区别
但是对于动态数组,必须得传@a[0]

var
    a   :   array   of   byte;
    ndatasize   :   integer
begin
    setlength(a,ndatasize);

    unpackage(@a[0],ndatasize......);

发表于:2007-06-22 10:15:055楼 得分:0
perrorcode,pobjsize,pobjbuffer这三个参数原来是指向char的指针,你的d函数怎么成了byte了,也定义成pbytearray。其他的我看不出什么问题。传递pbytearray是没有问题的,因为pbytearray是d自定义的一个开放数组,可以作为参数直接传递。
发表于:2007-06-22 10:20:376楼 得分:0
http://www.drbob42.com/delphi/headconv.htm
发表于:2007-06-22 10:45:287楼 得分:0
1、unsigned   char对应的是delphi里的byte
2、delphi的var参数,传递的是指针,因此var   byte     ==   unsigned   char*  
3、
    pbytearray   =   ^tbytearray;
    tbytearray   =   array[0..32767]   of   byte;

pbytearray是静态数组的指针,与@tbytearray[0]是同一个东西

对于动态数组,@tbytedynarray和@tbytedynarray[0]不是同一个东西

4、对于c\c++,数组的指针是指向第一个元素的指针,
如果delphi用的是动态数组的话,也得传递指向第一个元素的指针

5、delphi里开放数组参数和动态数组语法上很像,但指的不是一个东西
开放数组参数实际上还是静态数组

note

the   syntax   of   open   array   parameters   resembles   that   of   dynamic   array   types,   but   they   do   not   mean   the   same   thing.


快速检索

最新资讯
热门点击