本人查找了很多资料,想把Delphi窗体放到Dll文件中,源代码如下:
1. 在DLL设定的Form的设置 
unit MGRPERFM;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComCtrls, ToolWin, ImgList;
type
 TFormPERSON = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end; 
//var 
//  FormPERSON: TFormPERSON; 
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL; StdCall;implementation{$R *.DFM}
//函数据过程定义
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL;
var
 FormPERSON: TFormPERSON; //定义窗体类(上面的放到了此处)
begin
 // Copy application handle to DLL's TApplication object
 //拷贝应用程式句柄给DLL的应有程式对象
 Application.Handle := AHandle;
 FormPERSON := TFormPERSON.Create(Application);//创建控件TForm
 try
   FormPERSON.Caption := ACaption;
   FormPERSON.ShowModal;//显示此Form
   // Pass the date back in Result
   Result := False; //反回成功值
 finally
   FormPERSON.Free;
 end;
end;
2.调用
type  //在此创建一个函数类
 TShowPerSN = function (AHandle: THandle; ACaption: String): BOOL; StdCall;
 EDLLLoadError = class(Exception);//同时分创建一个出错记录类
 TMAINCLTR = class(TForm) //这里不变,系统自动生成
......
procedure TMAINCLTR.ToolButton1Click(Sender: TObject);
var  //按钮的调用事件:调用过程
 LibHandle: THandle;
 ShowPerSN: TShowPerSN;
begin
 Application.Title:='人力资源管理系统DLL文件测试程式';
 { Attempt to load the DLL 尝试装入DLL文件}
 LibHandle := LoadLibrary('MGRPERSN.DLL');
 try
   if LibHandle = 0 then
     raise EDLLLoadError.Create('Unable to Load DLL(无法成功装入MGRPERSN.DLL)');
   @ShowPerSN := GetProcAddress(LibHandle, 'ShowPerSN');
   if not (@ShowPerSN = nil) then
     ShowPerSN(Application.Handle, '人事资料管理')//呼叫出窗体
   else
     RaiseLastWin32Error;
 finally
   FreeLibrary(LibHandle); // Unload the DLL.
 end;
end;
但是运行后报错,错误提示如下:
 Access violation at dress 00403AA in module 'project1.exe'. Read of address 0153AF50.
请问上面Dll的创建、调用是否正确,若不正确,该怎么改?谢谢!

解决方案 »

  1.   

    你在MGRPERSN.dpr中是否添加了
    //********************
    Exports
      ShowPerSN;
    //*********************
      

  2.   

    function ShowPerSN(AHandle: THandle; ACaption: String):BOOL;
    var
     FormPERSON: TFormPERSON; //定义窗体类(上面的放到了此处)
    begin
     // Copy application handle to DLL's TApplication object
     //拷贝应用程式句柄给DLL的应有程式对象
     Application.Handle := AHandle;
     FormPERSON := TFormPERSON.Create(Application);//创建控件TForm
     try
       FormPERSON.Caption := ACaption;
       FormPERSON.ShowModal;//显示此Form
       // Pass the date back in Result
       Result := False; //反回成功值
     finally
       FormPERSON.Free;
     end;
    end;
    exports ShowPerSN;
      

  3.   

    输出调用接口当然添加了,如下:
    library MGRPERSN;
    uses
     SysUtils, Classes,
     MGRPERFM in 'MGRPERFM.pas' {FormPERSON};//1.Form的代码(与一般的Form一样){$R *.RES}
    exports
      ShowPerSN;//2.函数输出口定义
    begin
    end.
      

  4.   

    project->options->packages
    选中build with runtime packages
      

  5.   

    看一看"Delphi5开发者指南", dll创建和调用都写得很详细~
      

  6.   

    project->options->packages
    选中build with runtime packages
    或者把function ShowPerSN(AHandle: THandle; ACaption: String):BOOL; StdCall;该为function ShowPerSN(AHandle: TApplication; ACaption: String):BOOL; StdCall;Application :=  Ahandle
      

  7.   

    function ShowPerSN(AHandle: TApplication; ACaption: <font color ="blue" >String</font> 改为pchar 即可):BOOL; StdCall;
      

  8.   

    很多人都会忘了,你在dll窗体里引用了什么单元,调用窗体里面要加如同样的单元,要不然会出错,我想你应该是这个问题,我也碰到过哦,记得给我分哦。