2009-09-08 6 views
8

나는 아주 간단한 래퍼 .exe를 작성한 Delphi 응용 프로그램을 가지고 있습니다.실행 파일에서 bpl로 Delphi 함수를 호출하려면 어떻게해야합니까?

기본적으로, 많은 함수가있는 DLL이 있었는데, 그 중 하나는 래퍼가 필요로했던 것을 반복적으로 호출했을 것입니다. 나는이 dll 파일을 제어 할 수 없으며 절대 존재하지 않을 것이다.

이제이 DLL은 BPL이며,이 파일에서 함수를 호출하는 방법을 모르겠습니다. 미리 감사드립니다.

답변

10

패키지의 함수를 사용하는 쉬운 방법은 함수를 포함하는 유닛을 "사용"하고 평소와 같이 호출하고 패키지를 프로젝트의 런타임 패키지 목록에 배치하는 것입니다. 그게 작동하려면 몇 가지 요구 사항이 있습니다 :

  1. 프로젝트는 패키지를 컴파일하는 데 사용 된 것과 동일한 델파이 버전을 사용해야합니다.
  2. 장치의 DCU 파일 또는 패키지의 DCP 파일에 액세스 할 수 있어야합니다.
  3. 패키지가 프로그램 시작시 운영 체제 검색 경로에 있어야합니다.

세 번째 요구 사항을 충족 할 수 없거나 항상 패키지를로드하지 않으려면 대신 LoadPackage으로 전화 할 수 있습니다. 이 작업을 수행하는 방법은 이 항상 인 다른 패키지를 갖는 것입니다. 프로젝트와로드하려는 패키지 모두에서 사용됩니다. 중간 패키지는 기본 패키지가 응용 프로그램에 기능을 알리는 데 사용할 수있는 인터페이스 (일부 등록 함수, 변수 또는 클래스)를 표시합니다. 직접 응용 프로그램에서 주 패키지의 유닛을 "사용할"수 없습니다.

처음 두 요구 사항을 충족시킬 수 없다면 훨씬 더 어려운 방법이 있습니다. 이는 응용 프로그램이 Delphi 또는 C++ Builder로 작성되지 않은 경우 수행해야 할 작업이기도합니다. 패키지를 일반 DLL처럼 취급하십시오. LoadLibrary으로로드하십시오. Initialize 함수를로드하려면 GetProcAddress을 사용하고 호출하십시오. 호출 규칙은 register이 아니고 stdcall이 아닙니다. 호출 할 함수의 주소를로드하십시오. 함수의 이름이 변경되어 일부 단위 및 유형 정보가 포함됩니다. FreeLibrary에 전화하기 전에 Finalize 함수를 호출하십시오. 소스를 LoadPackageUnloadPackage으로 확인하십시오. CheckForDuplicateUnits에 전화해야하는지 여부는 요구 사항 번호 1을 충족시킬 수 있는지 여부에 따라 달라집니다.

+0

이 작업을 수행하는 데 도움이되는 방법은 무엇입니까? 저는 사실 델파이 프로그래머가 아니기 때문에 이런 것들을 잃어 버렸습니다. – Dan

+0

마지막 단락에서 설명한대로 "수동으로"패키지를로드하는 방법을 설명하는 리소스는 알지 못합니다. 끝에서 두 번째 단락에 설명 된대로 패키지를 사용하는 일반적인 방법은 델파이 도움말에 표시 될 것으로 예상됩니다. 그러나 델파이가 어디에도 설치되어 있지 않으므로 직접 확인할 수는 없습니다. –

2

BPL은 몇 가지 특정 추가 사항이있는 DLL 일뿐입니다. 한 가지 특별한 경고가있는 것처럼 DLL에서했던 것처럼 함수를 호출하는 데 문제가 없어야합니다. BPL은 사용하는 것과 동일한 버전의 Delphi에서 빌드해야합니다. 이것은 소스 코드가 없다면 큰 단점이 될 수 있습니다. 이것이 당신에게 문제가된다면, 아마 그걸 만든 사람과 이야기하고 그것을 DLL로 다시 만들어달라고 요청해야 할 것입니다.

+0

-1, 나는 'Back to DLL-Hell'아이디어에 강력히 동의하지 않습니다. BPL은 매우 풍부한 인터페이스와 투명한 메모리 관리 기능을 제공합니다. –

+0

다른 버전의 Delphi로 컴파일 된 Delphi 실행 파일에서 BPL을로드 할 수 없다는 객관적인 사실은 바뀌지 않습니다. 그렇게 할 수있는 방법을 알고 있다면, 나는 그 방법을 아는 데 매우 관심이있을 것입니다. –

+0

BPL은 DLL 인터페이스와 DLL 호환 유형 (문자열이없는 경우)이 있으면 다른 Delphi 버전으로 확실히 빌드 될 수 있습니다. 시작). – mghie

1

BPL은 많은 DLL 문제를 제거 할 수 있습니다. 정적으로 링크 할 수 있으면 테두리가 투명하지만 투명 해집니다. 동적으로로드해야하는 경우 하나의 DLL 스타일 액세스 기능 (일반적으로 객체 또는 인터페이스를 반환하는 DLL)과 일부 일반 유형 (인터페이스) 정의가 필요합니다. BPL 제작자가 제공해야하는 모든 것.

+0

"BPL로 부르는 기능 중 하나를 가지고있는 DLL"을 만들면 어떤 이점이 있습니까? 귀하가 인용 한 혜택 중 OP에 중요한 것은 아닙니다. 어쩌면 그는 그 DLL 문제 중 하나도 겪지 않았을까요? – mghie

+0

해당 함수의 매개 변수에 따라 다릅니다. Mayb Dan은 헤더 행을 게시 할 수 있습니다. –

관련 문제