ソースを参照

Support Windows XP where SetThreadStackGuarantee is absent.

Rika Ichinose 1 年間 前
コミット
a774075f2f
4 ファイル変更12 行追加7 行削除
  1. 3 3
      rtl/win/sysos.inc
  2. 3 2
      rtl/win/systhrd.inc
  3. 3 1
      rtl/win32/system.pp
  4. 3 1
      rtl/win64/system.pp

+ 3 - 3
rtl/win/sysos.inc

@@ -273,8 +273,8 @@ type
   function GetModuleHandle(p : PAnsiChar) : THandle;
     stdcall;external KernelDLL name 'GetModuleHandleA';
 
-  function SetThreadStackGuarantee(StackSizeInBytes : PPtrUint) : BOOL;
-    stdcall;external KernelDLL name 'SetThreadStackGuarantee';
+var
+  SetThreadStackGuarantee: function(StackSizeInBytes : PPtrUint) : BOOL; stdcall;
 {$else WINCE}
 
    { module functions }
@@ -304,7 +304,7 @@ type
    procedure GetSystemInfo(lpSystemInfo: PSystemInfo); {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetSystemInfo';
 
    function WinLoadLibraryW(lpLibFileName:pwidechar):THandle; {$ifdef wince}cdecl{$else}stdcall{$endif}; external KernelDLL name 'LoadLibraryW';
-   function WinLoadLibraryA(lpLibFileName:pwidechar):THandle; {$ifdef wince}cdecl{$else}stdcall{$endif}; external KernelDLL name 'LoadLibraryA';
+   function WinGetModuleHandleW(lpModuleName:pwidechar):THandle; {$ifdef wince}cdecl{$else}stdcall{$endif}; external KernelDLL name 'GetModuleHandleW';
    {$ifdef wince}
    function WinGetProcAddress(hModule:THandle; lpProcName:PAnsiChar):pointer; {$ifdef wince}cdecl{$else}stdcall{$endif}; external KernelDLL name 'GetProcAddressA';
    {$else}

+ 3 - 2
rtl/win/systhrd.inc

@@ -229,8 +229,9 @@ var
         if ThreadID=TThreadID(0) then
           begin
             InitThread(ti.stklen);
-{$ifndef wince}            
-            SetThreadStackGuarantee(@StackMargin);
+{$ifndef wince}
+            if Assigned(SetThreadStackGuarantee) then
+              SetThreadStackGuarantee(@StackMargin);
 {$endif wince}            
           end;
 

+ 3 - 1
rtl/win32/system.pp

@@ -619,7 +619,9 @@ initialization
   { pass dummy value }
   StackLength := CheckInitialStkLen($1000000);
   StackBottom := StackTop - StackLength;
-  SetThreadStackGuarantee(@StackMargin);
+  CodePointer(SetThreadStackGuarantee) := WinGetProcAddress(WinGetModuleHandleW(KernelDLL), 'SetThreadStackGuarantee');
+  if Assigned(SetThreadStackGuarantee) then
+    SetThreadStackGuarantee(@StackMargin);
 
   cmdshow:=startupinfo.wshowwindow;
   { Setup heap and threading, these may be already initialized from TLS callback }

+ 3 - 1
rtl/win64/system.pp

@@ -478,7 +478,9 @@ initialization
   { pass dummy value }
   StackLength := CheckInitialStkLen($1000000);
   StackBottom := StackTop - StackLength;
-  SetThreadStackGuarantee(@StackMargin);
+  CodePointer(SetThreadStackGuarantee) := WinGetProcAddress(WinGetModuleHandleW(KernelDLL), 'SetThreadStackGuarantee');
+  if Assigned(SetThreadStackGuarantee) then
+    SetThreadStackGuarantee(@StackMargin);
   
   { get some helpful informations }
   GetStartupInfo(@startupinfo);