Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

ERROR "Сбой при удалённом вызове процедуры"   Найти похожие ветки 

 
LeS   (2002-07-31 17:46) [0]

Уважаемые мастера, подскажите.
Создал приложение, добавил в него ком объект, в интерфейсе которого один метод. Подготовил клиента, который создаёт коинтерфейс.CreateRemote("SERVER") и обращается к этому методу. Работает на одной машине, а вот если унести клиент на другую, то появляется синий экран:( с просьбой нажать ctrlaltdel:). На нем сообщение: ИМЯ ФАЙЛА: VREDIR(06)+00006054 ошибка 0E:0028:C02D272Q. Если игнорировать просьбу и нажать на любую клавишу, винда показывает ShowMessage("Сбой при удалённом вызове процедуры"). Если же повторно вызвать метод, то появляется сообщение "Сервер RPC недоступен").
ОС на клиенте - Винда миллениум
ОС на сервере - В2000 . Все сервисы, которые, как мне показалось, связанны с лок сетью (в том числе "удалённыый вызов процедур",Локатор удаленного вызова процедур (RPC) и др) - запущены, папочка, в которой лежит серверное приложение - расшарена с полным доступом для всех .
Подскажите пожалуйста, как быть...

Заранее, спасибо.


 
А. Н. Оним   (2002-07-31 18:29) [1]

Да - а - а. Затрудняюсь что-либо и сказать. Но я встречался с 3-емя типами ошибок и огромной кучей баек своих друзей: Ошибки перечисляю по первичности их возникновения:
1. [RPC сервер не доступен] Чаще всего возникает тогда, когда целевая машина действительно не доступна по сетке. Но однажды у меня такое было в локалке, когда одна машина действительно из непонятных причин была видна только по своему IP"шнику. Попробуй указать его, вдруг поможет?
2. [CLSID не зарегестрирован] - CLSID отсутствует на целевой машине. Просто не разегестрирован сервер. Может появиться только тогда, когда ошибка "1" устранена
3. [Access Denied] - политика безопасности должным образом не настроена. Может появиться только в том случае, когда ошибки "1" и "2" ты счастливо избежал.
 А друзья рассказывали про "несовместимости DCOM на различных вариантах Windows платформ", про "неразворачиваемые сервисы" и т.д. Так что могу посоветовать развернуть для начала на одинаковых платформах. Желательно, Win2000 или WinNT.


 
А. Н. Оним   (2002-08-01 11:18) [2]

 Привет, прежде всего, твой сервер должен регистрировать в реестре свой AppID. AppID - это уникальный идентификатор твоего сервера (не кокласса сервера, а именно сервера целиком). Служит, как правило, для занесения информации о тех, кому положен доступ к нему, а кому нет. В отличие от progID, он не дружелюбный пользователю, а самый - самый типичный TGUID. Далеко не каждый сервер его для себя создаёт при регистрации. Все AppID в твоей системе лежат в:
 HKEY_CLASSES_ROOT\AppID\
