Visual c++ 将数组作为参数的结构传递给C++;dll问题

Visual c++ 将数组作为参数的结构传递给C++;dll问题,visual-c++,struct,dll,powerbuilder,Visual C++,Struct,Dll,Powerbuilder,我是一名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; co

我是一名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,cbrs1,cidrs1已经初始化

但是当我厌倦了用VC++调试dll时(我的verison是2013年的)

该项目在为数组变量赋值的代码行中被篡改,看起来它还未初始化

请比较我试过调试的PIC,变量不同,我从C++调用它,它工作得很好,

我不知道在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, cs1, cbrs1, cirs1, cidrs1, grs1);
clientinfo\u baseinfo\u ret\u struct cbrs1;
cbrs1.psn_no=新字符[50];
cbrs1.psn_cert_type=新字符[50];
cbrs1.certno=新字符[50];
cbrs1.psn_name=新字符[50];
cbrs1.gend=新字符[50];
cbrs1.naty=新字符[50];
cbrs1.brdy=新字符[50];
cbrs1.age=0.0;
clientinfo_insuinfo_ret_struct cirs1;
cirs1.inInforecordScont=0;
cirs1.balc=新双精度[5];
cirs1.insutype=新字符*[5];
cirs1.psn_type=新字符*[5];
cirs1.psn_insu_stas=新字符*[5];
cirs1.psn_insu_date=新字符*[5];
cirs1.paus_insu_date=新字符*[5];
cirs1.cvlserv_标志=新字符*[5];
cirs1.insuplc_admdvs=新字符*[5];
cirs1.emp_name=新字符*[5];
对于(int i=0;i<5;i++)
{
cirs1.balc[i]=0.0;
cirs1.insutype[i]=新字符[50];
cirs1.psn_type[i]=新字符[50];
cirs1.psn_insu_stas[i]=新字符[50];
cirs1.psn_insu_date[i]=新字符[50];
cirs1.paus_insu_date[i]=新字符[50];
cirs1.cvlserv_标志[i]=新字符[50];
cirs1.insuplc_admdvs[i]=新字符[50];
cirs1.emp_name[i]=新字符[50];
}
clientinfo_idetinfo_ret_struct cidrs1;
cidrs1.idetinForecordScont=0;
cidrs1.psn_idet_type=新字符*[5];
cidrs1.psn_type_lv=新字符*[5];
cidrs1.memo=新字符*[5];
cidrs1.begntime=新字符*[5];
cidrs1.endtime=新字符*[5];
对于(int i=0;i<5;i++)
{
cidrs1.psn_idet_type[i]=新字符[50];
cidrs1.psn_type_lv[i]=新字符[50];
cidrs1.memo[i]=新字符[50];
cidrs1.begintime[i]=新字符[50];
cidrs1.endtime[i]=新字符[50];
}
cirs1.inInforecordScont=0;
cidrs1.idetinForecordScont=0;
int result=getclientinfo(gs1、cs1、cbrs1、cirs1、cidrs1、grs1);

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

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

不过我已经完成了这个问题,兄弟,谢谢你