//服务器端的DataModule
type
  TTest = class(TRemoteDataModule, ITest)
    DataSetProvider1: TDataSetProvider;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
  private
    { Private declarations }
  protected
    class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
    procedure GetValue(var I: SYSINT); safecall;  public
    { Public declarations }
  end;  LIBID_Server: TGUID = '{F56A9A6D-94D9-4D53-B08C-5CA01F2939EC}';  IID_ITest: TGUID = '{71D745E1-2AE3-4623-846B-4DC57E11C429}';
  CLASS_Test: TGUID = '{2CFC79FC-3F38-4678-9D94-9A37A033F03E}';
ITest = interface(IAppServer)
    ['{71D745E1-2AE3-4623-846B-4DC57E11C429}']
    procedure GetValue(var I: SYSINT); safecall;
  end;// *********************************************************************//
// DispIntf:  ITestDisp
// Flags:     (4416) Dual OleAutomation Dispatchable
// GUID:      {71D745E1-2AE3-4623-846B-4DC57E11C429}
// *********************************************************************//
  ITestDisp = dispinterface
    ['{71D745E1-2AE3-4623-846B-4DC57E11C429}']
    procedure GetValue(var I: SYSINT); dispid 301;
    function AS_ApplyUpdates(const ProviderName: WideString; Delta: OleVariant; MaxErrors: Integer; 
                             out ErrorCount: Integer; var OwnerData: OleVariant): OleVariant; dispid 20000000;
    function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer; 
                           Options: Integer; const CommandText: WideString; var Params: OleVariant; 
                           var OwnerData: OleVariant): OleVariant; dispid 20000001;
    function AS_DataRequest(const ProviderName: WideString; Data: OleVariant): OleVariant; dispid 20000002;
    function AS_GetProviderNames: OleVariant; dispid 20000003;
    function AS_GetParams(const ProviderName: WideString; var OwnerData: OleVariant): OleVariant; dispid 20000004;
    function AS_RowRequest(const ProviderName: WideString; Row: OleVariant; RequestType: Integer; 
                           var OwnerData: OleVariant): OleVariant; dispid 20000005;
    procedure AS_Execute(const ProviderName: WideString; const CommandText: WideString; 
                  现在客户端如何用SocketConnection.AppServer转换成ITest或ITestDisp呢?感谢 YY群的哈欠提供下面的方法, 不过只能得ITestDisp并且代码并不安全.
有高手提供更好的方法另外给分.procedure TForm3.Button1Click(Sender: TObject);
var
  I: integer;
  ADisp:ITestDisp;
begin
  {
  SocketConnection1.AppServer.GetValue(I);
  ShowMessage(IntToStr(I));} //这样肯定可以得到
  ADisp:=ITestDisp(IDispatch(SocketConnection1.AppServer));
  ADisp.GetValue(I);
  ShowMessage(IntToStr(I));
end;