将带有数组的结构作为参数传递给 C++ dll 问题中的函数

问题描述

我是 PB 12.5 用户,我试图调用一个由 VC++ 编写的 dll 函数,例如:

typedef struct clientinfo_struct{
   const char* mdtrt_cert_type;
   const char * mdtrt_cert_no; 
   const char * card_sn; 
   const char * begntime;
   const char * psn_cert_type; 
   const char * certno; 
   const char * psn_name;
}clientinfo_struct;

typedef struct clientinfo_baseinfo_ret_struct{
    char * psn_no; 
    char * psn_cert_type; 
    char * certno; 
    char * psn_name;
    char * gend; 
    char * naty; 
    char * brdy; 
    double age;
    }clientinfo_baseinfo_ret_struct;

   typedef struct clientinfo_insuinfo_ret_struct{
        int insuinforecordscount; 
        double * balc; 
        char ** insutype; 
        char ** psn_type;
        char ** psn_insu_stas;
        char ** psn_insu_date;
        char ** paus_insu_date;
        char ** cvlserv_flag;
        char ** insuplc_admdvs;
        char ** emp_name;

  }clientinfo_insuinfo_ret_struct;

  typedef struct clientinfo_idetinfo_ret_struct{
        int  idetinforecordscount; 
        char ** psn_idet_type; 
        char ** psn_type_lv; 
        char ** memo;
        char ** begntime; 
        char ** endtime;
  }clientinfo_idetinfo_ret_struct;



int getclientinfo(general_struct & gs,clientinfo_struct & cs,clientinfo_baseinfo_ret_struct & cbrs,clientinfo_insuinfo_ret_struct & cinsurs,clientinfo_idetinfo_ret_struct & cidenrs,general_ret_struct & grs)

我试图从PB调用这个函数,它不起作用,代码如下

我在全局外部函数部分声明了函数

   function long  getclientinfo(general_struct   gs,&
    clientinfo_struct   cs,&
    ref clientinfo_baseinfo_ret_struct   cbrs,&
    ref clientinfo_insuinfo_ret_struct   cinsurs,&
    ref clientinfo_idetinfo_ret_struct   cidenrs,&
    ref general_ret_struct   grs) &
    LIBRARY "dgnewsbsapi.dll"  Alias for 'getclientinfo;Ansi'

我尝试使用它

  clientinfo_baseinfo_ret_struct cbrs1
 
cbrs1.psn_no =space(35)
cbrs1.psn_cert_type =space(10)
cbrs1.certno = space(55)
cbrs1.psn_name = space(55)
cbrs1.gend = space(10)
cbrs1.naty =space(10)
cbrs1.brdy = space(30)
cbrs1.age = 0.0

clientinfo_insuinfo_ret_struct cirs1

long ll_row
 

 
 
 cirs1.insuinforecordscount=0
 
  //try to initialize cidrs1
 
 for ll_row=1 to 50
     cirs1.balc [ll_row]= 0.0;
    cirs1.insutype [ll_row]= space(10);
    cirs1.psn_type [ll_row]= space(10);
    cirs1.psn_insu_stas[ll_row] =  space(10);
    cirs1.psn_insu_date[ll_row] = space(30);
    cirs1.paus_insu_date[ll_row] =  space(30);
    cirs1.cvlserv_flag[ll_row] = space(10);
    cirs1.insuplc_admdvs[ll_row] = space(10);
    cirs1.emp_name[ll_row] =  space(200);
    
next


    

 string ls_psn_idet_type[50],ls_psn_type_lv[50]
 string ls_memo[50],ls_begntime[50],ls_endtime[50]
  //try to initialize cidrs1
 for ll_row=1 to 50
    
    ls_psn_idet_type[ll_row] =space(6);
    ls_psn_type_lv[ll_row] = space(6);
    ls_memo[ll_row] = space(500);
    ls_begntime[ll_row] = space(30);
    ls_endtime[ll_row] =space(30);
    
next




