![]() |
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() ?
|
Re: CreateMemFile und Service-Anwendung
Beim Anschauen des codes ist mir folgende frage gekommen:
Delphi-Quellcode:
Wo wird aSD initialisiert? Er wird gesetzt aber nirgendwo initialisiert oder anderweitig (später) angesprochen. Ist das gewollt, also setzt ihn eine nachfolgende Funktion beim Aufruf entsprechend?
procedure CreateMemFile;
var aSA : TSecurityAttributes; aSD : TSecurityDescriptor; begin aSA.nLength := SizeOf(TSecurityAttributes); aSA.bInheritHandle := true; aSa.lpSecurityDescriptor := @aSd; ... |
Re: CreateMemFile und Service-Anwendung
aSA : TSecurityAttributes;
ist ein Record
Delphi-Quellcode:
er setzt die Einstellungen und ruft das die Funktion InitializeSecurityDescriptor dort würd das dann initialisiert.
...
PSecurityAttributes = ^TSecurityAttributes; _SECURITY_ATTRIBUTES = record nLength: DWORD; lpSecurityDescriptor: Pointer; bInheritHandle: BOOL; end; {$EXTERNALSYM _SECURITY_ATTRIBUTES} TSecurityAttributes = _SECURITY_ATTRIBUTES; SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES; {$EXTERNALSYM SECURITY_ATTRIBUTES} ... Aber mir stellt sich die Frage wann er weiß das was im Buffer steht ? Und zeig doch mal alles im zusammen hang Bitte ! Zum beispiel der Empfänger und Sender Code zusammen und wie sich das verhält. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 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