我有一个想法,由于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';

解决方案 »

  1.   

    为什么还没有回我,out-process方试下,我在本机运行已经通过了!!将客户端移到其它的机子上后,连接正常,当显示窗体时提示“灾难性故障”,不知道为什么!!!还望大家多多帮我忙,这是我第一次出来工作,也是我工作中做的第一个程序!!!!
    我可不想让老板把我当白痴(虽然有点象)养着,所以还请大家不吝赐教!!
      

  2.   

    有用到ADO吗,
    很可能是这几句有错var
      i:longword;
    begin
      wpf.ShowFrm(application.Handle,i);<<i为DLL中创建窗体后,那个窗体的句柄
      wFrm:=TForm(i);
      wFrm.Show;
    end;,你单步调试一下看看是不是
      

  3.   

    这段程序在DLL中,无法调试,这些程序在本机上调试都已通过,只是不能在远程调用!!
    我现在开始对我想法产生怀疑了,是不是这种想法根本就没办法实现?