2)与DLL中的声明一样。 如: showform(form:Tform);Far;external'yproject_dll.dll'; 3)调用时传过去的参数类型最好也与windows c++一样。 4)调用时DLL必须在windows搜索路径中,顺序是:当前目录;Path路径;windows;widows\system;windows\ssystem32; 六 调用动态载入
1 .建立一种过程类型[如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是怎么回事了]。如:
| type mypointer=procedure(form:Tform);Far;external; var Hinst:Thandle; showform:mypointer; begin Hinst:=loadlibrary('yproject_dll');//Load一个Dll,按文件名找。 showform:=getprocaddress(Hinst,'showform');//按函数名找,大小写敏感。如果你知道自动化对象的本质就清楚了。 showform(application.mainform);//找到函数入口指针就调用。 Freelibrary(Hinst); end; | 七 .在DLL建立一个TForM
1 把你的Form Uses到Dll中,你的Form用到的关联的单元也要Uses进来[这是最麻烦的一点,因为你的Form或许Uses了许多特殊的单元或函数] 2 传递一个Application参数,用它建立Form. 八 .在DLL中建立一个TMDIChildForM
1 Dll中的MDIForm.FormStyle不用为fmMDIChild. 2 在CreateForm后写以下两句:
| function ShowForm(mainForm:TForm):integer;stdcall var Form1: TForm1; ptr:PLongInt; begin ptr:=@(Application.MainForm);//先把dll的MainForm句柄保存起来,也无须释放,只不过是替换一下 ptr^:=LongInt(mainForm);//用主调程序的mainForm替换DLL的MainForm。MainForm是特殊的WINDOW,它专门管理Application中的Forms资源. //为什么不直接Application.MainForm := mainForm,因为Application.MainForm是只读属性 Form1:=TForm1.Create(mainForm);//用参数建立 end;
| 备注:参数是主调程序的Application.MainForm
|