d1.dll 함수를 호출하는 FoxPro로 컴파일 된 프로그램이 있습니다. d1.dll은 Delphi 2007로 개발되었습니다. 기존의 C++을 대체 할 d1.dll을 개발해야합니다. 같은 임의의 메시지와 임의의 장소에서 몇 가지 테스트 FoxPro 응용 프로그램 충돌 후 :FoxPro 용 C++ DLL
Fatal error: Exception code=C0000005 @ 2012.12.12 11:33. Error log file: C:\Program Files\Common Files\Microsoft Shared\VFP\vfp9rerr.log
또는
No enaugh memory execute some_function
나는 모든 코드 C에서 ++ DLL을 제거하고 원래의 DLL은 일반적으로 반환 그냥 테스트 값을 떠났다
. 그러나 이것은 도움이되지 않습니다. 아마도 선언과 변수 사용에 문제가있을 것입니다.메인 Fox Pro 프로그램에서 d1.dll 기능을 선언하는 방식에 따라 Fox Pro 소형 테스트 프로그램을 빌드했습니다. 불행히도 충돌은 발생하지 않습니다. 광산 프로그램이 실행 파일에서 실행되는 동안 IDE에서 실행하지만 이것이 이유라고 생각하지 않습니다. 아마 가변 사용법에 관한 som issuers가 있습니다.
무슨 문제일까요? ++ 델파이와 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)
델파이 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에
,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 포맷을 고쳐야합니다. 따옴표가 아닌 코드 블록을 사용하십시오. 질문의 이탤릭체를 지금 주목하십시오. 그것들은 내가 확신하는 것과 다르다. 또한, 어떻게 우리가 이것을 디버깅 할 것을 기대합니까?우리는 어떤 코드도 볼 수 없다 !! –