Einzelnen Beitrag anzeigen

Benutzerbild von Garfield
Garfield

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

Re: GetStartupInfoW(StartupInfoW) - Parameter

  Alt 24. Jun 2007, 12: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