clientinfo_idetinfo_ret_struct cidrs1
cidrs1.idetinforecordscount = 0

 //try to initialize cidrs1
  for ll_row=1 to 50
    cidrs1.psn_idet_type[ll_row] =space(6);
    cidrs1.psn_type_lv[ll_row] = space(6);
    cidrs1.memo[ll_row] = space(500);
    cidrs1.begntime[ll_row] = space(30);
    cidrs1.endtime[ll_row] =space(30);
 next


 


 ll_result = getclientinfo(gs1,cs1,cbrs1,cirs1,cidrs1,grs1)

调用这个函数的时候崩溃了,我尝试在PB中调试,发现cbrs1,cidrs1已经初始化

enter image description here

enter image description here

但是当我厌倦了在 VC++ 中调试 dll 时(我的版本是 2013 年)

该项目在代码行中被删除,它将值分配给数组变量,它看起来像是未初始化

enter image description here

请比较下面我尝试调试的图片,变量不同,我从 C++ 调用它,它工作正常,

enter image description here

我不知道 PB 中的 C++ 等价于什么代码,这个 C++ 对我有

 clientinfo_baseinfo_ret_struct cbrs1;
 
 cbrs1.psn_no = new char[50];
 cbrs1.psn_cert_type = new char[50];
 cbrs1.certno = new char[50];
 cbrs1.psn_name = new char[50];
 cbrs1.gend = new char[50];
 cbrs1.naty = new char[50];
 cbrs1.brdy = new char[50];
 cbrs1.age = 0.0;

 clientinfo_insuinfo_ret_struct cirs1;
 cirs1.insuinforecordscount = 0;
 cirs1.balc = new double[5];
 cirs1.insutype = new char*[5];
 cirs1.psn_type = new char*[5];
 cirs1.psn_insu_stas = new char*[5];
 cirs1.psn_insu_date = new char*[5];
 cirs1.paus_insu_date = new char*[5];
 cirs1.cvlserv_flag = new char*[5];
 cirs1.insuplc_admdvs = new char*[5];
 cirs1.emp_name = new char*[5];

 for (int i = 0; i < 5; i++)
 {
    cirs1.balc[i] = 0.0;
    cirs1.insutype[i] = new char[50];
    cirs1.psn_type[i] = new char[50];
    cirs1.psn_insu_stas[i] = new char[50];
    cirs1.psn_insu_date[i] = new char[50];
    cirs1.paus_insu_date[i] = new char[50];
    cirs1.cvlserv_flag[i] = new char[50];
    cirs1.insuplc_admdvs[i] = new char[50];
    cirs1.emp_name[i] = new char[50];
 }



 clientinfo_idetinfo_ret_struct cidrs1;
 cidrs1.idetinforecordscount = 0;
 cidrs1.psn_idet_type = new char*[5];
 cidrs1.psn_type_lv = new char*[5];
 cidrs1.memo = new char*[5];
 cidrs1.begntime = new char*[5];
 cidrs1.endtime = new char*[5];

 for (int i = 0; i < 5; i++)
 {
 
    cidrs1.psn_idet_type[i] = new char[50];
    cidrs1.psn_type_lv[i] = new char[50];
    cidrs1.memo[i] = new char[50];
    cidrs1.begntime[i] = new char[50];
    cidrs1.endtime[i] = new char[50];
 }


 cirs1.insuinforecordscount = 0;
 cidrs1.idetinforecordscount = 0;


int result = getclientinfo(gs1,grs1);

即使我尝试将 PB 升级到 2019 并升级我的项目,但它不起作用,可能是我做错了什么但我仍然不知道,有什么想法吗?

解决方法

我已经很久没有处理这个问题了,但在查看一些旧的 PB 源代码时,我记得将 API 调用导入到 PB 是多么令人沮丧。我记得的是,大部分内容都是通过 ref 传递给调用的,所以如果您认为使用它没有意义,请尝试一下。当它开始工作时,我总是感到惊讶。祝你好运。