Hello All,
I have a Borland C++ generated DLL, which Iam using with VC++, I managed to generate the .Lib file compatible with VC++.
Now my programs compiles and run, after that I get run-time error as follows:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
while Debugging my program here is the situation:
- The program crashes on the statement after where I call the function exported by the DLL.
- The value returned by the function is correct.
Here is what I did to convert the .Lib file of the DLL from Borland C++ to VC++.
I have generated a .hpp file from the pascal code for 2 functions to be exported by my DLL.
the files content are as follows:
fisprob.hpp
// Borland C++ Builder
// Copyright (c) 1995, 2002 by Borland Software Corporation
// All rights reserved
// (DO NOT EDIT: machine generated header) 'fisprob.pas' rev: 6.00
#ifndef fisprobHPP
#define fisprobHPP
namespace Fisprob
{
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE float __fastcall FISPRO(float VARI, int NUME, int DENO);
} /* namespace Fisprob */
using namespace Fisprob;
chiprodouble.hpp
// Borland C++ Builder
// Copyright (c) 1995, 2002 by Borland Software Corporation
// All rights reserved
// (DO NOT EDIT: machine generated header) 'chiprodouble.pas' rev: 6.00
#ifndef chiprodoubleHPP
#define chiprodoubleHPP
//-- user supplied -----------------------------------------------------------
namespace Chiprodouble
{
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE void __fastcall CHIPROB(double X, int DF, double &PRO);
} /* namespace Chiprodouble */
using namespace Chiprodouble;
then I created a file named: chaidinterface.h as follows:
#ifndef ChaidInterfaceH
#define ChaidInterfaceH
//--------------------------------------------------------------------------
#ifdef __cplusplus /* if in a C++ program */
extern "C"
#endif
void __declspec(dllimport) WINAPI chiprobLib(double, int, double &);
float __declspec(dllimport) WINAPI fisprobLib(float, int, int);
#endif
after building my DLL, I issued the command:
- impdef chaidlib.def chaidlib.dll to generate the DEF file.
my def file looks like this:
LIBRARY CHAIDLIB.DLL
EXPORTS
@@Chaidinterface@Finalize @10 ; __linkproc__ Chaidinterface::Finalize
@@Chaidinterface@Initialize @9 ; __linkproc__ Chaidinterface::Initialize
@Chiprodouble@CHIPROB$qqrdird @1 ; __fastcall Chiprodouble::CHIPROB(double, int, double&)
@Chiprodouble@Finalization$qqrv @2 ; __fastcall Chiprodouble::Finalization()
@Chiprodouble@initialization$qqrv @3 ; __fastcall Chiprodouble::initialization()
@Fisprob@FISPRO$qqrfii @4 ; __fastcall Fisprob::FISPRO(float, int, int)
@Fisprob@Finalization$qqrv @5 ; __fastcall Fisprob::Finalization()
@Fisprob@initialization$qqrv @6 ; __fastcall Fisprob::initialization()
@fisprobLib$qfii @8 ; fisprobLib(float, int, int)
___CPPdebugHook @11 ; ___CPPdebugHook
_chiprobLib @7 ; _chiprobLib
I channged the last 3 lines as follows:
fisprobLib @8 ; fisprobLib(float, int, int)
___CPPdebugHook @11 ; ___CPPdebugHook
chiprobLib @7 ; _chiprobLib
then issue the command: lib /DEF:chaidlib2.def /out:chaidlib.lib
to generate the chaidlib.lib to be used in VC++.
Any Suggestions....
Thanks in advance.