0

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)

4

1 に答える 1

1

1) 質問を編集 - Delphi バージョンの TAG を追加します。それは礼儀正しいだけでなく、ここでは批判的かもしれません。

2) FoxPro コードに「文字列」参照が表示されます - これはおそらく、あなたのchar*音が C 文字列 (別名 ASCIIZ 文字列、別名ゼロ終了文字列) であることを意味します。

彼らはちょっと特別な扱いが必要です。それらを PAnsiChar として渡してみてください - のように -function f1(const aError: PAnsiChar):bool; stdcall;

Delphi PChar タイプに関するヘルプを読む - ただし、常にPAnsiChar固定 DLL API で使用する: PChar は Delphi の異なるバージョンではあいまいです - PAnsiChar または PWideChar のいずれかにマッピングされます

3) 正しいデータ型を返します。ブールではありません。

c:\d1.dll string txt で整数 f2を宣言します。string err
extern "C" int _stdcall f2 (char *txt,unsigned char *aError)
function f2 (const txt, aError: PAnsiChar): integer ; stdcall;

于 2012-12-12T12:45:01.183 に答える