Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Übernahme mit GlobalGetAtomName (https://www.delphipraxis.net/95079-uebernahme-mit-globalgetatomname.html)

Gerd01 30. Jun 2007 12:30


Übernahme mit GlobalGetAtomName
 
Wenn mein Programm mit einem bestimmten Parameter gestartet wird übernehme ich die Informationen mit einem Atom zum Beispiel so:

Delphi-Quellcode:
procedure TForm.WMMailtoMessage(var Msg: TMessage);
var
  cBuf: array [0..1000] of char;
begin
  {receiving a message}
  FillChar(cBuf,1000,#0);
  GlobalGetAtomName(Msg.lParam, cBuf, 1000); {get string from atom}
  GlobalDeleteAtom(Msg.lParam);            {delete the atom}
  SendMailToExecute(StrPas(cBuf));
  inherited;
end;

Wenn allerdings in dem Msg.lParam ein Leerezeichen vorhanden ist wird nur das in dem TMessage übergeben was vor dem Leerzeichen vorhanden ist. Alles dahinter wird abgeschnitten. Ich habe keinen Einfluß darauf ob ein Leerezeichen übergeben wird oder nicht. Sonst wäre es ja einfach man würde es vor der Übergabe kodieren. Was kann man tun. Gibt es eine andere Möglichkeit?

Für eure Tipps wäre ich dankbar.

Gruß Gerd

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]

marabu 30. Jun 2007 13:23

Re: Übernahme mit GlobalGetAtomName
 
Hallo Gerd,

der Buffer cBuf ist mit "array[Byte] of Char" ausreichend dimensioniert. Ein Atom String kann maximal 255 Zeichen lang sein.

Die verkürzte Übernahme der Zeichenkette bringe ich eher mit einem NUL-Zeichen (#0) als einem Leerzeichen (SPACE, #32) in Verbindung, da ein Atom-String nur bis zum ersten NUL-Zeichen gelesen wird.

Grüße vom marabu

Gerd01 30. Jun 2007 14:54

Re: Übernahme mit GlobalGetAtomName
 
Danke für den Hinweis auf die Länge des Strings.

Leider wird ein #32 in #0 verwandelt. Es wird definitiv bei dem Leerzeichen abgeschnitten.

Gibt es eine andere Möglichkeit als den "Atom-String" zu verwenden?

Christian Seehase 30. Jun 2007 16:59

Re: Übernahme mit GlobalGetAtomName
 
Moin Gerd,

hast Du schon einmal daran gedacht, die Rückgabewerte der Funktionen zu prüfen, um eventuelle Fehler aufzuspüren?

Gerd01 1. Jul 2007 07:15

Re: Übernahme mit GlobalGetAtomName
 
Ja habe ich gemacht,

der ist einwandfrei. Nur, wenn halt das erste Leerzeichen dann ist Schluß. Danach ist nichts mehr im Array, ausser natürlich #0

marabu 1. Jul 2007 10:44

Re: Übernahme mit GlobalGetAtomName
 
Hallo Gerd,

wenn die Rückgabewerte der Funktionen in Ordnung sind, dann prüfe doch mal deine Eingabewerte. Grundsätzlich gibt es kein Problem mit Leerzeichen in Atom-Strings:

Delphi-Quellcode:
procedure TDemoForm.ButtonClick(Sender: TObject);
var
  cBuf: array [Byte] of Char;
  a: ATOM;
begin
  FillChar(cBuf, SizeOf(cBuf), #0);
  a := GlobalAddAtom('Eins Zwei Drei');
  FillChar(cBuf, SizeOf(cBuf), #0);
  try
    GlobalGetAtomName(a, cBuf, SizeOf(cBuf));
    ShowMessage(cBuf);
  finally
    GlobalDeleteAtom(a);
  end;
end;
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 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