Моя история заключается в том, что я разрабатываю новое приложение, которое должно взаимодействовать с сервисом Windows. После долгих исследований я пришел к выводу, что Named Pipes являются рекомендуемым методом (Как отправить строку из одного экземпляра моей программы Delphi другому?) кажется, что я не могу использовать SendMessage или Named Pipes в Win7 из-за проблем с безопасностью... сообщения никогда не попадают за пределы службы в приложение.
Я использую компоненты Russell Libby с именем Pipe, которые работают без сучка и затыкания между обычными настольными приложениями, но служба Windows, похоже, бросает ключ в решение. Дальнейшие исследования говорят мне, что может быть возможно открыть защиту с обеих сторон, чтобы они могли общаться, однако мой уровень знаний на этом минимален в лучшем случае, и я не смог сделать головы или хвосты возможных вызовов API.
Основываясь на компоненте Delphi pipe.pas, что нужно сделать, чтобы открыть этого ребенка, чтобы обе стороны могли начать говорить? Я уверен, что следующие две функции из файла pipe.pas идентифицируют атрибуты безопасности, может ли кто-нибудь помочь мне здесь?
Спасибо!
procedure InitializeSecurity(var SA: TSecurityAttributes);
var
sd: PSecurityDescriptor;
begin
// Allocate memory for the security descriptor
sd := AllocMem(SECURITY_DESCRIPTOR_MIN_LENGTH);
// Initialize the new security descriptor
if InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION) then
begin
// Add a NULL descriptor ACL to the security descriptor
if SetSecurityDescriptorDacl(sd, True, nil, False) then
begin
// Set up the security attributes structure
SA.nLength := SizeOf(TSecurityAttributes);
SA.lpSecurityDescriptor := sd;
SA.bInheritHandle := True;
end
else
// Failed to init the sec descriptor
RaiseWindowsError;
end
else
// Failed to init the sec descriptor
RaiseWindowsError;
end;
procedure FinalizeSecurity(var SA: TSecurityAttributes);
begin
// Release memory that was assigned to security descriptor
if Assigned(SA.lpSecurityDescriptor) then
begin
// Reource protection
try
// Free memory
FreeMem(SA.lpSecurityDescriptor);
finally
// Clear pointer
SA.lpSecurityDescriptor := nil;
end;
end;
end;