问题描述
我是 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)
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已经初始化
但是当我厌倦了在 VC++ 中调试 dll 时(我的版本是 2013 年)
该项目在代码行中被删除,它将值分配给数组变量,它看起来像是未初始化
请比较下面我尝试调试的图片,变量不同,我从 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,grs1);
即使我尝试将 PB 升级到 2019 并升级我的项目,但它不起作用,可能是我做错了什么但我仍然不知道,有什么想法吗?
解决方法
我已经很久没有处理这个问题了,但在查看一些旧的 PB 源代码时,我记得将 API 调用导入到 PB 是多么令人沮丧。我记得的是,大部分内容都是通过 ref 传递给调用的,所以如果您认为使用它没有意义,请尝试一下。当它开始工作时,我总是感到惊讶。祝你好运。