Browse Source

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

Rika Ichinose 2 years ago
parent
commit
62bc640306
3 changed files with 14 additions and 9 deletions
  1. 0 2
      packages/fcl-base/src/syncobjs.pp
  2. 6 0
      rtl/win/sysosh.inc
  3. 8 7
      rtl/win/systhrd.inc

+ 0 - 2
packages/fcl-base/src/syncobjs.pp

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

+ 6 - 0
rtl/win/sysosh.inc

@@ -77,6 +77,12 @@ procedure OleStrToStrVar(source : PWideChar;var dest : AnsiString);inline;
 function StringToOleStr(const source : ansistring) : 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
   TStartupInfo = record
     cb : DWord;

+ 8 - 7
rtl/win/systhrd.inc

@@ -541,15 +541,11 @@ begin
   SetEvent(THandle(state));
 end;
 
-
-type 
-      PWOHandleArray = ^THandle;
-
 function FirstCoWaitForMultipleHandles(dwFlags, dwTimeout: DWORD; cHandles: uint32; pHandles: PWOHandleArray; out lpdwindex: DWORD): HRESULT; stdcall; forward;
 
 var
   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;
 
 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
       WinFreeLibrary(LocalOle32Dll);
   end;
-  CodePointer(CoWaitForMultipleHandles) := WinGetProcAddress(Ole32Dll, 'CoWaitForMultipleHandles');
-  Result := CoWaitForMultipleHandles(dwFlags, dwTimeout, cHandles, pHandles, lpdwindex);
+  CodePointer(CoWaitForMultipleHandlesImpl) := WinGetProcAddress(Ole32Dll, 'CoWaitForMultipleHandles');
+  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;
 
 function intbasiceventWaitFor(Timeout : Cardinal;state:peventstate;UseCOMWait: Boolean = False) : longint;