Форум: "Сети";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
ВнизВыдает сообщение Найти похожие ветки
← →
Torry (2002-04-08 12:36) [0]Помогите с DCOM:
Создаю программу COM сервер (и регистрирую его на машине) и клиент, который удаленно должен вызывать сервер. При вызове программу сервер, клиент выдает следующую ошибку "Класс не зарегистрирован." Помогите решить проблему.
Да, и еще, когда клиент и сервер находятся на одной машине, то все работает, а когда на разных, то нет.
Иссходнеки программы сервер:
----------------------------------------------------------------
unit ServerKod;
interface
uses
ComObj, ActiveX, Serverr_TLB, StdVcl;
type
Tlogo = class(TAutoObject, Ilogo)
protected
function Outp: PChar; safecall;
{ Protected declarations }
end;
implementation
uses ComServ;
function Tlogo.Outp: PChar;
begin
Result:= PChar("LOGO");
end;
initialization
TAutoObjectFactory.Create(ComServer, Tlogo, Class_logo,
ciMultiInstance, tmApartment);
end.
----------------------------------------------------------------
Исходнеки клиента:
----------------------------------------------------------------
unit ClientKod;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Serverr_TLB, ComObj;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
Var aaa: Ilogo;
begin
aaa:= Cologo.CreateRemote(Edit1.Text);
ShowMessage(aaa.Outp)
end;
end.
← →
Dok_3D (2002-04-08 13:27) [1]Гм...
А почему у тебя Tlogo произошел от TAutoObject , а не от TRemoteDataModule ?
И вообще, судя по всему, ты создал не DCOM-сервер, а банальный ActiveX.
Попробуй в Delphi вкладку File\New\Other\Multitier\RemoteDataModule. Это мастер создания DCOM-приложений. Думаю, на начальном этапе он тебе поможет.
В клиенте используй компонент TDCOMConnection.
← →
Romkin (2002-04-08 14:25) [2]Да не в этом дело, только вопрос - сервер, надеюсь в виде exe-модуля? Dll по жизни на другом компе просто так не пойдет.
TAutoObject великолепно делается по CreateRemote.
Вместо PChar надо использовать WideString (BSTR)
И через DComCnfg установить права удаленного доступа по COM, подробнее - http://www.techvanguards.com/com/tutorials/dcom.asp
в частности http://www.techvanguards.com/com/tutorials/dcom.asp#Deploying the MessageBoard Server
← →
kig (2002-04-08 16:52) [3]Т.к. Вы пользуете ранее связывание, для начала было бы неплохо зарегистрить tlb сервера на клиенте.
Ну а потом то, что посоветовал Romkin © (08.04.02 14:25)
← →
Torry (2002-04-09 09:50) [4]Вау, заработало. Спасибо.
Только зачем регестрировать сервер на клиента,когда мы вызываем
серверное приложение на другой машине (ведь именно на той машине просматривается реестр).
← →
Shaman_Naydak (2002-04-09 19:15) [5]Тут дело не в том, что вы сервер регистрите, а в том, что вы библиотеку типов от него регистрите, то есть на клиенте достаточно зарегистрить серверную tlb-ку..
А почему - вам уже ответили.. потому что вы работаете, используя раннее связывание, а в реестре инфы нет. (я ни в коем не призываю переходить на позднее связывание)
← →
Dok_3D (2002-04-09 20:09) [6]2Shaman_Naydak
>> я ни в коем не призываю переходить на позднее связывание
Может не к месту ...
Вот, хотелось бы узнать, какая принципиальная разница между поздним и ранним связыванием ?
Вот, честное пионерское, не могу найти ответ.
← →
Torry (2002-04-10 05:09) [7]Реестр содержет в себе информацию о любом ком приложении. В нем хранится: GUID который указывает на ком объект, сылка на то откуда его запускать, и какие интерфейсы содержит данный ком.
А в связывание на самом деле вопрос?
← →
Shaman_Naydak (2002-04-10 17:59) [8]>> Torry
В принципе тебе достаточно на клиентской машине поместить в реестр только информацию об интерфейсах.. без нее просто не может выполниться маршаллинг..
>> Dok_3D
Если коротко, то позднее связывание - это реализация IDispatch"a
При раннем связывании вы вызываете метод напрямую из vtable, при этом вы само собой должны знать число и тип требуемых параметров..
При работе через disp interface Вам нужно знать dispid метода (номер), который тоже можно не знать и получить по названию метода..а затем вызываете Invoke и передаете параметры заданным способом.. на сервере параметры разбираются, проверяются и вызывается соответствующий метод..
То есть возможны 3 варианта ком-объекта, реализующего интерфейс
1. вызов только через vtable
2. вызов только через IDispatch (dispinterface)
3. объединение предыдущих (и так, и так)
← →
Torry (2002-04-12 14:37) [9]А как сделать чтобы сервер был в качестве dll а не exe.
У exe есть один недостаток, появляется форма, а мне надо, чтобы мой dcom сервер поднялся в системе при вызове его, без формы.
Посоветуйте как Это реализовать.
← →
Dok_3D (2002-04-12 15:49) [10]Почитай Dok_3D © (08.04.02 13:27)
Особенно концовку. Вопросов точно будет меньше.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c