Q&A

  • Package Dynamic Load후, 함수를 호출하려면...
안녕하십니까. 많은 도움 주시는 한델 여러분께 감사드립니다.



요즘엔 항상 신세만 진 점을 진지하게 돌이켜 볼 계기가 있었기에

아는건 없지만 다른 분 일을 덜어드리는 일이나마 해보고자 보잘것없는

답변이라도 몇건씩 올리고 있습니다. 그리고 제가 문제에 부딛쳤을때

좀 더 많은 부분을 스스로 해결하기 위해 노력하고 있습니다.



그런데 오늘은 정말 곤란한 문제가 나타나고 말았습니다...



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를 사용하는 것 같은데...

왜 안 되는지 모르겠습니다...



여기저기 많이 뒤져 봤지만 알 길이 없기에 마지막으로 도움을 바랍니다...

부탁드리겠습니다.







2  COMMENTS
  • Profile
    최용일 2000.04.27 11:59
    안녕하세요. 최용일입니다.



    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를 사용하는 것 같은데...

    > 왜 안 되는지 모르겠습니다...

    >

    > 여기저기 많이 뒤져 봤지만 알 길이 없기에 마지막으로 도움을 바랍니다...

    > 부탁드리겠습니다.

    >

    >

    >

  • Profile
    김일영 2000.04.29 03:55
    답변에 감사드립니다. 제가 몸이 안 좋아서 늦게서야 인사를 올리게 되었습니다.



    과연 패키지의 컴포넌트들에 대해 garbage collection을 수행하는 것이 장난이

    아니더군요. 패키지를 동적 로드하는 것이 저희 프로젝트에 적합하지 않다고 생각은

    했었고 그런 방법을 사용하게 되지도 않을 것 같습니다. 하지만 당초에 제가 보기에

    너무나 터무니없는 안이 제시되어서, 그에 비교할 프로토타입으로서 이 패키지를

    동적로드하는 것을 보여줄 필요가 있었기 때문에 죽어라고 이 방법을 알아내야만 했습니다.



    한 사흘동안 잠도 못자고 밥도 못먹다가 에라 모르겠다 하고 Delphi informant에서

    패키지하고 관계된 글을 몽땅 다 찾아봤더니 겨우 딱 하나(!) 관계된 글이 있었고

    거기서 inprise download 페이지에도 소스가 하나 있다는 걸(겨우 진짜 딱 한개!)

    알았습니다.



    그래도 그걸로는 패키지에서 그냥 함수를 호출하는건 어떻게 하는지 안 나왔더군요.

    대신 패키지에서 타입을 정의하고 패키지를 불러온 쪽에서 그 패키지에 있는 타입을

    이용하는 방법까지만 알 수 있었습니다.



    결론적으로 상당히 불편하더군요... 역시 동적으로 올려서 쓰는 것은 어떤 메카니즘을

    쓰던간에 개발하기는 매우 불편하다는걸 실감했습니다.

    미진한 내용이나마 그래도 제가 알아낸 코드는... 내용이 그래도 좀 크니까 여기다

    바로 올리긴 어려울 것 같고 자료실이나 강의실에 곧 올리려고 합니다.



    감사합니다.

    =======================================================================

    최용일 wrote:

    > 안녕하세요. 최용일입니다.

    >

    > 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를 사용하는 것 같은데...

    > > 왜 안 되는지 모르겠습니다...

    > >

    > > 여기저기 많이 뒤져 봤지만 알 길이 없기에 마지막으로 도움을 바랍니다...

    > > 부탁드리겠습니다.

    > >

    > >

    > >

    • 이빈
    • 2000.04.27 10:20
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.27 12:01
      안녕하세요. 최용일입니다. 말그대로 AviCap.dcu를 생성할 수 없다는 말입니다. 아마도 AviCap.dcu의 파...
    • 김일영
    • 2000.04.27 09:41
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.27 11:59
      안녕하세요. 최용일입니다. DLL을 쓰세요. 패키지도 일종의 DLL이지만 많은 부분이 다릅니다. 몇가지 함...
    • 김일영
      2000.04.29 03:55
      답변에 감사드립니다. 제가 몸이 안 좋아서 늦게서야 인사를 올리게 되었습니다. 과연 패키지의 컴포넌...
    • [정성훈]당근이져....
      2000.04.28 09:15
      이수정 wrote: > 안녕하세요.. > > Query 하나만으로.. DataSource나 Table을 사용하지 않고도.. > ...
    • nilriri
      2000.04.27 17:44
      queyr1의 databasename속성에 alias명을 선택해 주시고 sql문에 원하는 내용을 넣어서 쓰시면 됩니다. ...
    • 김일영
      2000.04.27 07:41
      제 경험으로는 DataSource나 Table을 사용하지 않고도 적어도 select문은 어떤 것이든 아무 이상없이 잘 ...
    • 유레카
    • 2000.04.27 04:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 오현수
      2000.04.28 07:57
      유레카 wrote: > > 파라독스나 sql server에서 제공되는 자동증가 변수 타입을 InterBase에서도 사용...
    • 김태열
      2000.04.28 04:10
      김명찬 wrote: > 안녕하십니까? > 질문이 있어 글을 올립니다. > > 로컬 데이터베이스이에서 알리아스...
    • 쥬니
    • 2000.04.27 02:43
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 한석희
      2000.04.27 20:36
      강병수 wrote: > 스캔 Device 로부터 입력받은 데이타를 Bitmap 형식으로 > 이미지 콤포넌트로 디스플레...
    • 이기현
      2000.04.27 02:50
      /////////////////////////////////////// 스캔제조회사로 부터 프로그램 소스를 문의(프로그램 소스를 얻...
    • 이기현
      2000.04.27 02:34
      ///////////////////// Binary large object(BLOB); binary, memo, graphic, and OLE. 등을 Save하고 Loa...
    • seagod
      2000.04.27 02:30
      BLOB 은 binary large object (BLOB)의 약어구요 바이너리 데이터를 저장하기위한 것이죠 TBlobField에 파...
    • 사발우성
      2000.04.27 18:30
      seagod wrote: > BLOB 은 binary large object (BLOB)의 약어구요 > 바이너리 데이터를 저장하기위한 것...
    • neperz
    • 2000.04.27 01:54
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이언주
    • 2000.04.27 01:44
    • 2 COMMENTS
    • /
    • 0 LIKES
    • HART
      2000.04.27 02:43
      QRCompositeReport라는 컴폰너트를 사용하면 세개의 디비을 같이 출력할 수 있습니다. 예제는 델파이 데모...
    • 이언주
      2000.04.28 03:05
      저번에 제가 질문한 것에서는 이것이 가능하지만요...이번에는 QRRichText를 사용해서 쿼리문을 사용해서 ...
    • 이기현
      2000.04.27 01:50
      ///////////////// if Col = 2 then // or if (Col = 2) and (Row = 2) then begin TStringG...
    • 상아
      2000.04.28 19:55
      답변 감사합니다.. 많은 도움 됐습니다... 처음엔 이 문장을 어디에 삽입할지 몰라서 쩔쩔...워낙 초보라...
    • 이도선
    • 2000.04.27 01:27
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이상호
      2000.05.16 08:25
      Windows API인 CopyMemory를 사용하는 방법도 있습니다. 원형은 아래와 같습니다. VOID CopyMemory ( ...
    • 이기현
      2000.04.27 01:33
      ////////////////////// Move(A, B, SizeOf(B));
    • 이기현
      2000.04.27 01:35
      //////////////////// GetActiveWindow
    • yanny
      2000.04.27 05:07
      이기현 wrote: > //////////////////// > GetActiveWindow 답변 감사 드립니다
    • nilriri
      2000.04.27 02:31
      테이블 컴포넌트에서 더블클릭하면 나오는 필드에디트 창에서 필드를 모두 선택하구요 오브젝트 인스펙터...
    • seagod
      2000.04.27 01:55
      procedure 를 하나 만드심이 어떨지요 가령 요렇게요 procedure proc1(Sender: TField); begin ...
    • 여용구
    • 2000.04.27 00:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.27 04:00
      안녕하세요. 최용일입니다. 가변데이터를 가질 수 있는 개방형 배열(Open array)을 파라매터로 이용하세...
    • 여용구
    • 2000.04.27 00:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한석민
      2000.05.09 03:27
      여용구 wrote: > 안녕하세요.. 다름이아니라. > > 다음과 같이 WinApi인 CreateThread를 사용하여 쓰레...
    • 쥬니
    • 2000.04.27 00:26
    • 6 COMMENTS
    • /
    • 0 LIKES
    • seagod
      2000.04.27 01:46
    • 이기현
      2000.04.27 00:40
    • 쥬니
      2000.04.27 00:50
    • 이기현
      2000.04.27 01:23
    • 쥬니
      2000.04.27 03:11
    • 이기현
      2000.04.27 03:49