我用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请大家帮忙!
以下是
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请大家帮忙!
解决方案 »
- 定义参数为空 但报错了
- 向大家请教delphi保存图片问题!!
- memo的打印问题
- 怎样在stringGrid里用回车代替TAB实现焦点在单元格里移动,和怎样用DELETE删除一行?
- 急盼回复:如何实现DELPHI6风格的跨行TOOLBAR
- SQL语句中的UPDATE可否这么写?
- ADO中如何中得到数据库名和表名??
- 请问如何读取系统已经注册的ActiveX和COM组件???
- 如何将指针所指位置转换为16进制文本
- 小妹?^_^?捉虫:application.Terminate;方法不好用啊!!
- 急!!!急!!!急!!!指针地址高手请进!!! 在线等待,解决问题送分!!!
- 讨论:如何获得网络打印机中的打印作业的相关信息,如:打印时间、打印页数、发送人IP地址及计算机名?附参考资料。
form1.Free;
这句按按钮是正常了。
但是退出VB程序时出现非法操作。
Create中:
inherited;
form1:=TForm1.Create(TMyCom);
Destroy中:
form1.Free;
inherited;
ShowFrm中:
form1.ShowModal;
很可能是OWNER有问题
不要用tmycom 用self试试看
form1.ShowModal;
form1.Free;
form1 := nil ;//***
form1:=TForm1.Create(nil);我想问一下这是为什么?
我说的那么清楚
就是象hfyun写得那样改
create(tmycom) tmycom是owner
改成create(self)或(NIL)都可以
改成self是组件类的实例指针
改成NIL是默认的进程为owner 这看你的COM是单线程还是多线程的
hfyun的最后一句可以合并写为freeandnil(form1)
因为com是引用计数的
你的程序不退出
你引用的COM有可能是不完全退出的
这样处在一个不明确状态
你FREE了FORM
但COM调时认为有一个实例存在了
就直接引用这个FORM当然会出错的
本人原本用VB,现在想学Dephi,觉得Dephi比VB难学。以后请大家多多帮我哦!
form1:=TForm1.Create(Self);
为什么不能编译
加在哪里?
怎么加?