Q&A

  • DLL에서 값을 전달하려고 하는데...
DLL간 값을 전달하려고 합니다. 그런데 메모리 맵이 아닌 SendMessage를 써서 해결하려고 하는데 잘 되지가 않아 고수님들의 도움을 요청합니다. 자료실과 Q&A에 찾아 보니 여기에 대한 자료가 있긴한데 되지가 않아서요.그래서 혹시 SendMessage를 이용해보신 분은 소스를 주시면 감사하겠습니다.

1  COMMENTS
  • Profile
    2000.08.15 16:21
    간단한 예제 나갑니다.



    참고로 COPYDATASTRUCT를 이용한 WM_COPYDATA 메세지가 있습니다.

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

    // Exe

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

    program Project1;



    uses

    Forms,

    Unit1 in 'Unit1.pas' {Form1};



    {$R *.RES}



    begin

    Application.Initialize;

    Application.CreateForm(TForm1, Form1);

    Application.Run;

    end.

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



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

    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;



    type

    TDllFormShow = function(AOwner: TForm): TForm; stdcall;



    TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    DllFormShow: TDllFormShow;

    hLibModule: THandle;

    DllForm: TForm;

    s: string;

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;

    USER_MESSAGE: Cardinal;



    implementation



    {$R *.DFM}



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    hLibModule := LoadLibrary(PChar('Project2.dll'));

    if hLibModule <> 0 then

    begin

    @DllFormShow := GetProcAddress(hLibModule, PChar('DllFormShow'));

    if @DllFormShow <> nil then

    begin

    DllForm := DllFormShow(Form1);

    DllForm.Show;

    s := 'data';

    SendMessage(DllForm.Handle, USER_MESSAGE, 0, LPARAM(@s));

    // s(변수)의 Address를 LParam형(Longint)형으로 TypeCast ****************

    end;

    end;

    end;



    initialization

    USER_MESSAGE := RegisterWindowMessage(PChar('Trans Data'));



    end.

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



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

    // DLL

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

    library Project2;



    uses

    Forms,

    Unit2 in 'Unit2.pas' {Form2};



    {$R *.RES}



    exports

    DllFormShow;



    begin

    end.

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



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

    unit Unit2;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;



    type

    TForm2 = class(TForm)

    private

    { Private declarations }

    public

    { Public declarations }

    procedure WndProc(var message: TMessage); override;

    end;



    var

    Form2: TForm2;

    USER_MESSAGE: Cardinal;



    function DllFormShow(AOwner: TForm): TForm; export; stdcall;



    implementation



    {$R *.DFM}



    function DllFormShow(AOwner: TForm): TForm;

    begin

    Form2 := TForm2.Create(AOwner);

    Result := Form2;

    end;



    procedure TForm2.WndProc(var message: TMessage);

    begin

    with message do

    begin

    if Msg = USER_MESSAGE then

    begin

    Canvas.TextOut(10, 10, string(Pointer(LParam)^));

    // LParam의 포인터의 값을 string으로 TypeCast

    end;

    end;

    inherited;

    end;



    initialization

    USER_MESSAGE := RegisterWindowMessage(PChar('Trans Data'));



    end.

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



    김태영 wrote:

    > DLL간 값을 전달하려고 합니다. 그런데 메모리 맵이 아닌 SendMessage를 써서 해결하려고 하는데 잘 되지가 않아 고수님들의 도움을 요청합니다. 자료실과 Q&A에 찾아 보니 여기에 대한 자료가 있긴한데 되지가 않아서요.그래서 혹시 SendMessage를 이용해보신 분은 소스를 주시면 감사하겠습니다.