Pārlūkot izejas kodu

rtl: don't crash if resource is not found in TResourceStream and was passed by ID instead of Name (in this case exception tried to get a string from ID)

git-svn-id: trunk@17173 -
paul 14 gadi atpakaļ
vecāks
revīzija
812a665cbe
2 mainītis faili ar 24 papildinājumiem un 12 dzēšanām
  1. 2 2
      rtl/objpas/classes/classesh.inc
  2. 22 10
      rtl/objpas/classes/streams.inc

+ 2 - 2
rtl/objpas/classes/classesh.inc

@@ -926,7 +926,7 @@ type
   private
     Res: TFPResourceHandle;
     Handle: THandle;
-    procedure Initialize(Instance: THandle; Name, ResType: PWideChar);
+    procedure Initialize(Instance: THandle; Name, ResType: PWideChar; NameIsID: Boolean);
   public
     constructor Create(Instance: THandle; const ResName: WideString; ResType: PWideChar);
     constructor CreateFromID(Instance: THandle; ResID: Integer; ResType: PWideChar);
@@ -937,7 +937,7 @@ type
   private
     Res: TFPResourceHandle;
     Handle: THandle;
-    procedure Initialize(Instance: THandle; Name, ResType: PChar);
+    procedure Initialize(Instance: THandle; Name, ResType: PChar; NameIsID: Boolean);
   public
     constructor Create(Instance: THandle; const ResName: string; ResType: PChar);
     constructor CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);

+ 22 - 10
rtl/objpas/classes/streams.inc

@@ -772,49 +772,61 @@ end;
 {****************************************************************************}
 
 {$ifdef UNICODE}
-procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PWideChar);
+procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PWideChar; NameIsID: Boolean);
   begin
     Res:=FindResource(Instance, Name, ResType);
     if Res=0 then
-      raise EResNotFound.CreateFmt(SResNotFound,[Name]);
+      if NameIsID then
+        raise EResNotFound.CreateFmt(SResNotFound,[IntToStr(PtrInt(Name))])
+      else
+        raise EResNotFound.CreateFmt(SResNotFound,[Name]);
     Handle:=LoadResource(Instance,Res);
     if Handle=0 then
-      raise EResNotFound.CreateFmt(SResNotFound,[Name]);
+      if NameIsID then
+        raise EResNotFound.CreateFmt(SResNotFound,[IntToStr(PtrInt(Name))])
+      else
+        raise EResNotFound.CreateFmt(SResNotFound,[Name]);
     SetPointer(LockResource(Handle),SizeOfResource(Instance,Res));
   end;
 
 constructor TResourceStream.Create(Instance: THandle; const ResName: WideString; ResType: PWideChar);
   begin
     inherited create;
-    Initialize(Instance,PWideChar(ResName),ResType);
+    Initialize(Instance,PWideChar(ResName),ResType,False);
   end;
 constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PWideChar);
   begin
     inherited create;
-    Initialize(Instance,PWideChar(ResID),ResType);
+    Initialize(Instance,PWideChar(ResID),ResType,True);
   end;
 {$else UNICODE}
 
-procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PChar);
+procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PChar; NameIsID: Boolean);
   begin
     Res:=FindResource(Instance, Name, ResType);
     if Res=0 then
-      raise EResNotFound.CreateFmt(SResNotFound,[Name]);
+      if NameIsID then
+        raise EResNotFound.CreateFmt(SResNotFound,[IntToStr(PtrInt(Name))])
+      else
+        raise EResNotFound.CreateFmt(SResNotFound,[Name]);
     Handle:=LoadResource(Instance,Res);
     if Handle=0 then
-      raise EResNotFound.CreateFmt(SResNotFound,[Name]);
+      if NameIsID then
+        raise EResNotFound.CreateFmt(SResNotFound,[IntToStr(PtrInt(Name))])
+      else
+        raise EResNotFound.CreateFmt(SResNotFound,[Name]);
     SetPointer(LockResource(Handle),SizeOfResource(Instance,Res));
   end;
 
 constructor TResourceStream.Create(Instance: THandle; const ResName: string; ResType: PChar);
   begin
     inherited create;
-    Initialize(Instance,pchar(ResName),ResType);
+    Initialize(Instance,pchar(ResName),ResType,False);
   end;
 constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer; ResType: PChar);
   begin
     inherited create;
-    Initialize(Instance,pchar(PtrInt(ResID)),ResType);
+    Initialize(Instance,pchar(PtrInt(ResID)),ResType,True);
   end;
 {$endif UNICODE}