Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mailslots ? (https://www.delphipraxis.net/4670-mailslots.html)

Captnemo 9. Mai 2003 10:46

@sakura

Danke. Mal sehen was ich draus machen kann.

Manchmal macht MS uns das Leben schwere als es sein sollte.
Wenn es das PDSK so gäbe wie die Hilfe von Delphi, dann wäre das alles wahrscheinlich schneller zu lösen :lol:

@luckie

Das PDSK hab ich mir schon runtergeladen. Ich darin genauso gelesen, wie auch in der Win32-Hilfe, die Delphi mitbringt.
Wenn man sich mit einer Materie auseinandersetzt, mit der man sich noch nie beschäftigt hat, dann kommt man um eine verständlichere Erklärung von anderen Personen kaum drumrum.
Ein Beispiel-Code sagt manchmal mehr wie tausend MS-Seiten :lol:

Noch dazu brauche Ich meistens länger, als früher, da meine Grauen Zellen sich langsam auf die Reise macht :spin:

Motzi 9. Mai 2003 13:59

Jedes Kernel-Objekt besitzt einen Security-Descriptor der die Zugriffsrechte für das Objekt bestimmt. Dieser Security-Descriptor besitzt unter anderem 2 ACLs (ACL = Access Control List). Und zwar die DACL (Discretionary ACL) und die SACL (System ACL). Die SACL brauchst du in diesem Fall überhaupt nicht, denn die Zugriffsrechte für Benutzer, Gruppen, Computer werden alle in der DACL festgelegt. Ein Dienst lauft in der System-LogonSession und besitzt das SeTCBPrivilege (TCB = Trusted Computer Base) und hat somit die höchsten Rechte. Der Dienst sollte also ohne Probleme den MailSlot des Progs öffnen können. Ein Problem ist es nur umgekehrt, da das Prog kein Recht hat auf den Mailslot des Services zuzugreifen. Um das zu erreichen muss ein neuer Eintrag im DACL des Service-Mailslot vorgenommen werden. In dem Code von Sakura wird einfach ein leerer DACL erzeugt, dh es sind keine expliziten Zugriffsrechte angegeben und daher kann jeder Benutzer/Gruppe/Computer ohne Einschränkungen auf den Mailslot zugreifen. Eine andre Möglichkeit wäre einen neuen ACE (Access Control Entry) zu der DACL hinzuzufügen, der nur den expliziten Zugriff für den einen Benutzer zulässt mit dessen Prog zu kommunizieren musst.

Captnemo 9. Mai 2003 15:44

Hi Sakura,

ich bin zu dämlich :cry: :cry: :cry:

Ich kriegs mit deinen Komponenten nicht hin.

Also kurz was ich gemacht habe:

Server:

gnsPipeServer auf die Form. Pipename=Test. Active=True;
ProcessMessage
..
var
Text: String;
begin
Text:=StrPas(aByteArray);
Memo1.Lines.Add(Text);
end;
..

Client:

gnsPipeClient auf die Form. Pipename=Test.

..
procedure TForm1.Button2Click(Sender: TObject);
var
lpBuffer: Pointer;
Buffersize: Integer;
InCount, OutCount: Cardinal;
begin
Buffersize:=255;
GetMem(lpBuffer,Buffersize);
lpBuffer:=PChar(Edit1.text);
gnsPipeClient1.SendAndReceive(lpBuffer,Buffersize, InCount,OutCount);
FreeMem(lpBuffer, Buffersize);
end;
..

--------------------------------------
Fehlermeldung: Ungültige Zeigeroperation.

Ich weiß das was ich da mache ist sicher falsch. Aber mit Pointern hab ich nicht so :cry:

Hast du nicht ein Beispielcode für micht :mrgreen:

sakura 9. Mai 2003 16:06

Mal schauen, irgendwo gibt es aber bestimmt noch ein Beispiel *grübel*

...:cat:...

sakura 9. Mai 2003 16:08

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von leicht gefälscht
Luck is with you

Keine Ahnung, ob das was taugt, aber das lag hier gerade rum.

...:cat:...

Captnemo 10. Mai 2003 10:36

Liste der Anhänge anzeigen (Anzahl: 1)
Hat eine Zeit und Lust sich das Mal anzusehen? Vielleicht Du Sakura :mrgreen: ?

Den Dienst kann ich starten. Das prog auch. Wenn ich eine Nachricht an den Dienst sende, dann ist prog und Dienst voll ausgelastet.

sakura 10. Mai 2003 12:15

Zitat:

Zitat von Captnemo
Vielleicht Du Sakura :mrgreen: ?

Gerne doch. 8)

Im Service ist der kleine, aber alles entscheidene Fehler. Wie gesagt, dadurch, daß die Komponenten noch nicht ganz ausgereift sind, ist dieser Fehler wohl etwas fatal. :oops:

Die PChar-Variable des Servers, welche Du nutzt, um die Daten zu empfangen, ist nicht initialisiert. Die daraus entstehende Exception wird nicht abgefangen und verläuft sich in der CPU.

Korrektur sind die folgenden Zeilen. Anschließend läuft alles wie am Schnürchen.
Code:
procedure TService1.gnsPipeServer1ProcessMessage(Sender: TObject;
  aByteArray: Pointer; BufferSize, InCount: Cardinal;
  var OutCount: Cardinal; var DisconnectClient: Boolean);
var
   i: Cardinal;
   temp: PChar;
begin
  [color=#cc0000]Temp := GetMemory(Incount + 1);
  try[/color]
    for i:=0 to InCount do
      Temp[i]:=CHR(TByteArray(aByteArray^)[i]);
    Nachrichten.Add(StrPas(temp));
  [color=#cc0000]finally
    FreeMemory(Temp);
  end;[/color]
end;
...:cat:...

Captnemo 10. Mai 2003 12:41

Gelesen - in Prog übertragen - gestartet - läuft.

Auf die simple Idee für Temp erstmal Speicher zu reservieren, bin ich Trottel natürlich nicht gekommen. :oops:

Danke.

Jetzt muß ich das Ganze noch in mein Programm übertragen. Hoffentlich läuft jetzt alles :mrgreen: :mrgreen: :mrgreen:

bonnet 25. Apr 2005 11:26

Re: Mailslots ?
 
Hallo,
vielen Dank für diese tollen Thread, hab die Kompnenten von sakura ausprobiert und es läuft alles fantastisch.
Bis auf eine kleine Ausnahme:
Wenn ich erst eine lange Nachricht versende und anschließend wieder kurze werden an die kurze Nachrichten noch einige Zeichen angehängt.

Woran kann das liegen? Hat jemand eine Idee?

sakura 30. Mai 2005 09:10

Re: Mailslots ?
 
Hi, ich sehe das erst jetzt :oops: Die Komponenten, welche ich hier gepostet habe, arbeiten (zur Vereinfachung) mit einer festen Messagegröße (einstellbar in der Properties), wenn Du eine andere brauchst, dann musst Du diese neu definieren oder (leider) einen gänzlich anderen Ansatz nutzen.

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.
Seite 2 von 3     12 3      

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