Einzelnen Beitrag anzeigen

gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: bedarf des Arbeitsspeichers meiner Anwendung verringern

  Alt 10. Mai 2007, 05:23
Super,
danke dir für den Tip . Ich hatte Process-explorer auf meiner platte, aber reinschauen hat geholfen, na manchmal sieht man halt den wald vor lauter Bäumen nicht.
Ich konnte das Problem nun eingrenzen.
Das Problem ist, das die Komponenten die man verwendet dll´s beim starten der Kompilierten Exe mit in den Arbeitsspeicher reinladen. Dazu kommt die Liste an dll´s die einem von Windows aufgezwungen werden. In der Summe sieht das unter Vista dann so aus:

(RTSUltraMonHook.dll ist natürlich eine fremd-dll für einen systemhook von einer anderen Anwendung, äußerst interessant das windows meine applikation "zwingt" diese mitzuladen )

Delphi-Quellcode:
Process: meinscheduler.exe Pid: 3524 //bei meiner beispielanwendung

Name    Description   Company Name   Version

advapi32.dll   Erweiterte Windows 32 Base-API   Microsoft Corporation   6.00.6000.16386
aero.msstyles   Ressourcen-DLL für visuellen Stil "Windows-Aero"  Microsoft Corporation   6.00.6000.16386
clbcatq.dll   COM+ Configuration Catalog   Microsoft Corporation   2001.12.6930.16386
comctl32.dll   Bibliothek für Steuerelemente   Microsoft Corporation   5.82.6000.16386
comctl32.dll   Bibliothek für Steuerelemente   Microsoft Corporation   6.10.6000.16386
comctl32.dll.mui   Bibliothek für allgemeine Steuerelemente   Microsoft Corporation   5.82.6000.16386
gdi32.dll    GDI Client DLL   Microsoft Corporation   6.00.6000.16386
imm32.dll    Multi-User Windows IMM32 API Client DLL   Microsoft Corporation   6.00.6000.16386
kernel32.dll   Client-DLL für Windows NT-Basis-API   Microsoft Corporation   6.00.6000.16386
locale.nls         
locale.nls         
lpk.dll    Language Pack   Microsoft Corporation   6.00.6000.16386
msctf.dll    MSCTF-Server-DLL   Microsoft Corporation   6.00.6000.16386
msvcrt.dll   Windows NT CRT DLL   Microsoft Corporation   7.00.6000.16386
ntdll.dll    DLL für NT-Layer   Microsoft Corporation   6.00.6000.16386
ole32.dll    Microsoft OLE für Windows   Microsoft Corporation   6.00.6000.16386
oleaut32.dll   Microsoft Corporation   6.00.6000.16386
propsys.dll   Microsoft-Eigenschaftensystem   Microsoft Corporation   6.00.6000.16386
rpcrt4.dll   Remoteprozeduraufruf-Laufzeitumgebung   Microsoft Corporation   6.00.6000.16386
RTSUltraMonHook.dll   Hook DLL for Realtime Soft UltraMon   Realtime Soft   2.07.0001.0000
RTSUltraMonHookRes.dll   UltraMon Resource DLL   Realtime Soft   2.06.0023.0003
secur32.dll   Security Support Provider Interface   Microsoft Corporation   6.00.6000.16386
setupapi.dll   Windows Setup-API   Microsoft Corporation   6.00.6000.16386
shell32.dll   Allgemeine Windows-Shell-DLL   Microsoft Corporation   6.00.6000.16386
shlwapi.dll   Shell Light-weight-Dienstprogrammbibliothek   Microsoft Corporation   6.00.6000.16386
meinscheduler.exe   
user32.dll   Multi-User Windows USER API Client DLL   Microsoft Corporation   6.00.6000.16438
user32.dll.mui   Multi-User Windows USER API Client DLL   Microsoft Corporation   6.00.6000.16386
userenv.dll   Userenv   Microsoft Corporation   6.00.6000.16386
usp10.dll    Uniscribe Unicode script processor   Microsoft Corporation   1.626.6000.16386
uxtheme.dll   Microsoft UxTheme-Bibliothek   Microsoft Corporation   6.00.6000.16386
version.dll   Version Checking and File Installation Libraries   Microsoft Corporation   6.00.6000.16386
Die meisten Anwendungen benutzen hier schon alleine doppelt so viele dll´s wie mein "scheduler", also schon mal ein grund zur Freude!

Allerdings kann ich die Anzahl der geladenen dll´s durch Hardcore freigabe ala

Delphi-Quellcode:
Quelle: [url]http://www.swissdelphicenter.ch/torry/showcode.php?id=1202[/url]

...remove a Dll from memory?
Author: Michael Wiren

function KillDll(aDllName: string): Boolean;
var
  hDLL: THandle;
  aName: array[0..10] of char;
  FoundDLL: Boolean;
begin
  StrPCopy(aName, aDllName);
  FoundDLL := False;
  repeat
    hDLL := GetModuleHandle(aName);
    if hDLL = 0 then
      Break;
    FoundDLL := True;
    FreeLibrary(hDLL);
  until False;
  if FoundDLL then
    MessageDlg('Success!', mtInformation, [mbOK], 0)
  else
    MessageDlg('DLL not found!', mtInformation, [mbOK], 0);
end;
nicht reduzieren. Übrigens hatte das killen der dll, nur auswirkungen auf meine Applikation, was beweist das die geladenen dll´s extra zu meiner runtime exe zugeladen werden.
Diese wurde nach dem killen einiger dll´s ziemlich klein.
Also wird die Lösung des Dilemma´s wohl darin liegen, das ich Windows per API dazu bringe, den wie du sagtest MEM_COMMIT zu freen. So in etwa, wie das diese ganzen Arbeitsspeicher-freiräum tools machen, nur halt für eine=meine Anwendung.
Wie das genau gehen soll, weiß ich noch nicht, den um eine saubere Lösung hinzukriegen gilt es bei solchen sachen immer viel abzuwägen.

Was hältst/haltet du/ihr von dieser beweiskette?

Übrigens Vielen Dank für die Hilfe!
greez
gabneo
  Mit Zitat antworten Zitat