Q&A

  • dll 폼에서 main의 함수호출하기
MAIN 폼이 있고요  DLL 로 만든 CHILDFORM(자식폼) 이 있습니다.

제가 하고싶은것은 DLL(자식폼) 에서 MAIN폼의 함수(DLL호출)를 불러서

사용하고 싶습니다.

우선 DLL(자식폼)에서 use 절은 추가했고요~

호출하는 부분을 아래와 같이 했습니다.


procedure TFrmCH001.button1Click(Sender: TObject);
begin
    Fmain.MS001Click(Fmain.Ch001);
end;

그런데~ Access Violation 에러가 나네요! 무슨 오류인가요?
2  COMMENTS
  • Profile
    YYpBD 2003.11.24 18:23
    함수 포인터를 차일드 폼에 넘기세요.

    TFunction = procedure(AData: pChar);

    차일드 폼에서는 이런식으로 함수 형을 정의한후에

    메인함수의 TFarProc 포인터를 넘겨주면 됩니다.

    FarProc: TFarProc을 넘겨받았으면

    차일드 폼에서

    TFunction(FarProc)( pData );

    이런식으로 호출해서 사용할수 있습니다.




  • Profile
    윤승환 2003.11.24 06:29
    말씀하신 변수 Fmain은 그냥 레퍼런스(reference)에 불과합니다.
    중요한 것은 레퍼런스가 의미있는 값을 가리키고 있는가하는 것이죠.

    무슨 소리인가하면...(설명하자니 적당한 예가 생각나질...)

    열차 예약을 예로 들겠습니다.
    내일 오전 10시 서울역에서 부산역까지 가는 무궁화호 열차를 인터넷으로 예약을 하려고 합니다. 해당 사이트에 들어가 보니 10시발 부산행 열차의 좌석이 10석 남아있습니다. 그래서 예약을 했습니다. 그런데 예약시에는 좌석번호를 할당 받지 않습니다. 먼저 결제를 해야하기 때문이죠.
    즉 예약을 하는 것은 단순히 var 영역에 선언하는 것이고
    실제로 결제를 하고 발권을 받은 그 표가 의미있는 것이지요.
    그 표에는 10시발 부산행 6호차량 33석이라고 찍혀있습니다.

    말씀하신 Fmain은 그냥 mainform을 가리킬 수 있는 일종의 변수에 지나지 않습니다. 표는 표이지만 아직 좌석이 적혀있지 않다는 거죠.

    Fmain이 생성될 때 정확히 얘기하면
    *.dpr에 자동생성된 다음과 같은 소스에 의해서

    Application.CreateForm(TFmain,Fmain);

    Fmain에 의미있는 값이 들어가 있게 됩니다.

    그런데 문제는 dll은 Fmain이 할당받는 main module과는 다른 module이라는 겁니다. 이건 또 무슨 소리인가...

    Fmain이 할당을 받은 것은 *.dpr소스내에서 일어날 일이므로 dll module에서는 알 수가 없다는 얘기입니다. 반대로 dll module에서 Fmain에 무언가를 할당해도 마찬가지로 main module에서는 알 수가 없습니다.

    그럼 어떻게 해야하나 main module에서 Fmain을 dll 쪽으로 전달을 해야합니다. 아니면 반대로 dll module쪽에서 Fmain쪽으로 dll reference를 넘겨도되죠.


    실제 예까지 들어서 보여 드리면 좋겠지만....
    웹페이지에 그냥 써 내려가다보니 힘드네요.

    추천하고 싶은 방법은 Fmain에서 dll form을 호출할 때(생성할 때)
    Fmain을 전달인자로 넘겨서 dll module에서 전달받은 인자를 이용할 수 있게 하는 겁니다.

    이런식의 레퍼런스 전달방식이 발전하면 Interface가 언급되고 COM이론이 나타나게되죠..

    허접한 답변이 이었습니다....^^