2012-12-12 3 views
0

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

오류 메시지를 인용 할 때 항상 리터럴 텍스트를 붙여 넣을 때 메모리에서 다시 쓰지 마십시오. 당신은 당신이 뒤에 남겨 둘지도 모르는 것을 결코 알지 못합니다 (또한 당황한 타이핑으로부터 당신을 구합니다.) –

+0

-1 포맷을 고쳐야합니다. 따옴표가 아닌 코드 블록을 사용하십시오. 질문의 이탤릭체를 지금 주목하십시오. 그것들은 내가 확신하는 것과 다르다. 또한, 어떻게 우리가 이것을 디버깅 할 것을 기대합니까?우리는 어떤 코드도 볼 수 없다 !! –

답변

1

1) 편집 질문 - 델파이 버전으로 태그를 추가하십시오. 그것은 정중 할뿐만 아니라 여기에서 비판적 일 수도 있습니다. 당신이 FoxPro에 코드에서 "문자열"참조 참조

2) - 아마 char* 듣고 의미 그들은 좀 특별한 치료가 필요 일명 C-문자열 (일명 ASCIIZ 문자열, 제로 끝나는 문자열)

입니다. 의 PAnsiChar로 전달 시도 - 같은 - function f1(const aError: PAnsiChar):bool; stdcall;

델파이를 PChar 유형에 대한

읽기 도움 - 항상 고정 된 DLL의 API에서 PAnsiChar를 사용하지만 : PChar는 다른 델파이 버전 모호 -의 PAnsiChar 또는 PWideChar로

3) 복귀 중 하나에 매핑 올바른 데이터 유형. bool하지 마라.

는 C에 정수 F2을 선언 d1.dll 문자열 TXT \ 문자열
통근 "C"INT _stdcall F2 (숯 *의 TXT, 서명 숯불 * AERROR)
함수 F2를 잘못 (const txt, aError : PAnsiChar) : 정수; stdcall;

+0

Delphi 코드에서 뭔가를 변경할 필요가 없습니다. Visual C++ – vico

+0

로 완료되는 dll을 충돌시킨 다음 역 변환을 수행하십시오! 'var x : byte'는 by-ref'unsigned char & x';을 의미합니다. Bool은 일부 부울 유형입니다. docwiki.embarcadero.com에서 검색하고 적절한 창 유형을 사용하십시오. 그리고 FoxPro 코드는 Delphi 코드와 일치하지 않습니다. Delphi 코드에는없는 문자열이 있습니다. PChar라고하는 PAnsiChar만이 문자열입니다. 문자가 아님 & –

+0

비 유니 코드 라이브러리를 만들기 위해 VC++를 구성해야합니다. 2 바이트 문자가 아닌 1 바이트 문자를 사용합니다. –