![]() |
CreateMemFile und Service-Anwendung
Ich will Memory Mapped Files für die Kommunikation zwischen einer Service-Anwendung und einem Agent (Client zur Steuerung des Service) verwenden. Dabei setze ich folgenden Code ein, jeweils identisch bei Service und Agent:
Delphi-Quellcode:
Starte ich zuerst den Service und dann den Agent, so erhalte ich eine Fehlermeldung "Zugriff verweigert" und das Memfile-Handle ist 0. Wenn ich zuerst den Agent starte und dann erst den Service, so funktioniert alles einwandfrei (auch der Datenaustausch, Lesen und Schreiben etc.).
procedure CreateMemFile;
begin MemFile := CreateFileMapping($ffffffff, nil, PAGE_READWRITE, 0, SizeOf(TSharedData), 'FlexiCom'); if MemFile = 0 then begin raise Exception.Create(GetErrTxt(GetLastError)); end; SharedData := MapViewOfFile(MemFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TSharedData)); if SharedData=nil then begin CloseHandle(MemFile); raise Exception.Create(GetErrTxt(GetLastError)); end; SharedData^ := ''; end; Leider ist es in der Praxis ja genau umgekehrt - Beim Systemstart wird automatisch der Service gestartet und der Agent wird vom Benutzer bei Bedarf ausgeführt. Was muss ich tun, damit der Agent die Berechtigung erhält, auf ein vom Service geöffnetes MMF zuzugreifen? |
Re: CreateMemFile und Service-Anwendung
Zitat:
|
Re: CreateMemFile und Service-Anwendung
Zitat:
|
Re: CreateMemFile und Service-Anwendung
Zitat:
![]() |
CreateMemFile und Service-Anwendung [gelöst]
Zitat:
Delphi-Quellcode:
Dadurch wird laut WinApi-Doku Vollzugriff für alle erteilt. Das ist in dem fall auch nicht weiter schlimm, da sich an dem Server, auf dem der Service läuft, eh nur admins anmelden dürfen.
procedure CreateMemFile;
var aSA : TSecurityAttributes; aSD : TSecurityDescriptor; begin aSA.nLength := SizeOf(TSecurityAttributes); aSA.bInheritHandle := true; aSa.lpSecurityDescriptor := @aSd; InitializeSecurityDescriptor(aSa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); // Das ist die massgebliche Zeile, und hier der Parameter nil: // If this parameter is NULL, a NULL discretionary ACL is assigned to the security descriptor, allowing all access to // the object. The discretionary ACL is referenced by, not copied into, the security descriptor. SetSecurityDescriptorDacl(aSa.lpSecurityDescriptor, True, nil, False); MemFile := CreateFileMapping($ffffffff, @aSa, PAGE_READWRITE, 0, SizeOf(TSharedData), 'FlexiCom'); if MemFile = 0 then begin raise Exception.Create(GetErrTxt(GetLastError)); end; SharedData := MapViewOfFile(MemFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TSharedData)); if SharedData=nil then begin CloseHandle(MemFile); raise Exception.Create(GetErrTxt(GetLastError)); end; SharedData^ := ''; end; Danke für die Hilfe! |
Re: CreateMemFile und Service-Anwendung [gelöst]
Zitat:
|
Re: CreateMemFile und Service-Anwendung
Wollte mal fragen ob du mal den Code Posten kannst ? Will auch sowas machen eben. :mrgreen:
|
Re: CreateMemFile und Service-Anwendung
Der Code ist doch da...
|
Re: CreateMemFile und Service-Anwendung
Ich wollte das ganze mal im zusammenhang sehen beispiel Programme eben. Weil ich weiß nicht wie der Dienst drauf reagiert wenn du einen Stream sickst ?
|
Re: CreateMemFile und Service-Anwendung
Noch ne Frage wann bekommst du mit das in den Speicher geschireben wird ? Und zeig mir das Bsp. mal zusammen ! Und machst du irgendt wo auch OpenFileMapping() ?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz