问题是:怎么在TComObject.Execute 中使用Forms单元中Application或者使用TForm对象,如Application.MessageBox(...),Form1.Show等?如果可以实现,请给例子
如果不能实现,请给原因
或者提供相关的有相关例子的电子书籍(可以下载的)或网页若能解决问题,100分是不够的,我可以再加!谢谢各位!{  Unit Name: ComTest.dpr }
library ComTest;
{%File 'Index.asp'}
uses
  ComServ, ComTest_TLB in 'ComTest_TLB.pas', ComObect in 'ComObect.pas' {ComObject: CoClass};
exports
  DllGetClassObject, DllCanUnloadNow,  DllRegisterServer,  DllUnregisterServer;
{$R *.TLB}  {$R *.RES}
begin
end.<@language =VBScript ><!--Index.asp--><HTML><BODY><TITLE> Testing Delphi ASP </TITLE><%  Set Obj = Server.CreateObject("ComTest.ComObject")  Obj.Execute %></BODY></HTML>
{  Unit Name: ComObect.pas }
unit ComObect;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses ComObj, ActiveX, AspTlb, ComTest_TLB, StdVcl;
type
  TComObject = class(TASPObject, IComObject)
  protected
    procedure OnEndPage; safecall;
    procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
    procedure Execute; safecall;
  end;
implementation
uses ComServ;
procedure TComObject.OnEndPage;
begin
  inherited OnEndPage;
end;
procedure TComObject.OnStartPage(const AScriptingContext: IUnknown);
begin
  inherited OnStartPage(AScriptingContext);
end;
procedure TComObject.Execute;
begin
  //此处代码怎么写
end;
initialization
  TAutoObjectFactory.Create(ComServer, TComObject, Class_ComObject,
    ciMultiInstance, tmApartment);
end.
{  Unit Name: ComObect.tlb }
unit ComTest_TLB;
// 此处有Delphi 内部注释,因为太长,不宜贴,我删除了这些注释 //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
interface
uses ActiveX, Classes, Graphics, StdVCL, Variants, Windows;
// 此处有Delphi 内部注释,因为太长,不宜贴,我删除了这些注释 //
const
  // TypeLibrary Major and minor versions
  ComTestMajorVersion = 1;
  ComTestMinorVersion = 0;
  LIBID_ComTest: TGUID = '{19F2FB94-C28C-49A2-89FA-FDE8607E7155}';
  IID_IComObject: TGUID = '{AB671B32-0EF9-4B70-A69D-FC701D31B527}';
  CLASS_ComObject: TGUID = '{F5B2984E-CEAB-4F5F-B91C-62849BBB4727}';
type
// Forward declaration of types defined in TypeLibrary
  IComObject = interface;
  IComObjectDisp = dispinterface;
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
  ComObject = IComObject;
// 此处有Delphi 内部注释,因为太长,不宜贴,我删除了这些注释 //
  IComObject = interface(IDispatch)
    ['{AB671B32-0EF9-4B70-A69D-FC701D31B527}']
    procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
    procedure OnEndPage; safecall;    procedure Execute; safecall;
  end;
// 此处有Delphi 内部注释,因为太长,不宜贴,我删除了这些注释 //
  IComObjectDisp = dispinterface
    ['{AB671B32-0EF9-4B70-A69D-FC701D31B527}']
    procedure OnStartPage(const AScriptingContext: IUnknown); dispid 1;
    procedure OnEndPage; dispid 2;    procedure Execute; dispid 3;
  end;
// 此处有Delphi 内部注释,因为太长,不宜贴,我删除了这些注释 //
  CoComObject = class
    class function Create: IComObject;
    class function CreateRemote(const MachineName: string): IComObject;
  end;
implementation
uses ComObj;
class function CoComObject.Create: IComObject;
begin
  Result := CreateComObject(CLASS_ComObject) as IComObject;
end;
class function CoComObject.CreateRemote(const MachineName: string): IComObject;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_ComObject) as IComObject;
end;
end.

解决方案 »

  1.   

    这样是不可能的,因为com组件作为服务在服务器上运行,未客户端提供服务。如果某个时候,突然谈出一个对话框,这样将导致,服务器将运行权限交了出去,他的代码将不能继续运行,直到有人点击了“确定“后才能继续。然而服务器一般都是无人值守的。这样的一个严重后果导至服务器无法继续服务。早期的程序中即使写了messagebox之类的函数操纵系统会以无权限的理由跳过这段代码,现在通过设置好像可以调用,但是从逻辑上讲不应该这样。
      

  2.   

    感谢findcsdn(findcsdn)的留言,实际上我写MessageBox只是为了举个例子,我的真正要表达的内容是在写ActiveX Dynamic Library时是否可用VCL控件,例如TApplication, TScreen, TForm等,或者是说写成Active Server Object时怎样将一个VCL控件或一批VCL控件封装到一个COM控件。
      

  3.   

    没有试过 tapplication ,tscreen 不过我用过ado的一些组件,就是在工程中加入 "transactional data module" 就可以了 。
    不过自己在单元中申明对象并且创建不就可以了吗? 我写ado时直接在函数中申明的。 
    例如:
    var
      Dsp: TDataSetProvider;
      Dst: TADODataSet;
    begin
      dsp:=TDataSetProvider.Create(self);
      dst:=TAdoDataSet.Create(self);
      .....tapplication 中有一个消息环,挺特殊的,不知道能不能正常运行。
      

  4.   

    是的,我就是不清楚,我曾经写过类似于MSComm的写COM口Ocx控件,可是我是用VC写的,VC写低层的东西还可以,可是写MIS之类的软件就不行了。我用Delphi写的C/S结构的软件,我想转化到B/S结构,就是不知道用什么样的方法,于是出现了我现在所提出来的问题。
      

  5.   

    不是很明白楼主的意图
    tapplication并不是在所有的应用程序中都有
    在你的com中可以随便使用vcl啊
    而且delphi也可以把vcl控件变成ocx的
    如果要添加接口在edit中点add to interface