![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов метода сервера через 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;
Вроде все.