Посмотри - их не так уж и много. Каждая из вкладок может содержать две записи LaunchPermission и AccessPermission. Если очень коротко - то в них бинарный Security Descriptor со списком DACL. DACL - это разграничительный список доступа. В нём перечислены User"а, которые могут или не могут запускать твой сервер. В LaunchPermission - списки тех, кому разрешено запускать твой сервер с удалённой машины, в AccessPermission - список тех, кому разрешено обращаться. Очень подробно этот вопрос рассмотрен в толстой синей книге Джефрри Рихтера "Разработка серверных приложений для Windows 2000". Твой сервер должен зарегестрировать свой AppID, перечислить тех - кому положено его запускать, связать свой CLSID со своим AppID и всё готово. Как это сделать:
 Если ты пишешь в Delphi, то код для занесения AppID для твоего сервера дельфёфский Wizard не сгенерит. (MSVC"шный генерит). Проблема решается, например, так:
 AppID - тот же GUID и ты должен придумать его для себя сам. GUID сочинит для тебя также утилита GUIDGEN.EXE, но можешь и сам его придумать (можно также посмотреть в MSDN о программном способе генерации структур типа GUID).
 Код для регистрации в Delphi может быть примерно такой:
unit ...
var
 lpszMyCLSID, lpszMyAppID: string;

initialization
 lpszMyCLSID := "{AFBA5900-38E1-436B-8EE8-70C6D07214EB}";
 lpszMyAppID := "{3AA83FD2-8274-4606-90F5-5EE2781FBBC9}";
 CreateRegKey("APPID\" + lpszMyAppID, "", "дружеское имя сервера");
 CreateRegKey("CLSID\" + lpszMyCLSID, "AppID", lpszMyAppID);

 Вместо AppID воткни свой AppID, а вместо CLSID - свой CLSID, посмотри его в TypeLIB"е своего проекта для кокласса. Теперь сервер будет оставлять о себе необходимые записи в реестре.

Настроить список лиц, кому позволен доступ к серверу можно при помощи утилиты dcomcnfg.exe на машине сервера. При запуске утилиты появиться окошко - и о чудо, твоё "дружеское имя сервера" будет в нём. dcomcnfg просто просканировал влкадку APPID твоего реестра. Теперь дважды щёлкни на нём и настрой доступ и запуск как пользовательский. Не забудь ещё вот о чём.
Если ты не дашь прав на запуск, то клиент может только надеяться, что сервер уже кем то запущен. Если же у клиента нет прав на доступ (Access), то у него вообще никогда не получиться добраться до сервака. Сервер может дополнительно реализовывать программиоумемую политику безопасности при помощи интерфейса IClientSecurity и разграничивать к себе доступ по любой логике. Но это уже отдельная история.

Удачи.






 
LeS   (2002-08-01 12:26) [3]

Огромное спасибо за подробное описание, А. Н. Оним.

Не работает. Интересно получается... Я программирую в делфи 6, похоже он сам зарегистрировал мой сервер, т.к. без копания в реестре я нашел его в списке dcomcnfg.exe, а на этапе раздачи прав не стал мудрить и поставил на запуск, доступ пользователя "ВСЕ". Теперь ошибки нет, зато есть другая.:) Клиент долго думает, потом показывает "Ошибка при выполнении приложения-сервера". Сервер же пишет - "Исключение неизвестное программное исключение (0x0eedfade) в приложении по адресу XXXXXX". Вот такие вот дела, начинаю подумывать, что может  я чтото сам неправильно напрограммил, хотя, повторяюсь, на одной машине работает.
Если ошибка относится к стандартным, прошу просветить меня, буду очень благодарен.

Спасибо.


 
А. Н. Оним   (2002-08-01 12:32) [4]

Есть несколько вопросов:
*  Какая у тебя сеть: если без контроллера (например, две машины по нульмодемному), то права "ВСЕ" для неопознанного сервером клиентского пользователя ничего на самом деле не дают.
*  В какой момент вылетает ошибка? На CreateRemoteComObject? Или при вызове метода (если да, то какого?).
*  Запущен ли сервер уже в тот момент или он только запускается?
 


 
LeS   (2002-08-01 12:46) [5]

Всё, до сервака я достучался.
Просто чтото напутал в dcomcnfg.exe. Проверил, запустид - работает.

Спасибо большое. Приятно иметь дело с А. Н. Оним. Всего хорошего.    



Страницы: 1 вся ветка

Форум: "Corba";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
4-1088785884
Sormy
2004-07-02 20:31
2004.08.15
CD-ROM Api???


1-1091139635
SSSSS
2004-07-30 02:20
2004.08.15
Сортировка строк!!!


3-1090565839
Katya_mgkit
2004-07-23 10:57
2004.08.15
UDB


3-1090049583
Valer
2004-07-17 11:33
2004.08.15
Access, изменение содержимого запроса.


4-1089194511
andrey__
2004-07-07 14:01
2004.08.15
Сообщения (Диалог между двумя приложениями).





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский