AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetStartupInfoW(StartupInfoW) - Parameter
Thema durchsuchen
Ansicht
Themen-Optionen

GetStartupInfoW(StartupInfoW) - Parameter

Ein Thema von Garfield · begonnen am 23. Jun 2007 · letzter Beitrag vom 24. Jun 2007
Antwort Antwort
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

GetStartupInfoW(StartupInfoW) - Parameter

  Alt 23. Jun 2007, 14:32
Ich möchte eine Console mit Unicode umleiten und dazu den Code aus meinem Beitrag anpassen. Also habe ich CreateProcess durch CreateProcessW ersetzt. CreateProcessW erwartet unter anderem den Parameter StartUpInfoW. Die neue StartUpInfoW wird mit

GetStartupInfoW(StartupInfoW); erstellt. Wie es auch in diesem Beitrag angegeben. Und genau da hängt es bei mir. In der Unit Windows ist deklariert:

procedure GetStartupInfoW; external kernel32 name 'GetStartupInfoW'; Turbo Delphi erwartet nun nicht StartupInfoW sondern StartupInfoA.

Wo liegt hier der Fehler? In Turbo Delphi oder der Kernel32.dll (Version 5.1.2600.3119 (xpsp_sp2_gdr.070416-1301)).
Miniaturansicht angehängter Grafiken
w_oder_a_196.png  
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 01:17
Moin!

Das liegt wohl an der Deklaration der Procedure:

Delphi-Quellcode:
type
  PStartupInfo = ^TStartupInfo;
  _STARTUPINFOA = record
    cb: DWORD;
    lpReserved: Pointer;
    lpDesktop: Pointer;
    lpTitle: Pointer;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: Word;
    cbReserved2: Word;
    lpReserved2: PByte;
    hStdInput: THandle;
    hStdOutput: THandle;
    hStdError: THandle;
  end;
  {$EXTERNALSYM _STARTUPINFOA}
  TStartupInfo = _STARTUPINFOA;
  STARTUPINFO = _STARTUPINFOA;
  {$EXTERNALSYM STARTUPINFO}

procedure GetStartupInfoA(var lpStartupInfo: TStartupInfo); stdcall;
procedure GetStartupInfoW(var lpStartupInfo: TStartupInfo); stdcall;

...

procedure GetStartupInfoA; external kernel32 name 'GetStartupInfoA';
procedure GetStartupInfoW; external kernel32 name 'GetStartupInfoW';
Das is in meinen D5 auch so drin.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 04:15
Das ist die Sauerei von Borland. Die Struktur ist nur als Ansi-Versin deklariert, aber siehaben trotzdem noch die zugehörige WideString Funktion deklariert, die dann aber die Ansi-Struktur benutzt. Da kann man ziemlich über aufs Maul fallen. Ist mibeim Usermanager passiert: Beim Eintragen in den Treeview stand nur Mist drinne, obwohl die Werte in Ordnung waren. Ambetsen du deklarierst dir das selber.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 09:58
Aber ein Pointer ist doch ok?
Gut man muss natürlich wissen, dass der Pointer ein AnsiString oder ein WideString ist.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#5

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 13:10
Zitat von Sunlight7:
Das is in meinen D5 auch so drin.
Also einmal falsch übersetzt, den Fehler nie bemerkt und immer weiter mitgeschleppt.

Zitat von Luckie:
Das ist die Sauerei von Borland. Die Struktur ist nur als Ansi-Versin deklariert, aber siehaben trotzdem noch die zugehörige WideString Funktion deklariert, die dann aber die Ansi-Struktur benutzt. ...
Ganz so ist das nicht. Die StartupInfo ist schon als Ansi und Wide-Deklaration vorhanden:
Delphi-Quellcode:
type
  PStartupInfoA = ^TStartupInfoA;
  PStartupInfoW = ^TStartupInfoW;
  PStartupInfo = PStartupInfoA;
  _STARTUPINFOA = record
    cb: DWORD;
    lpReserved: PAnsiChar;
    lpDesktop: PAnsiChar;
    lpTitle: PAnsiChar;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: Word;
    cbReserved2: Word;
    lpReserved2: PByte;
    hStdInput: THandle;
    hStdOutput: THandle;
    hStdError: THandle;
  end;
  _STARTUPINFOW = record
    cb: DWORD;
    lpReserved: PWideChar;
    lpDesktop: PWideChar;
    lpTitle: PWideChar;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: Word;
    cbReserved2: Word;
    lpReserved2: PByte;
    hStdInput: THandle;
    hStdOutput: THandle;
    hStdError: THandle;
  end;
  _STARTUPINFO = _STARTUPINFOA;
  TStartupInfoA = _STARTUPINFOA;
  TStartupInfoW = _STARTUPINFOW;
  TStartupInfo = TStartupInfoA;
  {$EXTERNALSYM STARTUPINFOA}
  STARTUPINFOA = _STARTUPINFOA;
  {$EXTERNALSYM STARTUPINFOW}
  STARTUPINFOW = _STARTUPINFOW;
  {$EXTERNALSYM STARTUPINFO}
  STARTUPINFO = STARTUPINFOA;
Der Fehler liegt in den Zeilen:

