Q&A

  • 호출된 dll 에서 exe 파일로 값을 전달하려고 하는데 어떻게 해야 하나요?



위 그림처럼 exe 파일에 dll폼 을 패널에 삽입했습니다..



수량1과 수량2의 합계 300 을 합계수량값 전송 버튼을 눌러서 합계수량 에 넣고 싶습니다..



어떻게 해야 하나요 ..?
4  COMMENTS
  • Profile
    석주현 2008.10.25 02:56
    dll 폼 생성시 받은 헨들을 가지고 메세지로 보내시면 됩니다.

    WM_COPYDATA 를 이용하면 됩니다.

    아마도 제일 간단한 방법 같습니다. 그리고 사용법 예제는 이미 많이 올라와 있으니 WM_COPYDAT 로 찾아 보세요. ^^
  • Profile
    김상진 2008.10.25 03:15
    죄송하지만 간단한 예제 하나만 들어 주세요..
    아무리 봐도 잘 이해가 안 되네욤.. -.-
  • Profile
    석주현 2008.10.25 03:55
    그러면 그냥 USER 메시지를 만드는 방법이 좋겠네요.

    받는 쪽 즉 Exe 파일 쪽에선 메시지 받아 처리 하고요.


    const WM_USERSEND = WM_USER + 10;

    procedure WmUserDataSend(var Msg: TMessage); message WM_USERSEND;

    procedure TMainForm.WmUserDataSend(var Msg: TMessage);
    begin
    eb1.Text := IntToStr(Msg.WParam);
    end;




    보내는 쪽 즉 Dll에선 메시지를 보내면 되겠죠.



    const WM_USERSEND = WM_USER + 10;

    procedure TForm1.btn1Click(Sender: TObject);
    begin
    TestValue := StrToInt(lbledt1.Text) + StrToInt(lbledt2.Text);

    SendMessage(MyParentForm.Handle,WM_USERSEND,TestValue,0);
    end;


  • Profile
    장성호 2008.10.25 04:45


    exe에서 dll을 load하면 같은 메모리 공간에 있게 됩니다.

    그러므로 dll에서 얼마든지 메인폼의 객체어 접근도 할수 있고 , 또 얼마든지 메인폼의 public 메소드도 사용할수 있죠


    그런데 dll에서 exe의 Form class 를 알수가 없죠


    delph에서 컴포넌트를 개발하면 xxx.bpl로 만들어 집니다. *.bpl 파일은 dll의 일종이죠


    만약 exe프로그램에서 FormCreate이벤트에 무슨 코드를 넣었다고 합시다.
    이 FormCreate 함수는 어디서 호출할까요?

    바로 vclxx.bpl 에서 호출합니다. bpl(또는 dll) 에서는 현재 Form의 클래스 구조를 전혀 모르는데...


    이것이 가능한 이유는 이벤트 핸들러(함수) 를 걸어 놓았기 때문이죠

    다시말해 dll 에 Form을 Show하면서 함수포인터를 하나 넘겨주고 dll에서는 그 함수를 호출하면 된다 뭐 그런것입니다.
    이게 코딩하기에 가장 직관적이죠


    샘프코드 들어갑니다.



    // xxxdll.bpr

    function ShowDllForm(App: TApplication;scr:TScreen;parent: TWinControl; func:TCalcEvent): boolean ;
    var
    frm: TForm2;
    begin
    Application:=App; // dll을 run-time package를 사용하지 않으면 application객체가 다름
    Screen:=scr;

    frm:=TForm2.Create(Application);
    frm.Parent:=parent; // Form의 Parent 설정
    frm.funcRslt:=func; //이벤트 함수 설정
    frm.Show;
    Result:=true;
    end;


    exports
    ShowDllForm;


    //-----------------------------------------------------------

    // dll 의 Form2

    type

    TCalcEvent = procedure(sRslt:String) of object;

    TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    funcRslt: TCalcEvent;
    end;

    var
    Form2: TForm2;

    implementation

    {$R *.dfm}

    procedure TForm2.Button1Click(Sender: TObject);
    var
    sRslt: String;
    begin
    sRslt:=IntToSTr( StrToIntDef(Edit1.Text,0)+ StrToIntDef(Edit2.Text,0));

    if Assigned(funcRslt) then //설정된 함수가 있으면
    funcRslt(sRslt); // 호출한다.

    end;






    이제 exe 코드입니다.



    type
    TCalcEvent = procedure(sRslt:String) of object; // 메소드 타입선언


    function ShowDllForm(app:TApplication;scr:TScreen; parent: TWinControl; func:TCalcEvent): boolean ; external 'myFormDll.dll' name 'ShowDllForm'

    //--------------------------------------------
    // dll에서 호출할 메소드
    procedure TForm1.OnDllClacResult(str:String);
    begin
    Edit1.Text:=str;
    end;
    //--------------------------------------------
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    //dll의 Form을 show하도록 dll함수를 호출할때
    //Form의 parent와 dll에서 호출할 함수 OnDllClacResult 를 같이 넘긴다.
    // application 과 screen을 넘기는 이유는
    // dll과 exe가 run-time package를 사용하지 않을경우
    // dll에서의 Application객제와 exe에서의 Application객체가 서로 다르기 때문이다.
    ShowDllForm(Application,Screen,Panel2,OnDllClacResult);
    end;





    이상입니다.