|
박지훈.임프 님이 쓰신 글 :
: 김대영 님이 쓰신 글 :
: : main.exe는 MDI의 parent를 가지고 있는 실행 가능한 프로그램이고
: : menu1.dll은 MDI child window를 가지고 있는 dll입니다.
: : 또한 이 dll에느 child window를 생성시키는 export function을 정의해두었습니다.
: : 생성 방법은 다음과 같이 했구요
: :
: : ----------------------------------------------------------------------------
: : // 선언부
: : extern "C" __declspec(dllexport) int CreateChildForm(TApplication*, HANDLE);
: :
: : ....
: :
: : // 몸체
: : int CreateChildForm(TApplication *ParentApp, HANDLE ParentHandle)
: : {
: : Form1 = new TForm1(ParentApp, ParentHandle);
: : }
: : ----------------------------------------------------------------------------
: :
: : 이와 같이 한 뒤 main.exe에서 이 함수를 호출하면 MDI parent를 찾을 수 없다는
: : 에러가 발생합니다.
: : 근본적으로 잘못되었다면 지적해주시고
: : 올바른 방법을 알려주시면 고맙겠습니다.
: :
: : 감사합니다.
:
:
:
: 임펠리테리입니다.
: DLL 내에 있는 MDI 차일드폼은 Parent가 될 메인폼을 찾을 수가 없으므로 그런 에러가 발생합니다.
:
: 코딩을 하신 걸로 봐서는.. 글쎄요. 어디선가 소스를 보시긴 한 것 같은데, 일부만 보셨나봅니다.
: 차일드폼의 생성자에 인자를 두개 넘겨준 걸로 봐서는 디폴트로 만든 생성자를 변경했든지 혹은
: 오버로드해서 새 생성자를 추가하셨나보군요. 차일드폼의 생성자를 보여주시지 않으셔서 확신할
: 수는 없지만, 만약 생성자의 코드에서 베이스생성자에 Owner로서 넘겨받았던 ParentApp를 다시
: 념겨줘야 합니다.
:
: 잘 이해가 안되시거나 혹 다른 이유인 것 같으시면 자세한 소스를 첨부해서 다시 질문해주시기
: 바랍니다.
:
: 그럼 이만...
먼저 답변 고맙습니다.
임프님의 답변중에 다음 부분이 이해가 가지 않더군요.
>> "만약 생성자의 코드에서 베이스생성자에 Owner로서 넘겨받았던 ParentApp를 다시
>> 념겨줘야 합니다."
저는 차일드의 생성자로 디폴트 생성자를 변경해서 사용했습니다.
----------------------------------------------------------------------------
public: // User declarations
__fastcall TForm1(TComponent* Owner, HANDLE ParentHandle);
----------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner, HANDLE ParentHandle)
: TForm(Owner)
{
}
----------------------------------------------------------------------------
위 코드가 child form으로 생성된 기본 코드에서 변경한 전부입니다.
어디서 소스를 본것은 아니고 일반 MDI 구조의 Application을 만든 후
child의 source만 DLL code에서 사용하도록 한 것입니다.
(본거라면 다 보고 제대로 했을텐데..)
추가한 ParentHandle은 나중에 사용하려고 넣어둔 것이구요.
추가 질문으로서 충분했는지 모르겠네요.
감사합니다.
|