0
votes

I have program compiled with FoxPro that calls d1.dll functions. d1.dll was developed with Delphi 2007. I need to develop d1.dll that will replace existing one using c++. After several tests FoxPro application crashes in random places with random messages like:

Fatal error: Exception code=C0000005 @ 2012.12.12 11:33. Error log file: C:\Program Files\Common Files\Microsoft Shared\VFP\vfp9rerr.log

or

No enaugh memory execute some_function

I have removed all code from c++ dll and left just some test values that original dll usually returns. But this does't helps. Probably something is wrong with declaration and variable usage.

I have build Fox Pro small test program according to manner of declaring d1.dll function in main Fox Pro program. Unfortunately it doesn't crash. I run it from IDE while mine program runs from executable, but I don't think this is reason. Probably there is som issuersregarding variable usage.

What might be problem?

Function declaration in Delphi and 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* descriptor, char x, double pr, char aError, double qtity, 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 test program

FoxPro FoxPro

declare integer f1 in c:\d1.dll string err

declare integer f2 in c:\d1.dll string txt,string err

declare integer f3 in c:\d1.dll string err, string rec_nr

declare integer f4 in c:\d1.dll string err

declare integer f5 in c:\d1.dll string descr, integer x, double pr ,string err, double qty, string kd, string pd

declare integer f6 in c:\d1.dll string non_fiscal_string,string err

declare integer f7 in c:\d1.dll integer tender, double amount ,string err

declare integer f8 in c:\d1.dll string err

aLength=2048

aCardinal=4

ff_log=space(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(1,100,@kl)

1
When quoting error messages always paste the literal text, don't rewrite from memory. You never know what you may be leaving behind (and it also saves you from embarrassing typos.) - Leonardo Herrera
-1 You must fix the formatting. Use code blocks rather than quotes. Note the italics in the question at the moment. Those are not what you intend I am sure. Also, how do you expect us to debug this? We can't see any of the code!! - David Heffernan

1 Answers

1
votes

1) edit question - add the TAG with your delphi version. it is not only polite but might be critical here.

2) you see "string" references in FoxPro code - that probably means your char* hear is C-string (aka ASCIIZ string, aka zero-terminated strings)

They need kinda special treatment. Try passing them as PAnsiChar - like - function f1(const aError: PAnsiChar):bool; stdcall;

Read help about Delphi PChar type - but always use PAnsiChar in fixed DLL API: PChar is ambiguous in different Delphi versions - mapped to either PAnsiChar or PWideChar

3) return correct datatype. Not bool.

declare integer f2 in c:\d1.dll string txt, string err
extern "C" int _stdcall f2(char *txt,unsigned char *aError)
function f2(const txt, aError: PAnsiChar): integer; stdcall;