我有一个想法,由于CS程序升级客户端的时候要对很多台客户机升级,比较麻烦。我想有没有办法上客户机的程序都放到服务上,客户机登陆的时候从服务端把操作界面调到客户端来操作,这样只要更新服务器端的程序,客户机也就能跟着更新了!
我试着做了一下,遇到了一些问题,希望大家帮忙,问题如下:我先做了一个包含窗体调用的DLL文件,然后用in-process方式做了一个com,在com的接口中定义了两个方法,一个showFrm,一个closeFrm来显示和关闭窗体,然后又做了一个客户端(控制器),通过coWpftest.createRemote('wpf-ht')来联接服务器端,然后就调用showFrm来显示窗体.在本机测试通过,可是把客户端程序移到其它的机子上后,当调用coWpftest.createRemote('wpf-ht')时,提示类没有注册。无法实现,(首先声明,我的dcomcnfg中的配置都正确)。不知是什么原因,后来听说由于是in-process方式,服务器端没有其宿主程序,所以出现那种错误,但是dllhost.exe不就是干那事的东东嘛。迷茫中,就相信是吧!
我把in-process方式改成了out-process方式,在本机调试过程中,连接com通过,但当showFrm时出错了,提示”Project ClientPro.exe raised Exception class EAccessViolation with message'Access violation at address 00000111.readof address 00000111'.process stopped.Use Step or Run to continue.“我不知道原因是什么!!把客户端移到其它的机子上连接也能通过,可是shwoFrm依然不行。不过把这个显示窗体这段程序放在服务器端的窗体上可以正常调用。
以下是一程序原码:这是客户端显示窗体的一段代码:
var
Form1: TForm1;
wFrm:TForm;
wpf:IWpfTest;procedure TForm1.Button2Click(Sender: TObject);
var
i:longword;
begin
wpf.ShowFrm(application.Handle,i);<<i为DLL中创建窗体后,那个窗体的句柄
wFrm:=TForm(i);
wFrm.Show;
end;这是服务器端的DLL文件中生成窗体的代码:
function ShowCalendar(AHandle: THandle): Longint;《《AHandle就是上面程 序 application.Handle传过来的!var
DLLForm: TDllForm;
begin
// Copy application handle to DLL's TApplication object
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application);
Result := Longint(DLLForm);
DLLForm.Show;
end;
这是com类中接口的声明,和调用dll文件中两函数的声明
TWPFTest = class(TAutoObject, IWPFTest)
protected
procedure CloseFrm(FrmRef: LongWord); safecall;
procedure ShowFrm(AHandle: OLE_HANDLE; var Frm: LongWord); safecall;
{ Protected declarations }
end; function ShowCalendar(AHandle:THandle):longint;stdcall;
external 'CalendarMLLib.dll';
procedure CloseCalendar(AFrmRef:Longint);stdcall;
external 'CalendarMLLib.dll';
我试着做了一下,遇到了一些问题,希望大家帮忙,问题如下:我先做了一个包含窗体调用的DLL文件,然后用in-process方式做了一个com,在com的接口中定义了两个方法,一个showFrm,一个closeFrm来显示和关闭窗体,然后又做了一个客户端(控制器),通过coWpftest.createRemote('wpf-ht')来联接服务器端,然后就调用showFrm来显示窗体.在本机测试通过,可是把客户端程序移到其它的机子上后,当调用coWpftest.createRemote('wpf-ht')时,提示类没有注册。无法实现,(首先声明,我的dcomcnfg中的配置都正确)。不知是什么原因,后来听说由于是in-process方式,服务器端没有其宿主程序,所以出现那种错误,但是dllhost.exe不就是干那事的东东嘛。迷茫中,就相信是吧!
我把in-process方式改成了out-process方式,在本机调试过程中,连接com通过,但当showFrm时出错了,提示”Project ClientPro.exe raised Exception class EAccessViolation with message'Access violation at address 00000111.readof address 00000111'.process stopped.Use Step or Run to continue.“我不知道原因是什么!!把客户端移到其它的机子上连接也能通过,可是shwoFrm依然不行。不过把这个显示窗体这段程序放在服务器端的窗体上可以正常调用。
以下是一程序原码:这是客户端显示窗体的一段代码:
var
Form1: TForm1;
wFrm:TForm;
wpf:IWpfTest;procedure TForm1.Button2Click(Sender: TObject);
var
i:longword;
begin
wpf.ShowFrm(application.Handle,i);<<i为DLL中创建窗体后,那个窗体的句柄
wFrm:=TForm(i);
wFrm.Show;
end;这是服务器端的DLL文件中生成窗体的代码:
function ShowCalendar(AHandle: THandle): Longint;《《AHandle就是上面程 序 application.Handle传过来的!var
DLLForm: TDllForm;
begin
// Copy application handle to DLL's TApplication object
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application);
Result := Longint(DLLForm);
DLLForm.Show;
end;
这是com类中接口的声明,和调用dll文件中两函数的声明
TWPFTest = class(TAutoObject, IWPFTest)
protected
procedure CloseFrm(FrmRef: LongWord); safecall;
procedure ShowFrm(AHandle: OLE_HANDLE; var Frm: LongWord); safecall;
{ Protected declarations }
end; function ShowCalendar(AHandle:THandle):longint;stdcall;
external 'CalendarMLLib.dll';
procedure CloseCalendar(AFrmRef:Longint);stdcall;
external 'CalendarMLLib.dll';
解决方案 »
- 关于远程访问数据库问题
- ADOTable 连某目录下*.db数据表
- Adoquery是不是不能执行'select * into [数据库绝对地址].[表名] From 表名'的SQL语句
- 如何自己编写一个小功能IDE??
- 大家看一下,一个莱鸟的问题。 这是怎么回事?
- 怎样取出一个汉字的拼音的首字母或全写拼音?
- IntraWeb: 如何访问URL,不通过IWURL控件?
- Delphi6安装Raize4的问题????在线等啊!
- 读取数据表里的数据
- 应该如何汉化Delphi5的出错提示?
- 为什么用 popupmenu1.Items.Add('项目'); 添加一个菜单项会出错啊。应该怎样添加啊。
- 特别奇怪的Dll释放问题,FreeLibrary就会出错.......
我可不想让老板把我当白痴(虽然有点象)养着,所以还请大家不吝赐教!!
很可能是这几句有错var
i:longword;
begin
wpf.ShowFrm(application.Handle,i);<<i为DLL中创建窗体后,那个窗体的句柄
wFrm:=TForm(i);
wFrm.Show;
end;,你单步调试一下看看是不是
我现在开始对我想法产生怀疑了,是不是这种想法根本就没办法实现?