第一次试着写个简单DLL,就出现问题了(50分)

  • 主题发起人 主题发起人 wgzhou
  • 开始时间 开始时间
W

wgzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
第一次试着写个DLL,就是设置窗体的颜色和字体,代码如下:
procedure getparm(H:HWND; setform:Tform;storefile:string);export;
var

setform: Tsetform;
setform1:Tform;
storefile1:string;
implementation

{$R *.DFM}

procedure getparm(H:HWND;setform:Tform;storefile:string);
begin
try
setform1:=setform;
storefile1:=storefile;
application.handle:=H;
setform:=Tsetform.Create(application);
setform.ShowModal;
finally
setform.free;
end;
end;
procedure Tsetform.Button1Click(Sender: TObject);
begin
if colordialog1.Execute then
setform1.Color:=colordialog1.Color;
end;
//-------------------------
//问题所在:
procedure Tsetform.Button2Click(Sender: TObject);
begin
if fontdialog1.Execute then
begin
// setform1.font:=fontdialog1.font;//使用这个语句时出现:cannot assign a Tfont to a Tfont
// setform1.Font.Color:=fontdialog1.font.Color;//使用它时,正常
//使用以下三条语句的任一条时,form的字体也能变,但退出主程序时,出现访问非法地址的错误
// setform1.font.Name:=fontdialog1.font.Name;
// setform1.font.size:=fontdialog1.font.size;
setform1.font.Style:=fontdialog1.font.Style;
end;
end;

procedure Tsetform.Button3Click(Sender: TObject);
begin
setform.Close;//此行用错误,是不是在DLL中不能用CLOSE
end;
 
//问题所在:
procedure Tsetform.Button2Click(Sender: TObject);
begin
if fontdialog1.Execute then
font.assign(fontdialog1.font);//使用这个语句时出现:cannot assign a Tfont to a Tfont
end;

procedure Tsetform.Button3Click(Sender: TObject);
begin
modalresult:=mrcancel;//此行用错误,是不是在DLL中不能用CLOSE
end;

不过我想还是有问题的!在DLL间传递VCL对象是要出问题的!
 
1.setform1.font.assign(fontdialog1.font);
2.procedure getparm(H:HWND;setform:Tform;storefile:string);
begin
setform1:=setform;
storefile1:=storefile;
application.handle:=H;
setform:=Tsetform.Create(application);
setform.ShowModal;
end;
 
//问题所在:
procedure Tsetform.Button2Click(Sender: TObject);
begin
if fontdialog1.Execute then
font.assign(fontdialog1.font);//使用这个语句时出现:cannot assign a Tfont to a Tfont
end;
一样的出错结果,奇怪,form.color怎么不会出错,而form.font出错了
 
另外:
为什么在DLL中使用close会出错
 
一般是没有释放DLL资源引起的
 
使用pChar类型作为DLL的传入参数,不要使用String,你的错误不是处在Close上,而是退出动态库时存在的问题。
如果非要使用String,那么需要在主程序调用中,第一个uses BorlandMM
 
dll里不要随便分配资源而不回收处理
 
多人接受答案了。
 
后退
顶部