Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с named pipe из сервиса, Ошибка открытия канала в сервисе 
:(
    Опции темы
jungle
Дата 6.3.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



Столкнулся с проблемой подключения из сервисного приложения к именованному каналу (named pipe), создаваемого Win32-приложением. 

Сервер (Win32-приложение) создает именованный канал в отдельном потоке и ожидает подключения в блокируемом режиме (используется флаг PIPE_TYPE):
Код

hPipe:=CreateNamedPipe(
         '\\.\pipe\thpchannel',         // pipe name
         PIPE_ACCESS_INBOUND,        // data in the pipe goes from client to server only
         PIPE_TYPE_BYTE or           // byte type pipe
         PIPE_WAIT,                  // blocking mode
         PIPE_UNLIMITED_INSTANCES,   // max. instances
         BUFSIZE,                    // output buffer size
         BUFSIZE,                    // input buffer size
         0,                          // client time-out
         nil);  

Клиент (сервисное приложение) подключается к серверу для передачи бинарных данных через канал. Однако ошибка возникает на этапе открытия канала:
Код

hPipe:=CreateFile('\\192.168.3.140\pipe\thpchannel',  // pipe name
                      GENERIC_WRITE,       // read and write access
                      0,                   // no sharing
                      nil,                 // default security attributes
                      OPEN_EXISTING,       // opens existing pipe
                      0,                   // default attributes
                      0);                  // no template file

Дескриптор hPipe в этом случае постоянно равен 160 (десятичная форма). Если вызвать процедуру открытия канала не из сервиса, а из Win32-приложения, то никаких проблем с открытием канала нет – дескриптор hPipe получает корректные значения и дальше всё идёт по плану.

Подскажите в чём особенность открытия именованных каналов в сервисных приложениях? Или подобное реализовать невозможно?
PM MAIL WWW   Вверх
kami
Дата 8.3.2009, 16:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Вопрос интересный и мне тоже.
Единственное, что приходит в голову (в Вашем посте нет информации, что возвращает GetLastError, хотя 160 - это не INVALID_HANDLE_VALUE) - это нестыковка в SecurityAttributes.
попробуйте сделать так:

Код

function InitMyDescriptor( SecDescriptor: PSECURITY_DESCRIPTOR): bool;
begin
  Result := False;
  if InitializeSecurityDescriptor(SecDescriptor, SECURITY_DESCRIPTOR_REVISION) then
    if SetSecurityDescriptorDACL(SecDescriptor, True, nil, True) then // устанавливаем полный доступ для всех.
      Result := True;
end;

var
  sa: TSecurityAttributes;
  sd: TSecurityDescriptor;
begin
  if not InitMyDescriptor(@sd) then
    exit;
  sa.lpSecurityDescriptor:=@sd;
  sa.nLength := SizeOf(TSecurityAttributes);
  sa.bInheritHandle := False;

// и в дальнейшем @sa подставить в CreateNamedPIPE и CreateFile вместо nil.
PM MAIL WWW   Вверх
MetalFan
Дата 8.3.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



интересный вопрос! а не трудно ли будет автору сотворить тестовое приложение, на котором сия ошибка воспроизводится?
кстати, как заметил kami, проблема вполне может быть из-за несовпадения/неправильности прав доступа...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
jungle
Дата 9.3.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аппаратный кодер



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.1.2006
Где: Беларусь

Репутация: нет
Всего: нет



kami
Большое спасибо! С атрибутами безопасности всё заработало, как надо! Видимо, очередное требование со стороны Windows Server 2003 SP2. 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.