Visual c++ 将数组作为参数的结构传递给C++;dll问题
我是一名PB 12.5用户,我试图调用一个由VC++编写的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
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传递给调用的,所以如果您认为使用它没有意义,那么还是试试吧。当它开始工作时,我总是感到惊讶。祝你好运。不过我已经完成了这个问题,兄弟,谢谢你