FoxPro的c ++ dll

时间:2012-12-12 12:03:31

标签: delphi visual-c++ delphi-2007 visual-foxpro

我有用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

中声明整数f8      

aLength = 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)

1 个答案:

答案 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;