![]() |
Kommunikation Service und Anwendung unter Vista
moin moin,
ich habe im delphi-forum folgende unit gefunden: ![]() damit versuche ich nun zwischen service und anwendung zu kommunizieren. unter xp funktioniert das einwandfrei. unter vista hingegen wird aber anscheinend nicht auf den selben mutex zugegriffen, auch bei ausgeschaltetem uac. ist diese nun unter vista unmöglich oder habe ich nur vergessen was zu beachten? mfg Jonny |
Re: Kommunikation Service und Anwendung unter Vista
Evtl. ist ja die striktere Trennung Dienste-"Desktop" <-> Anwender-Desktop dafür verantwortlich?
|
Re: Kommunikation Service und Anwendung unter Vista
heisst das dann explizit das zur kommunikation keine memory mapped files in frage kommen?
als alternative fallen mir dann nur noch named pipes ein, wobei ich eigentlich mmf bevorzugen würde :( |
Re: Kommunikation Service und Anwendung unter Vista
Es war nur eine Vermutung von mir. Um die Interaktion Dienst <-> Deskop wieder auf XP-Level zu bringen gibt es eine Registry-Key. Wie der heißt mußt du die Suche bemühen ...
|
Re: Kommunikation Service und Anwendung unter Vista
Memory Mapped Files gehen schon, man muss nur die DACL anpassen, damit ein anderer Benutzer auch darauf Zugriff hat.
Ist fast wie mit normalen Dateien. |
Re: Kommunikation Service und Anwendung unter Vista
das ist schonmal sehr schön zu hören, dass es doch mit mmf funktioniert.
@Dezipaitor oder jeden anderen wissenden: könntest du mir wenns nicht zu viele umstände macht kurz erklären, wie es sich mit dacl verhält? meinst du vielleicht beim CreateFileMapping die pSecurityAttributes? die habe ich schon mit
Delphi-Quellcode:
aufs maximalste gesetzt.
aSA.nLength := SizeOf(TSecurityAttributes);
aSA.bInheritHandle := true; aSa.lpSecurityDescriptor := @aSd; InitializeSecurityDescriptor(aSa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(aSa.lpSecurityDescriptor, True, nil, False); vielen dank für eure hilfe mfg Jonny |
Re: Kommunikation Service und Anwendung unter Vista
Da du eine NULL-DACL verwendest, hat wirklich jeder Zugriff darauf. Das stimmt also.
ICh glaube eher, dass du mal mit DuplicateHandle, versuchen solltest, das Mutex Handle über Prozessebene hinweg zu kopieren. |
Re: Kommunikation Service und Anwendung unter Vista
servus,
ich habe jetzt in der unit mutexipc nach
Delphi-Quellcode:
folgendes eingefügt:
If FMMFHandle = INVALID_HANDLE_VALUE Then
Begin FMMFHandle := CreateFileMapping($FFFFFFFF, @aSa, PAGE_READWRITE, 0, MutexSize, PChar('MIPC_' + MutexName + '_MMF')); If FMMFHandle = 0 Then Raise EMIPCInitialization.Create('Error creating file mapping object.'); Precreated := GetLastError = ERROR_ALREADY_EXISTS; End Else Precreated := True;
Delphi-Quellcode:
und nach
if not DuplicateHandle(GetCurrentProcess, FMMFHandle,GetCurrentProcess, @FMMFHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) then
RaiseLastWin32Error;
Delphi-Quellcode:
folgendes
If (FMutexHandle = INVALID_HANDLE_VALUE) Or (FClientID = MIPC_USER_UNDEFINED) Or (FClientID = MIPC_USER_BROADCAST) Then
Begin CloseIPC; SetLastError(ERROR_ALREADY_EXISTS); If (FClientID = MIPC_USER_UNDEFINED) Or (FClientID = MIPC_USER_BROADCAST) Then FClientID := GenClientID; While GetLastError = ERROR_ALREADY_EXISTS Do Begin FMutexHandle := CreateMutex(Nil, True, PChar(Format('MIPC_%s_CLIENT%.8x', [MutexName, ClientID]))); If GetLastError = ERROR_ALREADY_EXISTS Then Begin CloseHandle(FMutexHandle); FClientID := GenClientID; End; End;
Delphi-Quellcode:
leider immer noch keine besserung, der service und die anwendung scheinen unterschiedliche speicherbereiche zu nutzen.
if not DuplicateHandle(GetCurrentProcess, FMutexHandle,GetCurrentProcess, @FMutexHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) then
RaiseLastWin32Error; oder habe ich was bei duplicatehandle falsch gemacht? mfg Jonny |
Re: Kommunikation Service und Anwendung unter Vista
Das zweite GetCurrentProcess musst du durch den ZielProzess ersetzen. Sie dürfen nicht derselbe Prozess sein.
|
Re: Kommunikation Service und Anwendung unter Vista
klingt logisch ;)
sorry das ich nerve, aber ich habe keinen plan wie ich an die processid von der anwendung komme. hast du vielleicht einen kleinen denkanstoss für mich :) ps: wie muss ich das denn halten, wenn der service schon gestartet ist, aber die anwendung noch nicht? mfg Jonny |
Re: Kommunikation Service und Anwendung unter Vista
über benutzerdefinierte Messages müsste es doch möglich sein?! Einfach ein Broadcast und die richtige Anwendung wirds dann schon verstehen.
|
Re: Kommunikation Service und Anwendung unter Vista
meinst du über eine windowmessage? also wm_user + 1 z.b.?
das hatte bei mir unter vista gar nicht mehr geklappt, da der austausch zwischen service und desktop so arg beschnitten worden ist. |
Re: Kommunikation Service und Anwendung unter Vista
ups, sorry. War ein Fehler meinerseits. Das ging schon unter XP nicht das man zwischen verschiedenen Desktops und Services messages austauschen kann :oops:
|
Re: Kommunikation Service und Anwendung unter Vista
muss ich dann eigentlich beim createmutex auch diesselben security attributes setzen wie beim createfilemapping?
mfg Jonny |
Re: Kommunikation Service und Anwendung unter Vista
wenn verschiedene Leute darauf zugreifen sollen, dann schon.
|
Re: Kommunikation Service und Anwendung unter Vista
was auch ginge wäre das ganze über winsockets zu machen. Also Per Webinterface etc., wie es router etc. eben auch machen.
|
Re: Kommunikation Service und Anwendung unter Vista
@SirThornberry: von sockets wurde mir abgeraten, da zu unsicher. aber ich möchte jetzt keinen glaubenskrieg entfachen :)
nun zurück zu mmf und mutex: ich habe es nun auch geschafft die processid von meiner desktop anwendung aus dem service heraus zu bekommen. wenn ich nun wie Dezipaitor mir geraten hat folgendes versuche:
Delphi-Quellcode:
bekomme ich immer einen init 6 fehler. langsam weiss ich echt nicht mehr weiter? hat einer eine idee?
if not DuplicateHandle(GetCurrentProcess, FMutexHandle,InjectHandle, @InjectHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) then
RaiseLastWin32Error; mfg Jonny |
Re: Kommunikation Service und Anwendung unter Vista
der dritte Parameter muss das Prozesshandle sein. Du verwendest aber denselben Wert für Parameter 3 und 4.
Verwende GetCurrentProcess für den Quellprozess und versende es dann an den Zielprozess, der es dann als erster Parameter verwendet. Der dritte Parameter ist dann direkt die Funktion GetCurrentProcess. |
Re: Kommunikation Service und Anwendung unter Vista
ich mal wieder :)
habe das jetzt folgendermassen versucht zu lösen: der service guckt, ob eine anwendung namens sender.exe läuft mit folgendem code:
Delphi-Quellcode:
danach versuche ich es mit duplicatehandle folgendermassen:
function TTestService.GetSenderProcessHandle:Cardinal;
var h: THandle; rec: TProcessEntry32W; ProcessHandle: THandle; begin Result := 0; h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try rec.dwSize := sizeof(rec); if Process32FirstW(h, rec) then repeat if Uppercase(string(rec.szExeFile)) = UpperCase('sender.exe') then begin Result := rec.th32ProcessID; ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, rec.th32ProcessID); Result := ProcessHandle; CloseHandle(ProcessHandle); Break; end; until not Process32NextW(h, rec); finally CloseHandle(h); end; end;
Delphi-Quellcode:
nachdem ich das gemacht habe versuche ich mich mit sender.exe auf den gleichen mutex zu connected allerdings OHNE duplicatehandle.
if not DuplicateHandle(GetCurrentProcess, FMutexHandle,GetCurrentProcess, @ProcessHandle, 0, FALSE, DUPLICATE_SAME_ACCESS) then
RaiseLastWin32Error; die komponente merkt serviceseitig merkt leider nicht, dass sich einer in diesen speicherbereich connected hat? hat noch einer eine idee was ich anders machen könnte? mfg Jonny |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 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