![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выдает сообщение
Torry © (2002-04-08 12:36:00)Помогите с 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-12 15:49:00) [1]Почитай Dok_3D © (08.04.02 13:27)
Особенно концовку. Вопросов точно будет меньше.
Torry (2002-04-12 14:37:00) [2]А как сделать чтобы сервер был в качестве dll а не exe.
У exe есть один недостаток, появляется форма, а мне надо, чтобы мой dcom сервер поднялся в системе при вызове его, без формы.
Посоветуйте как Это реализовать.
Shaman_Naydak (2002-04-10 17:59:00) [3]>> Torry
В принципе тебе достаточно на клиентской машине поместить в реестр только информацию об интерфейсах.. без нее просто не может выполниться маршаллинг..
>> Dok_3D
Если коротко, то позднее связывание - это реализация IDispatch"a
При раннем связывании вы вызываете метод напрямую из vtable, при этом вы само собой должны знать число и тип требуемых параметров..
При работе через disp interface Вам нужно знать dispid метода (номер), который тоже можно не знать и получить по названию метода..а затем вызываете Invoke и передаете параметры заданным способом.. на сервере параметры разбираются, проверяются и вызывается соответствующий метод..
То есть возможны 3 варианта ком-объекта, реализующего интерфейс
1. вызов только через vtable
2. вызов только через IDispatch (dispinterface)
3. объединение предыдущих (и так, и так)
Torry (2002-04-10 05:09:00) [4]Реестр содержет в себе информацию о любом ком приложении. В нем хранится: GUID который указывает на ком объект, сылка на то откуда его запускать, и какие интерфейсы содержит данный ком.
А в связывание на самом деле вопрос?
Dok_3D (2002-04-09 20:09:00) [5]2Shaman_Naydak
>> я ни в коем не призываю переходить на позднее связывание
Может не к месту ...
Вот, хотелось бы узнать, какая принципиальнаяразница между поздним и ранним связыванием ?
Вот, честное пионерское, не могу найти ответ.
Shaman_Naydak (2002-04-09 19:15:00) [6]Тут дело не в том, что вы сервер регистрите, а в том, что вы библиотеку типов от него регистрите, то есть на клиенте достаточно зарегистрить серверную tlb-ку..
А почему - вам уже ответили.. потому что вы работаете, используя раннее связывание, а в реестре инфы нет. (я ни в коем не призываю переходить на позднее связывание)
Torry (2002-04-09 09:50:00) [7]Вау, заработало. Спасибо.
Только зачем регестрировать сервер на клиента,когда мы вызываем
серверное приложение на другой машине (ведь именно на той машине просматривается реестр).
kig (2002-04-08 16:52:00) [8]Т.к. Вы пользуете ранее связывание, для начала было бы неплохо зарегистрить tlb сервера на клиенте.
Ну а потом то, что посоветовал Romkin © (08.04.02 14:25)
Romkin (2002-04-08 14:25:00) [9]Да не в этом дело, только вопрос - сервер, надеюсь в виде 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#Deployingthe MessageBoard Server
Dok_3D (2002-04-08 13:27:00) [10]Гм...
А почему у тебя Tlogo произошел от TAutoObject , а не от TRemoteDataModule ?
И вообще, судя по всему, ты создал не DCOM-сервер, а банальный ActiveX.
Попробуй в Delphi вкладку File\New\Other\Multitier\RemoteDataModule. Это мастер создания DCOM-приложений. Думаю, на начальном этапе он тебе поможет.
В клиенте используй компонент TDCOMConnection.