프로젝트 요구로 인해 Delphi를 사용하여 데이터베이스를 연결하여 데이터를 SQL 파일로 내보내는 DLL을 작성하여 TadoQuery 구성 요소를 사용했습니다.
수출 방법은 하나뿐입니다.
함수 dataExport (path, ini_path : pchar) : 정수;
글을 쓰고 나서 나는 테스트를 위해 델파이와 함께 test.exe를 썼다. 그리고 그것이 정상적으로 사용할 수 있음을 발견했다.
그런 다음 그는 DLL을 동료에게 건네고 PowerBuilder로 전화 해달라고 요청했습니다. 그것을 복용 한 후, 내 동료는 일단 dataexportpb가 호출되면 대상 DLL을 열 수 없다고보고되었습니다. 양쪽에서 실행되는 환경이 다르기 때문에 Test.exe를 복사하여 시도했을 수도 있습니다. 이상하게도 test.exe는 잘 실행됩니다.
문제가 실제로 발생하는 위치를 결정하기 위해 Python과 C#을 사용하여 C# 아래에 문제가 없었지만 Python은 오류를보고했습니다.
Coinitialize ()는 호출되지 않습니다
정보를 검토 한 후, ADO 구성 요소가 Delphi의 DLL에 사용되면 사용하기 전에 ActiveX의 공동화 방법을 호출해야한다는 것을 알았습니다. 문제를 알면 소스 코드에서 TadoQuery를 만들기 전에 Coinitialize ()가 호출되며 Python 호출이 성공적입니다.
나는 PowerBuilder가 괜찮을 것이라고 생각했지만 누가 그것이 같은 문제가 될 것임을 알았습니다. 나는 지금 그것을 알아낼 수 없다. Python의 CTypes 모듈은 C의 호출 방법을 사용하고 매개 변수 전달 방법은 PowerBuilder와 동일하지만 PB에서는 여전히 불가능합니까? 동료는 DLL에 추가 출력 방법을 작성하여 다음과 같은 다른 방법을 썼습니다.
기능 테스트 : PCHA;
시작하다
결과 : = '테스트에서 테스트 문자열';
끝;
테스트 방법은 PB에서 성공적으로 호출 된 후 동료는 DataExport를 다시 전화하려고 시도했으며 성공했습니다! ! ? ? 왜? 이 테스트 방법은 단지 고정 문자열을 출력합니다. 나는 정말 당황했다.
그러나 현재 PB 응용 프로그램이 종료되면 메모리 작동 오류가 발생했습니다.
델파이 코드를 신중하게 확인하고 그림이 해제되지 않았는지 확인했습니다.
함수 dataExport (path, ini_path : pchar) : 정수;
var
쿼리 : TadoQuery;
시작하다
.........
Coinitialize ();
쿼리 : = tadoQuery.create (nil);
.........
query.close;
query.free;
CONINITIALIZE ();
.........
끝;
잘못된 것이 없습니다! 절망적으로, 나는 Coinitialize ()를 나누고 ()을 두 가지 독립적 인 방법으로 나눕니다.
기능 초기 : 정수;
시작하다
노력하다
Coinitialize ();
결과 : = 1;
제외하고
예외 :
결과 : = 0;
끝;
끝;
기능을 해제하지 않는 기능 : 정수;
시작하다
노력하다
CONINITIALIZE ();
결과 : = 1;
제외하고
예외 :
결과 : = 0;
끝;
끝;
그런 다음 동료가 양식 초기화 이벤트에서 먼저 INT를 호출 한 다음 이벤트를 닫으려면 UNINIT에 전화하십시오. 문제가 해결되었습니다. 모든 것이 정상입니다.
문제가 해결되었지만 여전히 왜이 일을하는지 이해하지 못합니다.