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