需要调用一个c的dll,有这样一个函数:
int fun2(const char *filename, byte **data, int *length)其中,第一个参数是文件路径,dll接收该参数后处理文件,并将结果放在data中,length中是data的字符长度。现在我想问的是在delphi中如何来声明这个函数,我是这样写的,但是有问题:
Function fun2(filename:pchar ; var data:pchar ; var length:integer ) : integer ;  stdcall ; external 'f.dll' ;请达人指点一下,正确的写法是什么?

解决方案 »

  1.   


    我是这样理解的,var好像是引用方式调用吧,貌似传的是地址,这样相当于一个*了;然后有char*的都用的pchar好像是没问题的,这样能不能表示原型中的2个星呢?这个地方我的确有点晕
      

  2.   

    type
      Test = ^PChar;
    int fun2(const char *filename, byte **data, int *length) 
    funtion fun2(const filename: pchar; data: Test; Length: pinteger): int;
    试下这样会不会错?
      

  3.   

    int fun2(const char *filename, byte **data, int *length) 
    翻译后变为
    function Fun2(const filename: pchar;var data: pointer;var length: pInteger);
    楼上的虽然接近但是是错的,
    Delphi 深度传值必须用Var来替换
    一般我们也会把var data: pointer
    声明成Tstream,TstreamMem,等但是主要还是考虑到程序调用后是否创建该实例,所以还是采用指针传递.
    Data := nil;
    length := 0;
    就可以了,
    同时加上
    Try 
     exceptEnd
    保护起来,以免出错
      

  4.   

    首先,我用sanguomi的
    试了一下,偶尔会好用几次之后,然后就一直报错了。然后又使用了yhcslg 的方法进行了测试现在能够正常调用了。
    但是很奇怪的是,并不是100%的正常返回,有时调用dll后整个程序会直接关闭,这个是调用的问题?还是dll本身的问题?
      

  5.   

    再就是,用yhcslg 的方法后,我取pointer所指内容时老是报错,有什么注意事项吗?这个dll用vc进行测试时出了个问题,vc用unicode编译,结果读data的值不正确(主要是中文),改成非unicode后就正常了,说明该dll不是unicode编译的,delphi里有关于编码的选项吗???