delphi已经可以调用了:
type
  Tshowgwqform=Procedure (AHandle:THandle);StdCall;
procedure TForm1.Button2Click(Sender: TObject);...var
 gHandle:THandle;
 showgwqform:Tshowgwqform;
begin
  gHandle:=loadlibrary('Project1.dll');
  @showgwqform:=GetProcAddress(gHandle,'showgwqform');
  showgwqform(Application.Handle ); //showgwqform是dll中显示窗体的函数
  freelibrary(gHandle);
end;在VB中,Tshowgwqform=Procedure (AHandle:THandle);StdCall;怎么改写?
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As LongPrivate Sub Command1_Click()
Dim gHandle
Dim showgwqform
gHandle = LoadLibrary("D:\Upload\Key\Project1.dll")
'下面就不知道怎么写了
showgwqform = GetProcAddress(gHandle, "showgwqform")FreeLibrary gHandle
End Sub

解决方案 »

  1.   

    VB不支持动态调用DLL函数。所以你应该静态加载。你应该在Delphi中写好控制窗体的函数,并导出,然后在VB中静态加载
      

  2.   

    谢谢 Eastunfail(恶鱼杀手) ,关于静态加载是怎么个用法?能就我上面的例子示例一下么,谢谢!
      

  3.   

    例如你导出几个函数:function CreateForm:pointer;stdcall;
    begin
     Resutl:=TForm1.Create(Nil);
    end;
    procedure DestroyForm(Form:Pointer);stdcall
    begin
      TForm(Form).Destroy;
    end;
    procedure ShowForm(Form:Pointer);stdcall
    begin
      TForm(Form).Show;
    end;
    exports
    CreateForm,ShowForm,DestroyForm;然后再VB中:
    Public Decalre Function CreateForm Lib "project1.dll" () As Long
    Public Decalre Sub DestroyForm Lib "project1.dll" (Form As Long)
    Public Decalre Sub ShowForm Lib "project1.dll" (Form As Long)
    然后你可以在你的程序里面:Dim Form As Long
    Private Sub Form_Load()
      Form=CreateForm()
      ShowForm Form
    End Sub
    Private Sub Form_Unload()
      Call DestroyForm(Form)
    End Sub
      

  4.   

    这里不用担心类型转换问题。指针是4个字节。所以VB中使用Long,而在Delphi中,我直接用强制类型转换,因为Delphi中对象变量实际上是一个指针。
      

  5.   

    我按照你说的方法去试了,说引用的内存不能为read就退出了。
    还有,窗体是是showmodal,弹出来时按不到那个Private Sub Form_Unload()
    delphi的窗体放在dll中是不是不能被VB调用?还是有其它办法?