Моя история такова, что я разрабатываю новое приложение, которое должно взаимодействовать со службой Windows. После долгих исследований у меня есть пришли к выводу, что именованные каналы являются рекомендуемым методом ( Как мне отправить строку из одного экземпляра моей программы Delphi в другой? ), однако оказывается, что я не могу использовать SendMessage или именованные каналы в Win7 из-за проблем с безопасностью ... сообщения никогда не доходят до приложения за пределами службы.
Я использую именованные компоненты 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;