DLL中如何嵌入对话框,这样我在其他程序中调用的时候可以出现DLL中的对话框很急,谢谢哪位告知详细

解决方案 »

  1.   

    DLL中开放一个接口就可以了
    procedure ShowDlg; stdcall;
    begin
      with TfrmDlg.Create(Application) do
      try
        ShowModal;
      finally
        Free;
      end;
    end;
    调用时声明此接口就可以用了
      

  2.   

    uses dialogs;procedure ShowDlg(s:Pchar);stdcall;
    begin
      showmessage(s);
      if MessageDlg(s,mtConfirmation, [mbYes, mbNo], 0) = mrYes then exit;
      if MessageDlgPos(s,mtConfirmation,[mbYes, mbNo],0,300,300)=mrYes then exit;
    end;exports
      ShowDlg;
      

  3.   

    麻烦把完整代码写出来,谢谢,我按照上面得试了一下,出错,不知道是不是我格式位置不对,我的代码如下:library BAComReport;uses
      ComServ, dialogs,
      BAComReport_TLB in 'BAComReport_TLB.pas',
      ReportUnit in '..\Com\ReportUnit.pas' {BAWebReport: TMtsDataModule} {BAWebReport: CoClass};
    procedure ShowDlg(s:Pchar);stdcall;
    begin
      showmessage(s);
      if MessageDlg(s,mtConfirmation, [mbYes, mbNo], 0)=mrYes then exit;
      if MessageDlgPos(s,mtConfirmation,[mbYes, mbNo],0,300,300)=mrYes then exit;
    end;
    exports
      ShowDlg;{$R *.TLB}{$R *.RES}beginend.
      

  4.   

    说明一下,我现在是在COM中调用,我的COM组件其实其实就是一个DLL,但是外面调用的时候,我DLL内部根据参数情况相应的输入对话框提示用户,包括确认之类的,如果才能做到,谢谢
      

  5.   


    1  创建包含窗体的DLL
    实例程序:在Delphi 710 中,分别创建包含日
    历组件(Tcalendar) 的模式窗体和非模式窗体,并
    将窗体添加至DLL 项目中; 然后,在Visual Basic
    应用中直接调用上述窗体.
    1. 1  模式窗体
    包含模式窗体的DLL 项目文件为:
    library CalendarLib ; / / DLL 项目名称
    uses / / 项目引用的单元:
     SysUtils , Classes ,
     DLLFrm in ’DLLFrm. pas’{DLLForm} ; / / 窗体文件
    exports
     ShowCalendar ; / / DLL 导出的过程
    begin
    end.
    其中,ShowCalendar 的函数原型为:
    function ShowCalendar (AHandle : THandle) : TDate2
    Time ; StdCall ;
    Visual Basic 610 程序通过调用ShowCalendar
    函数来显示日历窗体(见图1 所示) ,当选择日历
    上的日期后,该函数将日期返回给调用程序:
    function ShowCalendar ( AHandle : THandle ) :
    TDateTime ;
    var
     DLLForm: TDllForm; / / TDLLForm = class(TForm)
    begin
     Application. Handle : = AHandle ; / / 将调用程序实例句柄赋给DLL 应用对象
     DLLForm : = TDLLForm. Create (Applica2tion) ; / / 动态创建窗体
     try
      DLLForm. ShowModal ; / / 显示模式窗体
      Result : = DLLForm. calDLLCalendar. Cal2endarDate ; / / 返回日历控件日期
     finally
      DLLForm. Free ; / / 释放窗体
     end ;
    end;
    这里必须传递的一个参数是调用程序的实例
    句柄(THandle) .DLL 中的应用对象和发起调用的
    应用对象是不同的,为了让DLL 中的窗体能在调
    用程序中显示,必须把调用程序的句柄赋给DLL
    的Application. Handle 属性.
    1. 2  非模式窗体
    包含非模式窗体的DLL 至于得提供两个过
    程:一个负责创建和显示窗体;另一个用于释放窗
    体. 其过程原型分别为:
    function ShowCalendar ( AHandle : THandle ) :Longint ; stdCall ;
    procedure CloseCalendar (AFormRef : Longint ) ;stdcall ;
    它们的实现体分别为:
    function ShowCalendar ( AHandle : THandle ) :Longint ;
    var
     DLLForm: TDllForm;
    begin
     Application. Handle : = AHandle ;
     DLLForm : = TDLLForm. Create (Applica2tion) ;
     Result : = Longint (DLLForm) ; / / 返回窗体实例句柄
     DLLForm. Show; / / 显示非模式窗体
    end ;
    procedure CloseCalendar (AFormRef : Longint) ;
    begin
     if AFormRef > 0 then / / 检查窗体句柄
      TDLLForm(AFormRef) . Release ; / / 释放
    end ;
    其中,ShowCalendar 函数和模式窗体中的同名函数
    的功能类似:把传入的应用程序句柄赋给DLL 的
    应用句柄,然后创建窗体. 所不同的是:该函数并
    没有释放窗体,而是返回长整型的窗体实例句柄,
    以便调用程序可以使用这个句柄来维护所创建的
    窗体. 另外,Delphi 的函数调用与Visual C ++ 的相
    比有点特别:当调用执行至结果赋值语句(Result)
    时,并不立刻从函数中返回,除非结果赋值语句是
    函数体的最后一条语句;而Visual C ++ 的函数调
    用遇return 语句即返回.
    CloseCalendar 过程先检查窗体句柄的有效
    性,然后调用Release 方法释放窗体. 此处,发起调
    用的应用程序必须把ShowCalendar 函数返回的窗
    体句柄回传给该过程. 非模式窗体的DLL 项目和
    模式窗体的类似,只是多了一个导出过程Close2
    Calendar.
    2  Visual Basic 调用DLL 中的窗体过程
    Visual Basic 直到610 版本还不能创建标准的
    Win32 DLL ,不过它可以使用Windows API 和其他
    语言工具创建的DLL.
    2. 1  调用模式窗体
    在使用上面创建的DLL 前,先将DLL 置于系
    统路径中. 示例Visual Basic 应用可只包含一个窗
    体,并在该窗体中放置一个命令按钮,以引用DLL
    中模式窗体;放置一个标签,以显示从日历组件中
    选择的日期.
    在窗体通用段中声明DLL 的过程原型:
    Private Declare Function ShowCalendar Lib“Cal2endarLib.DLL”(ByVal Handle As Long) As Date
    对该过程的调用为:
    Private Sub GetCalendar Click()
     Lbl = ShowCalendar (App. PrevInstance);
    End Sub
    在声明DLL 过程原型时,需特别注意过程的
    实现机制(函数和子程序) 和过程名称大小写的精
    确匹配,以及参数类型和参数传递方式(值传递和
      

  6.   

    引用传递) 的对应. 就参数传递而言,Delphi 缺省为传值,而Visual Basic 缺省为传地址,要使后者
    也能以传值方式进行传递,须在参数前添加ByVal关键字.在调用ShowCalendar 函数时,传递的应用程
    序句柄(长整型) 是应用对象的PrevInstance 属性,而不是hInstance 属性. 这一点和Delphi 不同,Delphi 传递的是应用对象的Handle 属性.
    2. 2  调用非模式窗体
    示例Visual Basic 应用可只包含一个窗体,并在该窗体中放置两个命令按钮,分别用来显示窗体和关闭窗体.
    (1) 在窗体通用声明段中声明DLL 中的过程原型及窗体级变量.
    Private Declare Function ShowCalendar Lib“Cal2endarMLLib. DLL”( ByVal Handle As Long) As Long
    Private Declare Sub CloseCalendar Lib ”Calen2darMLLib.DLL”( ByVal Handle As Long)
    Private FHandle As Long   / / 用于存放DLL的窗体句柄
    (2) 在窗体加载事件中初始化窗体句柄.
    Private Sub Form Load ()
     FHandle = 0
    End Sub
    (3) 显示非模式窗体.
    Private Sub ShowCalendar Click()
     If FHandle = 0 Then   / / 保证只显示一份窗体实例
      FHandle = ShowCalendar (App. PrevIn2stance)
     End If
    End Sub
    (4) 释放窗体.
    Private Sub CloseCalendar Click()
     If FHandle < > 0 Then   / / 先判断窗体实例句柄的有效性
      CloseCalendar (FHandle)
      FHandle = 0
     End If
    End Sub
      

  7.   

    是这样的,我的COM(其实就是DLL组件)中有很多自定义的函数过程等,我在调用其中一个过程或函数的时候需要用到对话框,我直接用MESSAGEdlg之类的,但是我在外面程序中调用的时候(如外面其他程序调用该DLL)并不出现对话框,怎么回事,该怎么做?其实就是DLL代码内部一个函数调用另外一个函数(对话框功能),然后我用ASP或其他语言程序调用的时候,前台会出现对话框,如何实现