Also prevent SyncObjs.THandleObject.WaitForMultiple from unconditionally linking to ole32.dll.

This commit is contained in:
Rika Ichinose 2023-07-20 11:52:26 +03:00
parent ba15672a44
commit 62bc640306
3 changed files with 14 additions and 9 deletions

View File

@ -151,8 +151,6 @@ implementation
{$ifdef MSWindows} {$ifdef MSWindows}
uses Windows; uses Windows;
function CoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: ULONG; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall; external 'ole32.dll' name 'CoWaitForMultipleHandles';
{$endif} {$endif}

View File

@ -77,6 +77,12 @@ procedure OleStrToStrVar(source : PWideChar;var dest : AnsiString);inline;
function StringToOleStr(const source : ansistring) : PWideChar;inline; function StringToOleStr(const source : ansistring) : PWideChar;inline;
function StringToOleStr(const source : UnicodeString) : PWideChar;inline; function StringToOleStr(const source : UnicodeString) : PWideChar;inline;
{ To reuse the delayed loading of CoWaitForMultipleHandles in SyncObjs... }
type
PWOHandleArray = ^TWOHandleArray;
TWOHandleArray = array[0 .. 63] of THandle;
function CoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; inline;
type type
TStartupInfo = record TStartupInfo = record
cb : DWord; cb : DWord;

View File

@ -541,15 +541,11 @@ begin
SetEvent(THandle(state)); SetEvent(THandle(state));
end; end;
type
PWOHandleArray = ^THandle;
function FirstCoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall; forward; function FirstCoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall; forward;
var var
Ole32Dll: THandle = 0; { Unloaded at win32 & win64 system_exit. } Ole32Dll: THandle = 0; { Unloaded at win32 & win64 system_exit. }
CoWaitForMultipleHandles: function(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall; CoWaitForMultipleHandlesImpl: function(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall;
= @FirstCoWaitForMultipleHandles; = @FirstCoWaitForMultipleHandles;
function FirstCoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall; function FirstCoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall;
@ -562,8 +558,13 @@ begin
if InterlockedCompareExchange(Pointer(Ole32Dll), Pointer(LocalOle32Dll), nil) <> nil then if InterlockedCompareExchange(Pointer(Ole32Dll), Pointer(LocalOle32Dll), nil) <> nil then
WinFreeLibrary(LocalOle32Dll); WinFreeLibrary(LocalOle32Dll);
end; end;
CodePointer(CoWaitForMultipleHandles) := WinGetProcAddress(Ole32Dll, 'CoWaitForMultipleHandles'); CodePointer(CoWaitForMultipleHandlesImpl) := WinGetProcAddress(Ole32Dll, 'CoWaitForMultipleHandles');
Result := CoWaitForMultipleHandles(dwFlags, dwTimeout, cHandles, pHandles, lpdwindex); Result := CoWaitForMultipleHandlesImpl(dwFlags, dwTimeout, cHandles, pHandles, lpdwindex);
end;
function CoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT;
begin
Result := CoWaitForMultipleHandlesImpl(dwFlags, dwTimeout, cHandles, pHandles, lpdwindex);
end; end;
function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate;UseCOMWait: Boolean = False) : longint; function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate;UseCOMWait: Boolean = False) : longint;