Q&A

  • 메인폼의 panel1에 dll폼을 집어 넣어려고 하는데
sub.dll파일을 생성하고, 메인 폼의 panel1에 집어 넣으려 합니다.
에러가 발생하고 있습니다. 무엇이 문제인지 알고 싶습니다.

<!--CodeS-->

unit umain;        //메인 폼

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}
procedure ShowTestForm(AHandle : THandle ; Parent : TWinControl); stdCall;external 'sub.dll';

procedure TfrmMain.Button1Click(Sender: TObject);
begin
     ShowTestForm(Application.Handle, Panel1);
end;

end.


library sub; //sub.dll 파일

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  usub in 'usub.pas' {frmSub};

{$R *.res}
exports
       ShowTestForm;

begin
end



unit usub; // sub에 속한 Form파일

interface

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

type
  TfrmSub = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
procedure ShowTestForm(AHandle : THandle; Parent : TWinControl); stdCall;
var
  frmSub: TfrmSub;

implementation

{$R *.dfm}

procedure ShowTestForm(AHandle : THandle ; Parent : TWinControl); stdCall;
var ef : TfrmSub;
begin
     Application.Handle := AHandle;
     ef := TfrmSub.Create(Application);
     ef.BorderIcons := [];
     ef.BorderStyle := bsSizeToolWin;
     ef.Show;
end;
end.

<!--CodeE-->
2  COMMENTS
  • Profile
    이중철 2005.03.29 05:16
    Parent : TWinControl
    이 부문이 눈에 거슬리거든요
    이 경우 Parent 부문이 포인터로 올텐데 그 위치가 어플리케이션(실행화일부)의 힙의 상대어드레스
    일거에요 DLL의 힙 영역과 틀리겠죠
    이부문을 핸들로 바꾸어서 함 해보세요
    그리고 Parent설정부문은 이렇게 하면될듯 하고요
    Windows.SetParent( ef.Handle , hPanel );
    이거 말고는 특이점이 없는듯 합니다. 그럼이만 스르륵...

  • Profile
    김광진 2005.03.31 00:27

    parent를 handle처리했을 때..

    dll폼이 panel1안에 들어오기는 하는데...
    panel1의 범위를 벗어나서 크게 들어갑니다.
    그래서 minimize, maximize 이런 버튼들이 보이질 않아요.
    panel1 안에 딱들어가게 하려면 어떻게 해야 하나요?