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