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.