服务器端的二个单代码:
====主窗口
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
nClientCount:integer;
public
{ Public declarations }
procedure UpdateClientNum(i:integer);
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.UpdateClientNum(i: integer);
begin
nclientCount:=nClientCount+i;
Label2.Caption:='客户数:'+IntToStr(nClientCount);
//当我改成Label1.caption:=...时,当客户端一运行,服务器端就会死机,并且客户端
//也无法正常运行。
end;end.======远程数据模块
unit Unit2;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, Project1_TLB, StdVcl, DB, ADODB, Provider;type
TMyFirstDCOMServer = class(TRemoteDataModule, IMyFirstDCOMServer)
DataSetProvider1: TDataSetProvider;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
procedure RemoteDataModuleCreate(Sender: TObject);
procedure RemoteDataModuleDestroy(Sender: TObject);
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
public
{ Public declarations }
end;implementation{$R *.DFM}uses unit1;class procedure TMyFirstDCOMServer.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;procedure TMyFirstDCOMServer.RemoteDataModuleCreate(Sender: TObject);
begin
Form1.UpdateClientNum(1);
end;procedure TMyFirstDCOMServer.RemoteDataModuleDestroy(Sender: TObject);
begin
Form1.UpdateClientNum(-1);
end;
//当主窗口UpdateClientNum方法中的代码Label2改成Label1后,程序运行
//RemoteDataModuleCreate方法中Form1.updateClientNum(-1)就停止不运行了。
//我跟踪看了一下,发现是停在主窗口UpdateClientNum方法中的Label1.caption...赋值
//这一语句上面。initialization
TComponentFactory.Create(ComServer, TMyFirstDCOMServer,
Class_MyFirstDCOMServer, ciMultiInstance, tmApartment);
end.客户端程序代码:====客户端主窗口代码:
unit Client;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}uses ClientDM;procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.ClientDataSet1.Active:=True;
end;end.
====客户端数据模块代码:
unit ClientDM;interfaceuses
SysUtils, Classes, DB, DBClient, MConnect;type
TDataModule2 = class(TDataModule)
DCOMConnection1: TDCOMConnection;
DataSource1: TDataSource;
ClientDataSet1: TClientDataSet;
private
{ Private declarations }
public
{ Public declarations }
end;var
DataModule2: TDataModule2;implementation{$R *.dfm}end.以上代码在Delphi7中运行很正常,将UpdateClientNum方法中Label2改成label1也能正常运行。但在Delphi2006中就发生死机了。不知哪位高手能指点一下是程序中哪里有问题?谢谢!
====主窗口
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
nClientCount:integer;
public
{ Public declarations }
procedure UpdateClientNum(i:integer);
end;var
Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.UpdateClientNum(i: integer);
begin
nclientCount:=nClientCount+i;
Label2.Caption:='客户数:'+IntToStr(nClientCount);
//当我改成Label1.caption:=...时,当客户端一运行,服务器端就会死机,并且客户端
//也无法正常运行。
end;end.======远程数据模块
unit Unit2;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, Project1_TLB, StdVcl, DB, ADODB, Provider;type
TMyFirstDCOMServer = class(TRemoteDataModule, IMyFirstDCOMServer)
DataSetProvider1: TDataSetProvider;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
procedure RemoteDataModuleCreate(Sender: TObject);
procedure RemoteDataModuleDestroy(Sender: TObject);
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
public
{ Public declarations }
end;implementation{$R *.DFM}uses unit1;class procedure TMyFirstDCOMServer.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;procedure TMyFirstDCOMServer.RemoteDataModuleCreate(Sender: TObject);
begin
Form1.UpdateClientNum(1);
end;procedure TMyFirstDCOMServer.RemoteDataModuleDestroy(Sender: TObject);
begin
Form1.UpdateClientNum(-1);
end;
//当主窗口UpdateClientNum方法中的代码Label2改成Label1后,程序运行
//RemoteDataModuleCreate方法中Form1.updateClientNum(-1)就停止不运行了。
//我跟踪看了一下,发现是停在主窗口UpdateClientNum方法中的Label1.caption...赋值
//这一语句上面。initialization
TComponentFactory.Create(ComServer, TMyFirstDCOMServer,
Class_MyFirstDCOMServer, ciMultiInstance, tmApartment);
end.客户端程序代码:====客户端主窗口代码:
unit Client;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}uses ClientDM;procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.ClientDataSet1.Active:=True;
end;end.
====客户端数据模块代码:
unit ClientDM;interfaceuses
SysUtils, Classes, DB, DBClient, MConnect;type
TDataModule2 = class(TDataModule)
DCOMConnection1: TDCOMConnection;
DataSource1: TDataSource;
ClientDataSet1: TClientDataSet;
private
{ Private declarations }
public
{ Public declarations }
end;var
DataModule2: TDataModule2;implementation{$R *.dfm}end.以上代码在Delphi7中运行很正常,将UpdateClientNum方法中Label2改成label1也能正常运行。但在Delphi2006中就发生死机了。不知哪位高手能指点一下是程序中哪里有问题?谢谢!
哪位大侠能指点一下?谢谢!