Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов метода сервера через SocketConnection


landy ©   (2003-06-19 14:36:00) 

Возможна ли вообще реализация вызовов метода сервера через SocketConnection? Все примеры, которые я смотрел, используют для этого либо DCOM, либо CORBA.


landy   (2003-06-24 10:31:00) [1]

Угу, за прошедших три дня уже сам разобрался. Проблема была (и есть) в C++ builder, который почему-то не может сымпортировать только что им же созданную библиотеку типов. Delphi нормально все импортирует и работает. Может сталкивался с подобным. Описываю удаленный модуль данных, интерфейс, причем моего кода там пока нет вообще, кроме одного описания пустого метода. При компиляции сгенеренного кода:

 TVariant __fastcall AS_ApplyUpdates(BSTR ProviderName/*[in]*/, TVariantInParam Delta/*[in]*/, long MaxErrors/*[in]*/, long* ErrorCount/*[out]*/, TVariant* OwnerData/*[in,out]*/)
 {

>    return GetDefaultInterface()->AS_ApplyUpdates(ProviderName/*[in]*/,
>Delta/*[in]*/, MaxErrors/*[in]*/, ErrorCount/*[out]*/,
>OwnerData/*[in,out]*/);

 }

  компилятор вываливает ошибку "Type mismatch in parameter 'Delta' (wanted const OleVariant, got TVariantParam). Пробовалось на CB5, CB6/SP4. Повторюсь, попытка импорта этой же библиотеки типов в Delphi6 происходит на ура. Есть идеи?


Набережных С.   (2003-06-23 19:34:00) [2]

Несколько расплывчатый вопрос.
Сервер:

 ISockSrvApp = interface(IDispatch)
   function GetSrvName: WideString; safecall;
 end;

 TSockSrvApp = class(TAutoObject, ISockSrvApp)
 protected
   class procedure UpdateRegistry(Register: Boolean; const ClassID: string);
   function GetSrvName: WideString; safecall;
 end;

implementation

uses
 ComServ, DataBkr;

type
 TSockAutoObjectFactory = class(TAutoObjectFactory)
 public
   procedure UpdateRegistry(Register: Boolean); override;
 end;

function TSockSrvApp.GetSrvName: WideString;
var
 n: DWORD;
begin
 n:=MAX_PATH;
 SetLength(Result, n);
 if GetComputerNameW(@Result[1], n) then SetLength(Result, n)
 else RaiseLastOSError;
end;

class procedure TSockSrvApp.UpdateRegistry(Register: Boolean;
 const ClassID: string);
begin
 if Register then
 begin
   EnableSocketTransport(ClassID);
   EnableWebTransport(ClassID);
 end else
 begin
   DisableSocketTransport(ClassID);
   DisableWebTransport(ClassID);
 end;
end;

{ TSockAutoObjectFactory }

procedure TSockAutoObjectFactory.UpdateRegistry(Register: Boolean);
begin
 if Register then
 begin
   inherited;
   TSockSrvApp(Self.ComClass).UpdateRegistry(Register, GUIDToString(ClassID));
 end
 else
 begin
   TSockSrvApp(Self.ComClass).UpdateRegistry(Register, GUIDToString(ClassID));
   inherited;
 end;
end;

initialization
 TSockAutoObjectFactory.Create(ComServer, TSockSrvApp, Class_SockSrvApp,
   ciMultiInstance, tmApartment);
end.

Клиент:

У SocketConnection вручную в свойство ServerGUID вставить Clsid TSockSrvApp( или в свойство ServerName - ProgID класса).

procedure TForm1.Button1Click(Sender: TObject);
var
 Srv: IDispatch;
 IApp: ISockSrvAppDisp;
begin
 Srv:=SocketConnection1.AppServer;
 IApp:=ISockSrvAppDisp(Srv);
 Edit1.Text:=IApp.GetSrvName;
end;

Вроде все.


Наверх

Титульная страница Поиск, карта сайта Написать письмо