2009-11-09 11 views
1

함수를 가지고 BPL 함수에서 문자열을 반환, 그는 LoadPackage와 메인 프로그램에서의로드 BPL아래 단순화

function DoA(amount: currency; var Info: string): Currency; stdcall; 
begin 
    result := amount * 19; 
    Info:= 'Some Text about the result'; 
end; 

에서 수출되고 다른 기능 잘 작동 GetProcAddress를. 하지만이 코드는 호출 할 때 많은 오류가 발생합니다.

BPL은 간체

bplhandle: HModule; 
    BPLDoA: function (amount: currency; var Info: string): Currency; stdcall; 
    intoStr : string; 

함께 사용된다.

begin 
    bplhandle:=LoadPackage('test.bpl'); 
    if bplhandle <> 0 then 
    begin 
    @BPLDoA:=GetProcAddress(bplhandle,'DoA'); 
     if assigned(BPLDoA) then 
     result := BPLDoA(123, intoStr); 
    end; 
end; 

intoStr에 반환되는 절차 하지만 수정 된 텍스트의 끝에 일어날 것으로 보인다 예외 오류가 정보와 아무 것

(중단 점으로 볼 때) var 및/또는 문자열이되는 param?

오류 메시지가

이 프로젝트 만들기 Project1.exe 메시지 '잘못된 포인터 작업'

덕분에 예외 클래스 EInvalidPointer을 발생

대한 추가 정보를 원하시면> 같은 BPL에서 다른 기능/단위는 잘 작동합니다.

function DoB(amount: currency): Currency; stdcall; 
    result := amount * 19; 
end; 
>

예외 클래스를 제외하고

미친 : EInvalidPointer 예외 메시지 : 잘못된 포인터 작업.

메인 스레드 ($의 1b7c) 0040276f 013 만들기 Project1.exe 시스템 @FreeMem 00,404,650 + 01C 만들기 Project1.exe 시스템 @LStrClr 00,483,814 + 15C 만들기 Project1.exe 유니트 1 97 +11 TForm1.Button3Click 00,462,430 064에서 Project1 .EXE는 TControl.Click 0045a870 + 01C 만들기 Project1.exe StdCtrls TButton.Click이

+0

당신의 양이에는 "VAR"가 없습니다 – Treby

+0

죄송이 예는 않습니다 –

답변

6

"런타임 패키지 빌드를." 프로젝트 옵션의 "패키지"섹션에서 찾으십시오. (Documentation)

EInvalidPointer 메모리 관리자가 할당하지 않은 것을 해제하려고 시도하면 예외가 발생합니다. 이는 두 개의 다른 메모리 관리자가 활성화되어 있음을 의미합니다. 귀하의 BPL은 귀하의 패키지의 "필수"목록에있는 RTL 패키지의 패키지를 사용하고 있습니다. 반면에 EXE는 EXE 모듈로 컴파일 된 메모리 관리자를 사용합니다.

런타임 패키지를 사용하도록 EXE에 지시 한 다음 RTL 패키지가 필수 패키지 목록에 있는지 확인하여 문제를 해결하십시오.

+0

우수, 나는 그것이 단순한 것 같아서 기분이 좋았습니다. 덕분에 –

1

이 당신의 수입 신고는 정확하게 내 보낸 함수의 서명과 일치합니까 제어?

은 다음과 같이이어야합니다 : 당신은 당신의 EXE 프로젝트를 구성하지 않은

DoAProc: function (amount: currency; var Info: string): Currency; stdcall; 
+0

최고의 병이 변화 밤은 예는, 는 더 많은 정보를 추가 수입에 대해 –

+0

그리고 그것은 stdcall 것 같습니다; 지시문이 누락되었습니다. –

+0

아, 그걸 보지 못했고, ive가 덧붙여서 아무런 변화가없는 것 같아. –

0

다른 BPL을 추가로 배송하지 않으려면 (이제 기본 EXE가 런타임 BPL을 사용함) 프로젝트에 ShareMem 유닛을 포함해야합니다. 델파이 도움말 파일에서 "공유 메모리"항목을 확인하십시오.

MS-도움 : //embarcadero.rs2010/rad/Sharing_Memory.html이

+0

최신 델파이 버전 (> = 2009, 정확하게 기억한다면) SimpleShareMem을 사용해야합니다. shareMem을 사용하려면 BorlandMM.dll 배포가 필요합니다. http://docwiki.embarcadero.com/RADStudio/ko/Sharing_Memory –