Delphi-Quellcode:
procedure GetStartupInfoA(var lpStartupInfo: TStartupInfo); stdcall;
procedure GetStartupInfoW(var lpStartupInfo: TStartupInfo); stdcall;
Denn wegen TStartupInfo = TStartupInfoA wird in beiden Fällen Ansi verwendet. Ich habe mein Projekt um diese Unit erweitert:

Delphi-Quellcode:
unit myWindows;

interface

uses
  Windows;

procedure myGetStartupInfo(var lpStartupInfo: TStartupInfo); stdcall;
{$EXTERNALSYM myGetStartupInfo}
procedure myGetStartupInfoA(var lpStartupInfo: TStartupInfoA); stdcall;
{$EXTERNALSYM myGetStartupInfoA}
procedure myGetStartupInfoW(var lpStartupInfo: TStartupInfoW); stdcall;
{$EXTERNALSYM myGetStartupInfoW}

const
{$IFDEF MSWINDOWS}
  kernel32 = 'kernel32.dll';
{$ENDIF}

implementation

procedure myGetStartupInfo; external kernel32 name 'GetStartupInfoA';
procedure myGetStartupInfoA; external kernel32 name 'GetStartupInfoA';
procedure myGetStartupInfoW; external kernel32 name 'GetStartupInfoW';

end.
Damit läuft der Compiler erst einmal durch. Ob es richtig funktioniert muss ich noch testen lassen.

Zitat von Dezipaitor:
Aber ein Pointer ist doch ok?
Gut man muss natürlich wissen, dass der Pointer ein AnsiString oder ein WideString ist.
Die StartupInfo ist kein String sondern ein Record.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 13:22
Hallo Garfield,

natürlich ist die Struktur ein Record, aber dieser Record enthält in der W-Variante und in der A-Variante jeweils drei Zeiger, die sich lediglich in ihrer Typisierung unterscheiden. Es ist also eher eine kleine Nachlässigkeit bei der Qualitätskontrolle als ein Fehler bei der Entwicklung, den man Borland hier vorwerfen kann. Ich denke darauf wollte Dezipaitor hinaus.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#7

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 15:43
Moin marabu,

kann gut sein. Eben diese unterschiedliche Typisierung von PAnsiChar und PWideChar hat das Problem verursacht. Obwohl zunächst eine leere Struktur erstellt werden soll und die Zeiger in meinem Fall später gar nicht benötigt werden.

Delphi-Quellcode:
StartupInfoW.dwFlags := STARTF_USESTDHANDLES
                         or STARTF_USESHOWWINDOW;
StartupInfoW.wShowWindow := SW_HIDE;
StartupInfoW.hStdOutput := NewStdOut;
StartupInfoW.hStdError := NewStdOut;
StartupInfoW.hStdInput := NewStdIn;
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#8

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 18:09
[quote="Garfield"]
Zitat von Sunlight7:
Zitat von Dezipaitor:
Aber ein Pointer ist doch ok?
Gut man muss natürlich wissen, dass der Pointer ein AnsiString oder ein WideString ist.
Die StartupInfo ist kein String sondern ein Record.
Zitat von marabu:
Hallo Garfield,

natürlich ist die Struktur ein Record, aber dieser Record enthält in der W-Variante und in der A-Variante jeweils drei Zeiger, die sich lediglich in ihrer Typisierung unterscheiden. Es ist also eher eine kleine Nachlässigkeit bei der Qualitätskontrolle als ein Fehler bei der Entwicklung, den man Borland hier vorwerfen kann. Ich denke darauf wollte Dezipaitor hinaus.

Grüße vom marabu

Genau, ich bezog mich auf die 3 Pointer innerhalb des Records. Da es sich dabei um Zeiger handelt, ist es egal, ob Char oder Widechar. Es sind halt nur untypisierte Zeiger.
Anders ist es bei Records, in denen Array of Char oder Array of WideChar Deklarationen vorkommen. Diese müssen doppelt definiert werden, da sie beide unterschiedliche Größen besitzen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#9

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 18:22
Zitat von Dezipaitor:
Genau, ich bezog mich auf die 3 Pointer innerhalb des Records. Da es sich dabei um Zeiger handelt, ist es egal, ob Char oder Widechar. Es sind halt nur untypisierte Zeiger.
Wenn es egal wäre, hätte der Compiler nicht meckern sondern compilen müssen. Also dürfte es nicht egal sein.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 18:48
Zitat von Garfield:
Zitat von Dezipaitor:
Genau, ich bezog mich auf die 3 Pointer innerhalb des Records. Da es sich dabei um Zeiger handelt, ist es egal, ob Char oder Widechar. Es sind halt nur untypisierte Zeiger.
Wenn es egal wäre, hätte der Compiler nicht meckern sondern compilen müssen. Also dürfte es nicht egal sein.
Semantisch ist es egal, syntaktisch jedoch nicht, da es sich eben um zwei verschiedene Strukturen handelt. Man kann aber durch explizite Typ-konvertierung, ohne Probleme von einem Record zum anderen umwandeln. Das geht eben nur, weil es Zeiger sind und keine festen Strukturen. (array)
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz