안녕하십니까. 많은 도움 주시는 한델 여러분께 감사드립니다.
요즘엔 항상 신세만 진 점을 진지하게 돌이켜 볼 계기가 있었기에
아는건 없지만 다른 분 일을 덜어드리는 일이나마 해보고자 보잘것없는
답변이라도 몇건씩 올리고 있습니다. 그리고 제가 문제에 부딛쳤을때
좀 더 많은 부분을 스스로 해결하기 위해 노력하고 있습니다.
그런데 오늘은 정말 곤란한 문제가 나타나고 말았습니다...
Package를 동적으로 Load하고 쓸 수가 있어야 하는데 올리고(Load)
내리는 건 LoadPackage, UnLoadPackage로 잘 되는데(헬프에도 나와
있더군요) 정작 그 패키지 안에 있는 함수를 호출한다든지 하는 것은
어떻게 해야 하는지 모르겠습니다.
SysUtils의 소스도 보았고, GetPackageInfo 등 헬프도 찾아봤지만
제일 중요한 문제, 즉 동적으로 로드한 패키지를 도대체 어떻게 사용하라는
것인지에 대한 문제는 없었습니다. 심지어 Inprise에 가서 검색도 해봤지만
없더군요.(원래 Inprise에서 잘 검색이 안되지만... 다른 외국 사이트는
검색할만한 곳을 잘 몰라서요...)
일단 제가 해 본 소스를 보여드리면:
procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do begin
if Execute then begin
HPackageMODULE := LoadPackage(FileName);
end;
end;
if HPackageMODULE <> 0 then begin
@PackagedButtonCreate := nil;
@PackagedButtonCreate := GetProcAddress(HPackageMODULE,
PChar('ButtonCreate'));
// ButtonCreate는 단순히
// TButton.Create(인자); 해서
// 리턴하는 함수임
if Assigned(PackagedButtonCreate) then begin
PackagedButton.Free;
PackagedButton := nil;
PackagedButton := PackagedButtonCreate(Self);
if Assigned(PackagedButton) then begin
with PackagedButton do begin
Parent := Self;
Visible := True;
Left := 450;
Width := 100;
Top := 145;
Height := 25;
end;
end;
end;
end;
UnLoadPackage(HPackageMODULE);
end;
이상입니다.
패키지와 패키지에 포함된 유닛 자체에는 분명히 문제가 없습니다.
패키지를 설치한 후 거기에 샘플로 만들어놓은 컴포넌트를 사용도 해 봤고,
패키지에 사용했던 유닛만 따로 다른 프로젝트에서 테스트해보기도 했습니다.
SysUtils의 소스를 봐도 GetProcAddress를 사용하는 것 같은데...
왜 안 되는지 모르겠습니다...
여기저기 많이 뒤져 봤지만 알 길이 없기에 마지막으로 도움을 바랍니다...
부탁드리겠습니다.
DLL을 쓰세요. 패키지도 일종의 DLL이지만 많은 부분이 다릅니다. 몇가지 함수들이
지원되지만 쓰기도 무척 어렵고 패키지가 언로드될때는 패키지에 관련된 모든 컴포넌
트를 해제시켜주지 않으면 아주 치명적이죠. 패키지에서 일반 DLL처럼 GetProcAddress
는 사용할 수 없습니다. 간접적으로 모듈을 참조해야 하는데... 쩝~~~
일반 DLL로 만들어서 쓰세요. 훨씬 편하고 까다롭지도 않습니다.
^^ 항상 즐코하세요.
김일영 wrote:
> 안녕하십니까. 많은 도움 주시는 한델 여러분께 감사드립니다.
>
> 요즘엔 항상 신세만 진 점을 진지하게 돌이켜 볼 계기가 있었기에
> 아는건 없지만 다른 분 일을 덜어드리는 일이나마 해보고자 보잘것없는
> 답변이라도 몇건씩 올리고 있습니다. 그리고 제가 문제에 부딛쳤을때
> 좀 더 많은 부분을 스스로 해결하기 위해 노력하고 있습니다.
>
> 그런데 오늘은 정말 곤란한 문제가 나타나고 말았습니다...
>
> Package를 동적으로 Load하고 쓸 수가 있어야 하는데 올리고(Load)
> 내리는 건 LoadPackage, UnLoadPackage로 잘 되는데(헬프에도 나와
> 있더군요) 정작 그 패키지 안에 있는 함수를 호출한다든지 하는 것은
> 어떻게 해야 하는지 모르겠습니다.
>
> SysUtils의 소스도 보았고, GetPackageInfo 등 헬프도 찾아봤지만
> 제일 중요한 문제, 즉 동적으로 로드한 패키지를 도대체 어떻게 사용하라는
> 것인지에 대한 문제는 없었습니다. 심지어 Inprise에 가서 검색도 해봤지만
> 없더군요.(원래 Inprise에서 잘 검색이 안되지만... 다른 외국 사이트는
> 검색할만한 곳을 잘 몰라서요...)
>
> 일단 제가 해 본 소스를 보여드리면:
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> with OpenDialog1 do begin
> if Execute then begin
> HPackageMODULE := LoadPackage(FileName);
> end;
> end;
>
> if HPackageMODULE <> 0 then begin
> @PackagedButtonCreate := nil;
> @PackagedButtonCreate := GetProcAddress(HPackageMODULE,
> PChar('ButtonCreate'));
>
> // ButtonCreate는 단순히
> // TButton.Create(인자); 해서
> // 리턴하는 함수임
> if Assigned(PackagedButtonCreate) then begin
> PackagedButton.Free;
> PackagedButton := nil;
> PackagedButton := PackagedButtonCreate(Self);
> if Assigned(PackagedButton) then begin
> with PackagedButton do begin
> Parent := Self;
> Visible := True;
> Left := 450;
> Width := 100;
> Top := 145;
> Height := 25;
> end;
> end;
> end;
> end;
>
> UnLoadPackage(HPackageMODULE);
> end;
> 이상입니다.
>
> 패키지와 패키지에 포함된 유닛 자체에는 분명히 문제가 없습니다.
> 패키지를 설치한 후 거기에 샘플로 만들어놓은 컴포넌트를 사용도 해 봤고,
> 패키지에 사용했던 유닛만 따로 다른 프로젝트에서 테스트해보기도 했습니다.
>
> SysUtils의 소스를 봐도 GetProcAddress를 사용하는 것 같은데...
> 왜 안 되는지 모르겠습니다...
>
> 여기저기 많이 뒤져 봤지만 알 길이 없기에 마지막으로 도움을 바랍니다...
> 부탁드리겠습니다.
>
>
>