Форум: "Основная";
Текущий архив: 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;
, а не
ArcAt:String;
schedule:String;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c