我有用FoxPro编译的程序调用d1.dll函数。 d1.dll是用Delphi 2007开发的。我需要开发d1.dll,用c ++替换现有的d1.dll。经过几次测试后,FoxPro应用程序在随机位置崩溃,并发出随机消息,如:
致命错误:异常代码= C0000005 @ 2012.12.12 11:33。错误日志 file:C:\ Program Files \ Common Files \ Microsoft Shared \ VFP \ vfp9rerr.log
或
没有任何内存执行some_function
我已经删除了c ++ dll中的所有代码,只留下了原始dll通常返回的一些测试值。但这没有用。声明和变量使用可能有问题。
我根据在主Fox Pro程序中声明d1.dll功能的方式构建Fox Pro小测试程序。不幸的是它没有崩溃。我从IDE运行它,而我的程序从可执行程序运行,但我不认为这是原因。可能有som发行者注意变量的使用。
可能有什么问题?
Delphi和C ++中的函数声明:
C ++
extern“C”int _stdcall f1(unsigned char * aError)
extern“C”int_stdcall f2(char * txt,unsigned char * aError)
extern“C”int _stdcall f3(unsigned char * aError,char * aAnswer)
extern“C”int _stdcall f4(unsigned char * aError)
extern“C”int _stdcall f5( char *描述符, char x, 双pr, char aError, 双倍的, char kd, char * pd)extern“C”int _stdcall f6(char * acomment_string,unsigned char * aError)
extern“C”int _stdcall f7(unsigned char tender_number,double amount, unsigned char * aError)
extern“C”int _stdcall f8(unsigned char * aError)
DELPHI 2007
function f1(var aError:byte):bool; STDCALL; function f2(txt:pchar; var aError:byte):bool; STDCALL;
function f3(var aError:byte; adata:pchar):bool; STDCALL;
function f4(var aError:byte):bool; STDCALL;
function f5(descriptor:pchar; x:byte; pr:double; var aError:byte; qtity:double; kd:pchar; pd:pchar):bool; STDCALL;
function f6(non_fiscal_string:pchar; var aError:byte):bool; STDCALL;
function f7(tender_number:byte; amount:double; var aError:byte):bool; STDCALL;
function f8(var aError:byte):bool; STDCALL;
FoxPro测试程序
的FoxPro FoxPro中
在c:\ d1.dll string err
中声明整数f1在c:\ d1.dll string txt,string err
中声明整数f2在c:\ d1.dll string err,string rec_nr
中声明整数f3在c:\ d1.dll string err
中声明整数f4在c:\ d1.dll string descr,integer x,double pr中声明整数f5 ,string err,double qty,string kd,string pd
在c:\ d1.dll字符串中声明整数f6 non_fiscal_string,string err
在c:\ d1.dll整数招标中声明整数f7,双倍金额,字符串 ERR
在c:\ d1.dll string err
中声明整数f8aLength = 2048
aCardinal = 4
ff_log =空间(aLength)
rec_nr = SPACE(aCardinal)
fiscal_rec_nr = SPACE(aCardinal)
serial_nr = SPACE(aLength)
status_bytes = SPACE(aCardinal)
descr =“descr”
x = 1 pr = 123 t = 0 t = f2(descr,@ kl)
t = f1(@kl)
Thisform.text1.Value=ff_log
t = f2(descr,@ kl)
t = f4(@kl)
t=f3(@kl,@ff_log) t=GetStatus(@kl,rec_nr,fiscal_rec_nr,serial_nr,status_bytes)
t = f5(descr,x,pr,@ kl,1,“”,“”)
t = f2(descr,@ kl)
t = f2(descr,@ kl)
T = F6(DESCR,@ KL)
T = F8(@kl)
T = F7(1100,@ KL)
答案 0 :(得分:1)
1)编辑问题 - 使用delphi版本添加TAG。它不仅礼貌而且在这里可能至关重要。
2)你在FoxPro代码中看到“字符串”引用 - 这可能意味着你的char*
听到的是C字符串(又名ASCIIZ字符串,又名零终止字符串)
他们需要一些特殊的待遇。尝试将它们作为PAnsiChar传递 - 例如 - function f1(const aError: PAnsiChar):bool; stdcall;
阅读有关Delphi PChar类型的帮助 - 但总是在固定DLL API中使用PAnsiChar
:PChar在不同的Delphi版本中是不明确的 - 映射到PAnsiChar或PWideChar
3)返回正确的数据类型。不是布尔。
在c:\ d1.dll字符串txt中声明整数f2 ,字符串错误
extern“C” int _stdcall f2 (char * txt,unsigned char * aError)
函数 f2 (const txt,aError:PAnsiChar):整数; STDCALL;