Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему возникает исключение? Использую такую конструкцию:


Страницы:   1 2

EgorovAlex ©   (2005-11-15 09:29:00) 


procedure Proc1;
begin
 try
   CoInitializeEx(nil, COINIT_MULTITHREADED);
   // работа с ADSI
   CoUninitialize;
 except
   // exception1
 end;
end;

procedure Proc2;
begin
 try
   ...
   Proc1;
 except
   // exception2
 end;
end;

Если я вызываю Proc2 из программы, то всё работает нормально, если же я вызываю Proc2 из потока сервиса, то возникает исключение exception2.

Но если я меняю эту конструкцию на такую:

procedure Proc1;
begin
 try
   // работа с ADSI
 except
   // exception1
 end;
end;

procedure Proc2;
begin
 try
   CoInitializeEx(nil, COINIT_MULTITHREADED);
   ...
   Proc1;
   CoUninitialize;
 except
   // exception2
 end;
end;

То вызов Proc2 проходит нопмально даже из потока сервиса.

Почему такое может возникать?


Digitman   (2005-11-17 14:23:00) [1]


> проблемы это не решило - исключение возникает, а почему
> - не понятно


ну а подключался-то для чего ?)

как раз для ответа на вопрос "почему" ...

ставь брейкпойнт на начало ClientExecute - и вперед, с песней ... пошаговая трассировка ответит на твой вопрос


EgorovAlex   (2005-11-17 14:20:00) [2]

Спасибо, разобрался. Подключится удалось - я сервис из другого места запускал, не из того, где он скомпилирован. Только проблемы это не решило - исключение возникает, а почему - не понятно :(


Набережных С.   (2005-11-16 20:07:00) [3]

Ну тогда остается два варианта:
- В исполняемом файле нет актуальной отладочной информации.
- SCM запускает не тот файл.

Действуй строго по шагам:

1) Деинсталлируй сервис.
2) Выгрузи проект из IDE.
3) Произведи поиск по всем дискам и удали ВСЕ найденные файлы  YourService.exe.
4) Загрузи проект в Дельфи.
5) Расставь точки останова.
6) Пересобери( Build ) проект с включенной отл. инфой.
7) Инсталлируй сервис. Проследи, чтобы путь к сервису указывал на этот вновь созданный файл YourService.exe. Прям в компоненте "Службы".
8) Из консоли запусти сервис.
9) Приаттачься отладчиком к процессу сервиса.

