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

Вниз

передача параметров в ServiceMain   Найти похожие ветки 

 
АлексейК   (2003-11-10 09:05) [0]

Вопрос, конечно, может и глупый, но что-то в голове совсем клинануло.
Каким образом передать параметры в ф-ию ServiceMain, то есть заполнить (argc : DWORD;var argv : array of PChar).


 
Юрий Зотов   (2003-11-10 10:27) [1]

Выдержка из MSDN:

Parameters

dwArgc
[in] Specifies the number of arguments in the lpszArgv array.

То есть, это количество элементов в массиве, указатель на который передается во втором параметре.

lpszArgv
[in] Pointer to an array of pointers to null-terminated argument strings. The first argument in the array is the name of the service, and subsequent arguments are any strings passed to the service by the process that called the StartService function to start the service.

То есть, это динамический массив элементов типа PChar (указателей на строки ASCIIZ). Мы передаем его в StartService, а уж потом SCM передает его в ServiceMain без нашего участия. Первый элемент должен указывать на строку, содержащую имя сервиса, а остальные заполняются произвольно.

function StrToPChar(S: string): PChar;
begin
if S = "" then Result := nil else Result := PChar(S)
end;

type
TArgs: array of PChar;
var
Args: TArgs;
...
SetLength(Args, 5);
Args[0] := StrToPChar(ServiceName);
Args[1] := StrToPChar(...);
...
Args[4] := StrToPChar(...);
StartService(..., Length(Args), Args)

Часто эти параметры в ServiceMain реально не требуются. Тогда и ничего этого делать не нужно - просто вызывается
StartService(..., 0, nil)


 
АлексейК   (2003-11-10 11:06) [2]

StartService(..., Length(Args), Args)
где
type
TArgs: array of PChar;
var
Args: TArgs;
В данном случае возникает ошибка при компиляции:
Types of actual and formal var parameters must be identical

Есле же
StartService(..., Length(Args), pChar(Args))
То компиляция проходит, но параметры отсуствуют


 
АлексейК   (2003-11-10 11:49) [3]

И потом в модуле WinSvc протип функции описан как
function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD; var lpServiceArgVectors: PChar): BOOL; stdcall;

Разве описание типов pChar и array of pChar идентичны?


 
Юрий Зотов   (2003-11-10 11:53) [4]

1. Приведение к PChar - нормально.
2. Добавьте packed.
3. Уточните - как именно заполняется массив и как потом из него выбираются параметры?


 
Юрий Зотов   (2003-11-10 12:00) [5]

> АлексейК (10.11.03 11:49) [3]
> Разве описание типов pChar и array of pChar идентичны?

И PChar, и динамический массив - указатели, поэтому совместимы. В прототипе они описаны в соответствии с сишным оригиналом, а в Паскале надо действительно привести тип, просто чтобы не ругался компилятор.


 
АлексейК   (2003-11-10 12:24) [6]

Праметры для StartService
StartService(hService, 3, pChar(Args))
где
hService:= OpenService(hSCM, SERVICE_NAME, SERVICE_ALL_ACCESS);
Args уже переписал по вашей рекомендации
type
TArgs: array of PChar;
var
Args: TArgs;
Args[0]:=pChar(SERVICE_NAME);
Args[1]:=pChar(ArcAtr);
Args[2]:=pChar(schedule);
SERVICE_NAME - глобальная константа
schedule и ArcAtr:String описаны как глобальные переменные и значение присвоены им ранее.

В ServiceMain параметры беру
String(argv[0]) - значение присутсвует
String(argv[1]) - полная фигня
String(argv[2]) - полная фигня


 
Юрий Зотов   (2003-11-10 17:52) [7]

1. packed array of PChar - не помогает?
2. Надеюсь, SetLength(Args, 3) - не забыли?
(и Args := nil при завершении сервиса).


 
АлексейК   (2003-11-11 07:34) [8]

1. packed array of PChar - не помогает?
Не помогает.
2. Надеюсь, SetLength(Args, 3) - не забыли?
(и Args := nil при завершении сервиса).

Не забыл.


 
АлексейК   (2003-11-11 09:12) [9]

Интересная вещь получается, передаю массив из трех элементов
SetLength(Args, 3)
Args[0]:=pChar(SERVICE_NAME);
Args[1]:=pChar(ArcAtr);
Args[2]:=pChar(schedule);
StartService(hService, 3, pChar(Args))


В ServiceMain параметр argc = 4, (Length(argv))=1, при этом
String(argv[0])=SEVICE_MAIN
String(argv[1])= непонятно чему
String(argv[2])= ArcAt
String(argv[3])= schedule в том случае если объявление переменных было как: ArcAt, schedule:String;, а не
Ar cAt:String;
schedule:String;



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

Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
3-65727
gestern
2003-11-01 18:28
2003.11.20
Генератор IB


1-65984
TAHAT
2003-11-10 08:50
2003.11.20
Как импортировать тип данных из dll ???


1-65908
FC
2003-11-08 14:05
2003.11.20
Запрет вызова контекстного меню в TEdit


14-66097
Alexey Lipatov
2003-10-25 14:25
2003.11.20
Специальности программистов


8-66026
StanSSmit
2003-07-23 17:56
2003.11.20
Генерирование звука заданной частоты через звуковую карту





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