Announcement

Collapse
No announcement yet.

Wie kann man User- bzw. GDI - Ressourcen überwachen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann man User- bzw. GDI - Ressourcen überwachen

    Wenn sehr viel HTML-Seiten mit vielen GIF-Bildern angezeigt werden und
    sehr viel Programme geladen sind, kann es schon mal vorkommen, das "keine Leinwand vorhanden" angezeigt wird. Da ist es aber meistens schon zu spät.

    Ich möchte abfragen können, ob z.B. noch 20% des GDI verfügbar sind.
    Ansonsten möchte ich den Hinweis bringen, dass erst andere Fenster oder
    Anwendungen geschlossen werden müssen.
    Was ist zu tun.. ???

  • #2
    Hallo,

    unter Windows 95/98 steht das System-Tool <b>Ressourcen-Anzeige</b> zur Verfügung, das die System-Ressourcen sowie die USER- und GDE-Ressourcen anzeigen kann. Allerdings besteht das Problem darin, dass unter Windows 9x der USER- und GDI-Teil noch in 16-Bit vorliegen, und Delphi 5 als 32-Bit-Umgebung daher nicht so ohne weiteres auf die 16-Bit-DLL-Funktionen zurückgreifen kann. Microsoft hat für derartige Fälle das Prinzip des <i>Thunkings</i> vorgesehen, und untersucht man die Ressourcen-Anzeige näher, fällt dort die eingebundene DLL <i>RSRC32.DLL</i> auf. Somit kann man den "alten" 16-Bit-Weg auch unter 32-Bit einschlagen, wie das folgende Beispiel demonstriert:
    <pre>
    const
    RT_System = 0;
    RT_GDI = 1;
    RT_User = 2;

    type
    TFuncGetFreeSysRes = function(ResType: Integer): Integer; stdcall;

    var
    hRSRC32 : THandle = 0;
    FuncGetFreeSysRes : TFuncGetFreeSysRes = nil;

    function GetFreeSystemResources(ResType: Integer): Integer;
    begin
    Result := 0;
    if hRSRC32 = 0 then
    Abort;
    if @FuncGetFreeSysRes <> nil then
    Result := FuncGetFreeSysRes(ResType);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ShowResourceInfo;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    ShowResourceInfo;
    end;

    procedure TForm1.ShowResourceInfo;

    procedure SetProgressBar(aPB: TProgressBar; aValue: Integer);
    begin
    aPB.Position := aValue;
    aPB.Hint := Format('%d %%', [aValue]);
    end;

    begin
    SetProgressBar(ProgressBarSYSTEM, GetFreeSystemResources(RT_System));
    SetProgressBar(ProgressBarUSER, GetFreeSystemResources(RT_User));
    SetProgressBar(ProgressBarGDI, GetFreeSystemResources(RT_GDI));
    end;

    initialization
    hRSRC32 := LoadLibrary('RSRC32.DLL');
    if hRSRC32 <> 0 then
    @FuncGetFreeSysRes := GetProcAddress(
    hRSRC32, '_MyGetFreeSystemResources32@4' );

    finalization
    if hRSRC32 <> 0 then
    FreeLibrary(hRSRC32);
    </pre&gt

    Comment


    • #3
      Vielen Dank. Leider gibt LoadLibrary('RSRC32.DLL') 0 zurück, obwohl <B>RSRC32.DLL</B> vorhanden ist.

      Kann es daran liegen, da noch DELPHI4 im Einsatz ist

      Comment


      • #4
        Hallo,

        kann das Windows9x-Zubehör <b>Ressourcen-Anzeige</b> aufgerufen werden und zeigt dieses auch Werte an? Wenn das funktioniert, sind auch alle implizit eingebundenen DLLs vorhanden. Daher würde ich genauso vorgehen, wie es für derartige Fälle im Platform SDK beschrieben ist. Wenn LoadLibrary den Wert 0 zurückliefert, soll man über GetLastError den Grund dafür beim Betriebssystem hinterfragen. In Delphi steht dazu die Funktion <b>RaiseLastWin32Error</b> zur Verfügung, die den Aufruf der Win32-API-Funktion <b>GetLastError</b> vereinfacht.

        Comment


        • #5
          Hallo Andreas,

          alles ist jetzt in Ordnung. Super!
          <B>Ressourcen-Anzeige</B> war noch nicht auf dem Rechner installiert.

          Besten Dank!

          Comment

          Working...
          X