我用VB调用时,第一次按按钮是好的,第二次按就提示非法操作了。我的代码
以下是
library ComTest;uses
  ComServ,
  ComTest_TLB in 'ComTest_TLB.pas',
  MyCom in 'MyCom.pas' {MyCom: CoClass};exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;
{$R *.TLB}{$R *.RES}beginend.
unit MyCom;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
  Windows, ActiveX, Classes, ComObj, ComTest_TLB, StdVcl, Unit1;type
  TMyCom = class(TTypedComObject, IMyCom)
  protected
    procedure ShowFrm; stdcall;
  end;
var
  Form1: TForm1;
implementationuses ComServ;
procedure TMyCom.ShowFrm;
begin
  form1:=TForm1.Create(TMyCom);
  form1.ShowModal;
  form1.Free; 
end;initialization
  TTypedComObjectFactory.Create(ComServer, TMyCom, Class_MyCom,
    ciMultiInstance, tmApartment);
end.
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text:='xuqi'; 
end;end.以下是VB调用代码
Private Sub Command1_Click()
    Dim a As New ComTest.MyCom
    a.ShowFrm
    Set a = Nothing
End Sub请大家帮忙!

解决方案 »

  1.   

    我去掉
    form1.Free;
    这句按按钮是正常了。
    但是退出VB程序时出现非法操作。
      

  2.   

    "0x03a04e3c"指令引用的"0x03a04e3c"内存。该内存不能为"read"。
      

  3.   

    最好增加一个Create和Destroy;
    Create中:
      inherited;
      form1:=TForm1.Create(TMyCom);
    Destroy中:
      form1.Free; 
      inherited;
    ShowFrm中:
      form1.ShowModal;
      

  4.   

    从程序上看没有错误
    很可能是OWNER有问题
    不要用tmycom 用self试试看
      

  5.   

    Focus(老鱼) ,能不能再说清楚些。哪里改一下。
      

  6.   

    form1:=TForm1.Create(Self); //*** 或 form1:=TForm1.Create(nil);
      form1.ShowModal;
      form1.Free; 
      form1 := nil ;//***
      

  7.   

    谢谢,hfyun(逮住就问),改成这个好了。
    form1:=TForm1.Create(nil);我想问一下这是为什么?
      

  8.   

    老大
    我说的那么清楚
    就是象hfyun写得那样改
    create(tmycom) tmycom是owner
    改成create(self)或(NIL)都可以
    改成self是组件类的实例指针
    改成NIL是默认的进程为owner 这看你的COM是单线程还是多线程的
    hfyun的最后一句可以合并写为freeandnil(form1)
      

  9.   

    忘了写为什么了
    因为com是引用计数的
    你的程序不退出
    你引用的COM有可能是不完全退出的
    这样处在一个不明确状态
    你FREE了FORM
    但COM调时认为有一个实例存在了
    就直接引用这个FORM当然会出错的
      

  10.   

    谢谢 Focus(老鱼)的指点。
    本人原本用VB,现在想学Dephi,觉得Dephi比VB难学。以后请大家多多帮我哦!
      

  11.   

    改成
    form1:=TForm1.Create(Self); 
    为什么不能编译
      

  12.   

    lincanwen(Too Two To) 最好增加一个Create和Destroy;
    加在哪里?
    怎么加?