一DLL需要供其他开发工具调用:
函数声明:
  一
  int checkname(userinfo* usrInfo, workinfo* winfo, char* msg);//基于C++`
对应Delphi里这样声明:
   type
   userinfo = record
      userid: integer;
      username: array[0..20] of char;  //pchar    用字符数组可否接收char*数据,即客户传入char* username这样的数据可否正常接收
      userpassword: array[0..20] of char;  //pchar  同上
   end;
   puserinfo = ^userinfo;
   workinfo = record
     workid: integer;
     workaddr: array[0..140] of char;//同上
     workexp: array[0..140] of char;//同上
   end;
   pworkinfo = ^workinfo;
   
   function checkname(puInfo: puserinfo; pwkinfo: pworkinfo; msg: pchar): integer; stdcall;
   1.这个函数对应Delphi里的声明是否有问题?
   2.如果字符数组不能满足上面的要求,那么应该需要将char*(对应delphi里应该是pchar)转换成string或其他Delphi可以进
   行操作的数据类型(比如转成另一个结构,进行网络传输)
   3.在编写过程中还需注意些什么?
    二
    int getList(userinfo* usrInfo, usercj[] usrcj, char* msg)  ;
对应Delphi里这样声明:
    type  
      userinfo = record
      userid: integer;
      username: array[0..20] of char;  //pchar    用字符数组可否接收char*数据,即客户传入char* username这样的数据可否正常接收
      userpassword: array[0..20] of char;  //pchar  同上
   end;
   puserinfo = ^userinfo;   
   usercj = record//用户成绩       举例
     userid: integer;//传入
     cjtype: array[0..20] of char;//同上   传出此值
     cjname: array[0..20] of char;//同上  传出此值
     cjDetail: double;//        传出
   end;
   
   function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar);
   1.var usrcj: array of usercj 进来的值应该是引用,usercj[] usrcj c++里对数组,如同指针操作,这样声明对否??不对,应该如何做?
   2.delphi dll中,对动态数组做为参数及返回值有一个规定即在工程单元里须加入shareMem单元,不知还有什么其他需要注意的地方?
   3.同一里的2小点
 由于这方面的经验不是很丰富,请各位大人提宝贵意见!!谢谢!!!

解决方案 »

  1.   

    你说了那么多,其实要其它工具能调用delphi编的dll,应该注意:
    1.如果要传递或返回字符串类型,用pchar代替string;建议不要使用动态数组;
    2.导出的函数用stdcall调用.
    3.传递记录(C++的结构)最好加packed关键字;
    4.不要返回任何TObject的派生类
      

  2.   

    不用sharemem的话,可以看看fastMM4,说是比较好点
      

  3.   

    1.因为对客户公布的函数标准就是象我提到的那样,char* 型的数据应该可以用array[0..20] of char 这样的数组进行接收吧!!!??
    这个当然可以.
    =============================================
    我试了一下,在Dll中定义一个简单的函数
            type
         userinfo = record
          userid: integer;
          username: array[0..20] of char;  
          userpassword: array[0..20] of char;     
         end;
         puserinfo = ^userinfo;
    procedure test(puInfo: puserInfo); stdcall;
    begin
      puinfo.userid := 111;
      puinfo.username := 'testname';
      puinfo.userpassword := 'testpwd';
    end;exports
      test;主调函数:
         type
         userinfo = record
          userid: integer;
          username: pchar;  
          userpassword: pchar;     
         end;
         puserinfo = ^userinfo;
         因为按照函数的定义为char* ,对应delphi应该为pchar,所以传入以上结构数据,由于手头
         没有其他开发环境,不能对vb,vc,pb等测试
         
         procedure mytest();
           var 
             p: puserinfo;
           begin
             getmem(p, sizeof(userinfo));
             test(p);
             ShowMessage(p^.username + '   ' + p^.userpassword);//运行这句时报错
             freemem(p);
           end;
    结论:
        简单测试后,发现如果定义为char*的数据,用char[0..n] of char 这种方式接收可能有问题,不知道大家有什么意见!!!!
         2.需要传入的参数是结构数组,而这个结构数组还可能不是定长的,动态数组,而delphi
     dll对动态数组做为参数的导出函数好象有些问题,上网查资料而来!!如果是结构数组的话,你可以传结构数组指针呀.
    至于你说的动态数组,那可以做一个尾标记,可以在VC里用WHILE读,读到结束标志为止.
    这个我没用过,只是这么想的,我们传VC的数组都是固定的(便于初始化和最后释放),(一般谁申请的请释放)=============================================================
    首先说一下,下面这个函数
    int getList(userinfo* usrInfo, usercj[] usrcj, char* msg);
    由于c++里的数组操作,等同于指针,即知道首地址后,通过指针对其操作,c++忘记了许多,不知道有没有错!!
    上面的函数,对应delphi里应该如何写???
    function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar);
    对应该此函数有何问题??
    今天进行了一下测试
    调用端:
       function getList(puInfo: puserinfo;  usrcj: array of usercj{此处去掉var}; msg: pchar): integer; stdcall; extenal 'test.dll';
      如果调用的Dll中的
       function getList(puInfo: puserinfo; var usrcj: array of usercj; msg: pchar): integer;
       
       结果还是可以把usrcj的值返回给调用端(传递的地址);
    请大家多提一下这方面的意见,谢谢!!  
      

  4.   

    http://www.delphibbs.com/delphibbs/DispQ.asp?LID=3446710
      

  5.   

    to sxqwhxq(步青云) :
    你说了那么多,其实要其它工具能调用delphi编的dll,应该注意:
    1.如果要传递或返回字符串类型,用pchar代替string;建议不要使用动态数组;
    ==================================================================
    需要传递或返回字符串,清楚string在dll中有问题,但由于pchar的不定长特性,传进来的结构由于还需进行网络的传输,即通过record这种形式传送到服务器端 ,由于pchar不是定长的,所以不可以,考虑将传进来的参数能过一个转换函数,转到char[0..100] of char 这种类型.
    2.导出的函数用stdcall调用.
    ==================================================================
    已添加此标识
    3.传递记录(C++的结构)最好加packed关键字;
    ==================================================================
    packed是对位结构,考虑加此关键字
    4.不要返回任何TObject的派生类
    ==================================================================
    此应用中不会返回这种类to luxuewei5214(小卢) 
       
    不用sharemem的话,可以看看fastMM4,说是比较好点
    ==================================================================
    昨天上网找到这个类,fastsharemem-2.10,考虑将sharemem包去掉谢谢二位的回答!!  
     
      

  6.   

    主要是下面两点.导出的函数用stdcall
    用基本类型的数据.