d1.dll 関数を呼び出す FoxPro でコンパイルされたプログラムがあります。d1.dll は Delphi 2007 で開発されました。C++ を使用して既存の d1.dll を置き換える d1.dll を開発する必要があります。いくつかのテストの後、FoxPro アプリケーションがランダムな場所でクラッシュし、次のようなランダムなメッセージが表示されます。
致命的なエラー: 例外コード = C0000005 @ 2012.12.12 11:33。エラー ログ ファイル: C:\Program Files\Common Files\Microsoft Shared\VFP\vfp9rerr.log
また
十分なメモリがありません some_function を実行します
C++ dll からすべてのコードを削除し、元の dll が通常返すいくつかのテスト値だけを残しました。しかし、これは役に立ちません。おそらく、宣言と変数の使用法に問題があります。
メインの Fox Pro プログラムで d1.dll 関数を宣言する方法に従って、Fox Pro の小さなテスト プログラムをビルドしました。残念ながら、それはクラッシュしません。私のプログラムが実行可能ファイルから実行されている間にIDEから実行しますが、これが理由ではないと思います。おそらく、変数の使用に関していくつかの発行者がいます。
何が問題になる可能性がありますか?
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* 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 入札番号, double amount, unsigned char *aError)
extern "C" int _stdcall f8(unsigned char *aError)
デルフィ 2007
function f1(var aError: byte):bool; stdcall; 関数 f2(txt: pchar; var aError: バイト):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 テスト プログラム
フォックスプロ フォックスプロ
c:\d1.dll 文字列エラーで整数 f1 を宣言します
c:\d1.dll string txt,string err で整数 f2 を宣言します
c:\d1.dll 文字列 err、文字列 rec_nr で整数 f3 を宣言します
c:\d1.dll 文字列エラーで整数 f4 を宣言します
c:\d1.dll 文字列 descr、整数 x、double pr 、文字列 err、double qty、文字列 kd、文字列 pd で整数 f5 を宣言します
c:\d1.dll 文字列 non_fiscal_string,string err で整数 f6 を宣言します
c:\d1.dll で整数 f7 を宣言する整数入札、倍額、文字列エラー
c:\d1.dll 文字列エラーで整数 f8 を宣言します
長さ=2048
カーディナル=4
ff_log=スペース(長さ)
rec_nr=SPACE(カーディナル)
fiscal_rec_nr=SPACE(カーディナル)
serial_nr = SPACE(長さ)
status_bytes=SPACE(カーディナル)
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)