Если все это не поможет, то я уже не знаю:( Разве что повторить это же после удаления всех корректур в реестре.


EgorovAlex   (2005-11-16 19:48:00) [4]

> Синие точки есть?
Нет, синих точек нет :( Даже когда подключился к сервису


Набережных С.   (2005-11-16 16:29:00) [5]


> Да чтож его так колбасит-то, блин, вот дерьмо!

Это я про провайдера, не подумай чего:)


Набережных С.   (2005-11-16 16:27:00) [6]

Да чтож его так колбасит-то, блин, вот дерьмо!

> 3. Запустил сервис (взаимодействие с рабочим столом активировано)
> 4. Открыл в Delphi проект сервиса и выбрал Run -> Attach
> to process... и подключился к сервису.

Имхо, вот оно. Поменяй действия местами. Открываешь проект, компилишь, запускаешь сервис, подключаешься. Именно в такой последовательности. То есть к моменту запуска сервиса проект уже дожен быть открыт в дельфи и скомпилирован!
А в реестре, скорее всего, можно убрать изменения.


Набережных С.   (2005-11-16 16:25:00) [7]

http://delphimaster.ru/cgi-bin/forum.pl?n=18&id=1132036191&p=2


Набережных С.   (2005-11-16 14:45:00) [8]

EgorovAlex ©   (16.11.05 14:18) [26]
Точки останова активны? Синие точки есть? В качестве сервиса точно запускается тот файл, который создала Delphi во время ПОСЛЕДНЕЙ компиляции?


Набережных С.   (2005-11-16 14:41:00) [9]

Что-то тут опять глюкануло, не видел EgorovAlex ©   (16.11.05 14:18) [26]


Digitman   (2005-11-16 14:41:00) [10]

вроде бы все так ..

ОС и версия Делфи какие ?

sleep() в ServiceMain() пробовал ?


Набережных С.   (2005-11-16 14:40:00) [11]

EgorovAlex ©   (16.11.05 13:19) [24]
Ну не знаю, что еще сказать:( У меня иногда были проблемы с неинтерактивными сервисами, достаточно было сделать их интерактивнами и все начинало работать. Все, что описано в [25] точно выполняется? Работаешь под полноценным администратором? Попробуй подкорректировать реестр, как в справке написано, но сразу скажу, что мне это ни разу не требовалось.


EgorovAlex   (2005-11-16 14:18:00) [12]

Мои шаги:
1. Скомпилировал сервис с вышеуказанными параметрами Debugging
2. Прописал в реестре параметр как указано в хелпе:
   1 First create a key called Image File Execution Options in the following registry location: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
   2 Create a subkey with the same name as your service (for example, MYSERV.EXE). To this subkey, add a value of type REG_SZ, named Debugger. Use the full path to Delphi32.exe as the string value.
3. Запустил сервис (взаимодействие с рабочим столом активировано)
4. Открыл в Delphi проект сервиса и выбрал Run -> Attach to process... и подключился к сервису.
5. Выкло окно CPU: я нажал F9 и закрыл это окно. Перед этим поставил брекпойнты в нужных местах.
6. Клиентом коннекчусь к сервису, работаю, но брекпойнты не обрабатываются хотя клиент нормально коннектится и работает.

Что я делаю не так?


Digitman   (2005-11-16 13:32:00) [13]


> Если не подключаться, то коннектится


ну может твой клиент критичен к таймауту ожидания коннекта - кто ж его знает) ..


> отладка не получается - я и брекпойнты ставлю - на них ничего
> не останавливается.


еще раз спрашиваю - ты "соблюл" ВСЕ рекомендации, указанные в справке ?
или кой-чего проигнорировал якобы за ненадобностью-непонятностью ?

sleep() пробовал использовать в коде сервиса-трэда ?


EgorovAlex   (2005-11-16 13:19:00) [14]

To Набережных С.:
При помпиляции включено - Menu Project -> Options... -> tab Compiler -> секция Debugging: все галки кроме Use Debug DCUs включены


Набережных С.   (2005-11-16 12:43:00) [15]


> EgorovAlex ©   (16.11.05 11:38) [21]

Ну а компилировал-то с включенной отладочной информацией?

Вот ты установил сервис, далее:
-- Перекомпилируй его на всякий случай.
-- Установи точки останова.
-- В консоли открой компонент Службы.
-- Проверь свойства своей службы, должно быть разрешено взаимлодействие с рабочим столом. Если нет, установи.
-- Запусти службу.
-- В Delphi подключись к процессу службы. В момент подключения произойдет останов и появится окно CPU, сервис приостановится. Нажми F9 чтобы продолжить выполнение. Окно CPU можно закрыть.

После этого служба будет работать в нормальном режиме, пока не дойдет до точки останова.

У меня ни разу не было никаких с этим проблем.


Digitman   (2005-11-16 12:14:00) [16]


> EgorovAlex ©   (16.11.05 11:38) [21]


а ты в точности выполнил все инструкции по отладке сервиса, как они приведены в справке в теме "Debugging service applications" ?


EgorovAlex   (2005-11-16 11:38:00) [17]

Нет, что я не смогу подключиться после ctrl-F2 я и сам понимаю. Я не могу клиентом к сервису подключиться сразу после того, как я из дельфы подключаюсь отлаживать сервис. Если не подключаться, то коннектится.
У меня отладка не получается - я и брекпойнты ставлю - на них ничего не останавливается.


Digitman   (2005-11-16 10:27:00) [18]


> клиент не подключается к сервису, когда я его отлаживаю
> - сообщает об ошибке соединения


ну разумеется не подключится !
ты же ctrl-F2 нажал, тем самым остановив выполнение кодовых потоков сервиса ...

тебе нужно не ctrl-F2 жать, а установить брейкпойнт в самом начале ClientExecute, тогда как только клиент подключится произойдет останов на этом брейкпойнте, и далее все как обычно - пошаговая трассировка с контролем что, где, как и почему происходит у тебя при обработке кл.запроса


EgorovAlex   (2005-11-16 09:22:00) [19]

Спасибо за информацию о COM.

Что-то не получается отлаживать, точнее не получается трассировать. Скомпилировал сервис, запустил, подключился - о том, что подключился я сужу так, если нажать Ctrl+F2, то сервис останавливается. Но клиент не подключается к сервису, когда я его отлаживаю - сообщает об ошибке соединения.


Набережных С.   (2005-11-16 08:45:00) [20]


> EgorovAlex ©   (16.11.05 08:13) [17]


> Я пробовал и CoInitialize(nil), но это мало помогает.

Да нет, она тут не при чем, это понятно.

> Насчёт COINIT_MULTITHREADED - к этой процедуре предполагается
> одновременный доступ нескольких клиентов и он в таких случаях
> будет выполняться в разных потоках.

Ну так подключение-то к объектам все равно каждый клиент производит независимо от других, в собственном потоке, и имеет дело с собственным экземпляром.

С точки зрения СОМ твой сервис - клиент. MTA в клиенте имеет смысл, если работаем с внутрипроцессным сервером, при этом создаем один экземпляр серверного объекта, а потом работаем с ним из разных потоков, либо если нужно работать из одного потока с объетом, созданным в другом потоке. Но только если сервер внутрипроцессный. Ну, возможно, еще в некоторых очень специфичных случаях. Но в данном случае я никакого смысла не вижу, а вот ресурсов MTA потребляет несколько больше, чем STA, в сервисе это надо учитывать.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо