Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-65099
Tahion
2002-06-03 20:25
2002.06.20
Как узнать путь к иконке файла с определенным расширением в реест


3-64932
Sirus
2002-05-20 07:59
2002.06.20
Форма виснет во время выполнения SQL запроса...


1-65048
koty
2002-06-10 08:40
2002.06.20
Масштабирование формы


1-65141
allrussia
2002-06-06 14:37
2002.06.20
Назначаю браш для ListBox - тект рисуется с белым фоном.


3-64994
PSZ
2002-05-28 15:14
2002.06.20
Почему в DBEdit текст появляется только, когда он в фокусе ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский