-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathJPL.Win.System.pas
291 lines (243 loc) · 7.86 KB
/
JPL.Win.System.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
unit JPL.Win.System;
interface
{$IFDEF MSWINDOWS}
{$I .\..\jp.inc}
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
uses
Windows, SysUtils, Classes, Messages, ShellApi, Graphics,
JPL.Strings;
procedure GetEnvironmentList(sl: TStringList);
function GetEnvironmentString(EnvVar: string; AddPercents: Boolean = True): string;
function ExpandEnvironmentString(const EnvVar: string; AddPercents: Boolean = True): string;
function SysDir: string;
function WinDir: string;
function TempDir(ErrorResult: string = ''): string;
function UserName: string;
function ComputerName: string;
function MyDir: string;
function GetWindowsVersion: integer;
function SearchPathForFile(const ShortFileName: string; DefResult: string = ''; PathToSearch: string = ''): string;
function ExitWindows2: Boolean;
function RestartWindows: Boolean;
procedure ShowLastError(const Error: LongWord; MsgPrefix: string = ''; MsgTitle: string = 'System error'; dwHandle: DWORD = 0);
function ScreenWidth: integer;
function ScreenHeight: integer;
function SetWindowOnTop(const WinHandle: HWND; const OnTop: Boolean): Boolean;
function ExploreDirectory(const Directory: string; AHandle: HWND = 0): Boolean;
function ShowFileInExplorer(const FileName: string; Handle: HWND = 0): Boolean;
function GetFileIcon(const FileName: string; SmallIcon: Boolean = True): TIcon;
const
PBM_SETBKCOLOR = $2000 + 1;
PBM_SETBARCOLOR = WM_USER + 9;
{$ENDIF} // MSWINDOWS
implementation
{$IFDEF MSWINDOWS}
function GetFileIcon(const FileName: string; SmallIcon: Boolean = True): TIcon;
var
Flags: UINT;
SHFileInfo: TSHFileInfo;
begin
Result := nil;
if SmallIcon then Flags := SHGFI_SMALLICON or SHGFI_ICON else Flags := SHGFI_LARGEICON or SHGFI_ICON;
ShGetFileInfo(PChar(FileName), 0, SHFileInfo, SizeOf(TSHFileInfo), Flags);
if SHFileInfo.hIcon > 0 then
begin
Result := TIcon.Create;
Result.Handle := SHFileInfo.hIcon;
end;
end;
function ExploreDirectory(const Directory: string; AHandle: HWND = 0): Boolean;
begin
Result := False;
if not DirectoryExists(Directory) then Exit;
Result := ShellExecute(AHandle, 'open', PChar(Directory), '', PChar(Directory), SW_SHOWNORMAL) > 32;
end;
function ShowFileInExplorer(const FileName: string; Handle: HWND = 0): Boolean;
var
s: string;
begin
s := '/select,' + FileName;
Result := ShellExecute(Handle, 'open', 'explorer.exe', PChar(s), '', SW_SHOW) > 32;
end;
function SetWindowOnTop(const WinHandle: HWND; const OnTop: Boolean): Boolean;
var
Flags: HWND;
begin
if OnTop then Flags := HWND_TOPMOST else Flags := HWND_NOTOPMOST;
Result := SetWindowPos(WinHandle, Flags, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;
function ScreenWidth: integer;
begin
Result := GetSystemMetrics(SM_CXSCREEN);
end;
function ScreenHeight: integer;
begin
Result := GetSystemMetrics(SM_CYSCREEN);
end;
procedure ShowLastError(const Error: LongWord; MsgPrefix: string = ''; MsgTitle: string = 'System error'; dwHandle: DWORD = 0);
var
lpBuffer: PChar;
begin
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,
nil, Error,
LANG_NEUTRAL or (SUBLANG_DEFAULT shl 10),
PChar(@lpBuffer), 0, nil
);
MessageBox(dwHandle, PChar(MsgPrefix + string(lpBuffer)), PChar(MsgTitle), MB_OK or MB_ICONEXCLAMATION);
LocalFree({%H-}Cardinal(lpBuffer));
end;
function RestartWindows: Boolean;
var
vi: TOSVersionInfo;
hToken: THandle;
tp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
Result := False;
FillChar(tp{%H-}, SizeOf(tp), 0);
vi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(vi);
if vi.dwPlatformId <> VER_PLATFORM_WIN32_NT then Result := ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0)
else
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken{%H-}) then
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid) then
begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), tp, ReturnLength{%H-}) then
Result := ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
end;
end;
function ExitWindows2: Boolean;
var
vi: TOSVersionInfo;
hToken: THandle;
tp: TTokenPrivileges;
ReturnLength: Cardinal;
begin
Result := False;
vi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if not GetVersionEx(vi) then Exit;
FillChar(tp{%H-}, SizeOf(tp), 0);
if vi.dwPlatformId <> VER_PLATFORM_WIN32_NT then Result := ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0)
else
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken{%H-}) then
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid) then
begin
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), tp, ReturnLength{%H-}) then
Result := ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
end;
end;
function SearchPathForFile(const ShortFileName: string; DefResult: string = ''; PathToSearch: string = ''): string;
var
Buffer: array[0..511] of Char;
dwX: DWORD;
lpFilePart: PChar;
begin
Result := DefResult;
FillChar(Buffer{%H-}, SizeOf(Buffer), 0);
lpFilePart := nil;
if PathToSearch <> '' then
dwX := SearchPath(PChar(PathToSearch), PChar(ShortFileName), nil, Length(Buffer), Buffer, lpFilePart)
else
// [FPC] Taka sytuacja: Bez wynilowania PathToSearch funkcja SearchPath siê wykrzacza.
dwX := SearchPath(nil, PChar(ShortFileName), nil, Length(Buffer), Buffer, lpFilePart);
if dwX = 0 then Exit;
Result := Buffer;
end;
function GetWindowsVersion: integer;
var
ovi: TOsVersionInfo;
begin
{--
VER_PLATFORM_WIN32s = 0;
VER_PLATFORM_WIN32_WINDOWS = 1;
VER_PLATFORM_WIN32_NT = 2;
--}
ovi.dwOSVersionInfoSize := SizeOf(ovi);
if GetVersionEx(ovi) then Result := ovi.dwPlatformId
else Result := -1; //<-- jeœli ERROR to Result = - 1
end;
function MyDir: string;
begin
Result := rbs(ExtractFileDir(ParamStr(0)));
end;
function ComputerName: string;
var
buffer: array[0..254] of Char;
BufSize: DWORD;
begin
BufSize := SizeOf(buffer);
FillChar(buffer{%H-}, BufSize, 0);
GetComputerName(buffer, BufSize);
Result := buffer;
end;
function UserName: string;
var
Buffer: array[0..254] of Char;
BufSize: DWORD;
begin
BufSize := SizeOf(Buffer);
FillChar(Buffer{%H-}, BufSize, 0);
GetUserName(Buffer, BufSize);
Result := Buffer;
end;
function TempDir(ErrorResult: string = ''): string;
var
Buffer: array[0..MAX_PATH - 1] of Char;
begin
FillChar(Buffer{%H-}, SizeOf(Buffer), 0);
Windows.GetTempPath(Length(Buffer), Buffer);
if Buffer <> '' then Result := Buffer
else Result := ErrorResult;
end;
function WinDir: string;
var
Buffer: array[0..MAX_PATH - 1] of Char;
begin
FillChar(Buffer{%H-}, SizeOf(Buffer), 0);
GetWindowsDirectory(Buffer, SizeOf(Buffer));
Result := Buffer;
end;
function SysDir: string;
var
Buffer: array[0..MAX_PATH - 1] of Char;
begin
FillChar(Buffer{%H-}, SizeOf(Buffer), 0);
GetSystemDirectory(Buffer, SizeOf(Buffer));
Result := Buffer;
end;
procedure GetEnvironmentList(sl: TStringList);
var
Base, P: PChar;
EnvStr: string;
begin
Base := GetEnvironmentStrings;
if Base = nil then Exit;
P := Base;
while P^ <> #0 do
begin
EnvStr := P;
if EnvStr[1] <> '=' then sl.Add(EnvStr);
P := P + Length(EnvStr) + 1;
end;
FreeEnvironmentStrings(Base);
end;
function GetEnvironmentString(EnvVar: string; AddPercents: Boolean = True): string;
var
Buffer: array[0..2047] of Char;
begin
FillChar(Buffer{%H-}, SizeOf(Buffer), 0);
if AddPercents then EnvVar := '%' + EnvVar + '%';
ExpandEnvironmentStrings(PChar(EnvVar), Buffer, SizeOf(Buffer));
Result := Buffer;
end;
function ExpandEnvironmentString(const EnvVar: string; AddPercents: Boolean = True): string;
begin
Result := GetEnvironmentString(EnvVar, AddPercents);
end;
{$ENDIF} // MSWINDOWS
end.