// dll
procedure test(AForm:TForm);stdcall;export;
begin
  AForm.Caption := 'test';
  ShowMessage('1');
      AForm.Font.Charset := GB2312_CHARSET;
      AForm.Font.Name := '宋体';
  ShowMessage('2');
      AForm.Font.Size := 9; // 这里出错end;
// exe
procedure TForm1.Button1Click(Sender: TObject);
var
  hh:THandle;
  proc:procedure (AForm:TForm);stdcall;
begin
  hh := LoadLibrary('D:\DuoEditor\Bin\Form.dll');
  @proc := GetProcAddress(hh,'test');
  proc(Self);
  FreeLibrary(hh);
end;请问谁知道,怎么处理?
奇怪的是 AForm.Font.Name  都修改成功了。
为什么 size 不行?
不用 ShareMM。

解决方案 »

  1.   

    你把dll和exe都采用带包的方式编译试试看
      

  2.   

    在dll和exe之间,如果不是带包编译,很多东西都是两套(比如Application就是两个),其中就有管理字体的FontManager,即使你上面的代码设置不出错误,早晚也会出问题(比如你卸载dll的时候)所以,如果你一定要在dll中操作exe中的相关资源,还是采用带包的方式编译吧。你能在设置字体大小的时候报错,这说明你运气好,如果你运气不好,他不会在你调用函数的时候报错,而可能在莫名其妙的地方出现错误,那时候找起来才叫头痛呢。
      

  3.   

    带包编译。
    use sharemem
      

  4.   

    带包带包......或者麻烦一点,把TForm封个接口扔出去也可以
      

  5.   

    TK,你的消息收到。
    看看我给你留的QQ 。
    确实是带包的问题。
    不过没有用 MM 就解决了。
    谢谢,大家。