我将一个窗体单元包含到了一个DLL工程中,再用两个函数来完成显示和关闭窗体,(也是《Delphi6开发人员指南》一书中第187页的例子,我把这个例子中的窗体改了,我把那个日期控件删除了,换上了ADO组件和DBGrid组件,编译正常,调用时出错提示未调用Coinstnace())。
是不是dll包含的窗体一加入OLE组件就成了COM了??我现在想实现一个功能,就是将软件的主窗体做到一个dll中,客户端远程COM调用这个dll文件,将主窗体显示到客户端,不知道大家有什么好的方法,能给你思路的朋友,我另外再送个200分

解决方案 »

  1.   

    刚才有个函数打错了,调用时出错提示未调用Coinitialize())。
      

  2.   

    在dll中一定要显试调用Coinitialize(nil)的,一开始就调用,uses ActiveX,退出的时候调用CoUnInitialize;
      

  3.   

    在dll中一定要显试调用Coinitialize(nil)的,一开始就调用,uses ActiveX,退出的时候调用CoUnInitialize;
      

  4.   

    在dll中一定要显试调用Coinitialize(nil)的,一开始就调用,uses ActiveX,退出的时候调用CoUnInitialize;
      

  5.   

    coinitialize(nil)与couninitialize;两个函数应该放在什么位置??
    library CalendarMLLib;《《《《这是DLL文件uses
      ShareMem,
      SysUtils,
      Classes,
      activex,
      DLLFrm in 'DLLFrm.pas' {DLLForm};exports
      ShowCalendar,
      CloseCalendar;
      
    begin
    CoInitialize(nil);《《放到了此处
    end.
    unit DLLFrm;  <<<<<<<<<<<<<这是窗体文件interfaceuses
      SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, Grids, Calendar, DB, ADODB, DBGrids,activex;type  TDLLForm = class(TForm)
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
      end;{ Declare the export function }
    function ShowCalendar(AHandle: THandle; ACaption: String): Longint; stdCall;
    procedure CloseCalendar(AFormRef: Longint); stdcall;
    implementation
    {$R *.DFM}function ShowCalendar(AHandle: THandle; ACaption: String): Longint;
    var
      DLLForm: TDllForm;
    begin
      // Copy application handle to DLL's TApplication object
      Application.Handle := AHandle;
      DLLForm := TDLLForm.Create(Application);
      Result := Longint(DLLForm);
      DLLForm.Caption := ACaption;
      DLLForm.Show;  
    end;procedure CloseCalendar(AFormRef: Longint);
    begin
      if AFormRef > 0 then
      begin
        TDLLForm(AFormRef).Release;
        CoUnInitialize;《《《《《《《《《《《《放在了此处,因为调用这个函数将退出
      end;
    end;end.我放到这两个地方之后,半闭程序时总提示出错。
      

  6.   

    function ShowCalendar(AHandle: THandle; ACaption: String): Longint;
    var
      DLLForm: TDllForm;
    begin
      // Copy application handle to DLL's TApplication object
      Application.Handle := AHandle;
      CoInitialize(nil);
      DLLForm := TDLLForm.Create(Application);
      Result := Longint(DLLForm);
      DLLForm.Caption := ACaption;
      DLLForm.Show;  
    end;procedure CloseCalendar(AFormRef: Longint);
    begin
      if AFormRef > 0 then
      begin
        TDLLForm(AFormRef).Release;
        CoUnInitialize;《《《《《《《《《《《《放在了此处,因为调用这个函数将退出
      end;
    end;end.