![]() |
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Super,
danke dir für den Tip :thumb: . 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 :roll: )
Delphi-Quellcode:
Die meisten Anwendungen benutzen hier schon alleine doppelt so viele dll´s wie mein "scheduler", also schon mal ein grund zur Freude!
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 Allerdings kann ich die Anzahl der geladenen dll´s durch Hardcore freigabe :zwinker: :stupid: ala
Delphi-Quellcode:
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.
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; 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 |
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Zitat:
|
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Einfach, weil ich mich mit der API einfach nicht so gut auskenne, als das ich komplett auf die Delphi Komponenten Verzichten möchte.
Da sag ich doch: "Lieber den spatz in der hand, als die Taube auf dem dach." greez |
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Dann lerne es doch, schau Dir Tutorials an und fang einfach an. Wenn Du etwas erreichen willst, dann musst du auch was dafür tun.
Mit VCL geht es eben nicht. Punkt. |
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Ok,
vielen dank. Mir geht es immer noch um die Größe im Arbeitsspeicher und die lässt sich in meinem derzeitigen Exe-Status dadurch reduzieren indem ich dll´s freigebe! Und nicht durch WinAPI tutorials. Sorry aber was ich da oben schreibe macht sinn, und ich bin ganz und gar nicht zu faul um was zu lernen. Mag sein das das zuviel text ist ums durchzulesen, aber da steht alles drin und das thema hat länger nix mehr mit VCL etc. zu tun, da ich Funktionen aus der VCL benutze die nur mit einem sehr großen aufwand sich durch eine reine WinAPI version ersetzen lassen. Wer hat schon lust etwas was fertig ist und funktioniert in 1 1/2 Wochen (oder was weiß ich) neuzubauen = das rad neu erfinden? Also...bitte lass mich einfach meine dll frage stellen denn mit Zitat:
greez gabneo PS: Ich will damit nicht schnippisch oder sonstwie klingen. Also nix für ungut! |
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Die VCL verwendet er ja auch nicht ;) (edit: hat er ja inzwischen auch geschrieben)
Das "Problem" mit dem Entladen dieser DLLs ist: die brauchst Du ja! Zumindest wahrscheinlich zu großen Teilen. Weißt es nur noch nicht ;) Die RTL von Delphi benutzt halt diverse Funktionen aus diesen DLLs. Wenn Du einfach hingehst und einige DLLs entlädst, weißt Du nie, welche Funktionen gerade zufällig davon abhängen... besser also, dafür zu sorgen, daß sie von vorneherein gar nicht erst geladen werden! Z.B.sehe ich da comctl32.dll und gdi32.dll ... das deutet darauf hin, daß irgendwo noch eine Unit eingebunden ist, die doch noch etwas grafisches veranstalten will. Das kann irgendwo Code sein, der rein theoretisch noch ein MessageBox aufrufen könnte z.B., oder irgend eine indirekt damit zusammenhängende Unit. Ich etwa hab gerade noch einmal in einigen meiner Kommandozeilenprogramme nachgeschaut: einmal MessageBox plus AppEvents für irgendne Konstante eingebunden ergibt stolze 300 KB mehr (und hat auch den statischen Import jener DLLs bewirkt). Aber nochmal vorsichtshalber: die DLLs entladen ist relativ heikel und hat eher zweifelhafte Erfolge... nutze sie besser als Indiz dafür, wo noch unnötiger Code mit einkompiliert wird. Als Anleitung dafür etwa kannst Du auch ein Programm nehmen, daß anzeigt, welche Funktionen aus diesen DLLs importiert werden (wenns der ProcessExplorer nicht macht, dann z.B. der FileAlyzer). Und wenn Du dann die völlig unnötige Funktion ImageList_Add aus comctl32.dll importiert siehst, suchst Du mal die RTL/VCL-Unit, die diese Funktion importiert, versuchst herauszufinden über welche Umwege diese auch in Dein Projekt eingebunden ist und ob Du diese Abhängigkeit nicht lösen kannst (zwar "kostet" der Import selber nichts, aber diese Unit kann halt jede Menge unnötigen Code mitkompilieren). |
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Zitat:
Und überhaupt VCL/RTL/SAT 1 wo ist da der Unterschied? :mrgreen: Zitat:
Ich würde einfach mal die Uses-Liste komplett wegstreichen (außer die die eigenen Units) und dann schauen, wo es klemmt. IntToStr etc. lassen sich sehr einfach selbst programmieren (wenn's denn daran liegt). Wenn Du die VCL/RTL Sourcen hast, dann kannst Du das Projekt ja mal mit dem Suchpfad kompilieren und per F7 durchsteppen. Anfangs werden ja alle eingebundenen Units initialisiert. Dann siehst du auch, was so alles dazugepackt wird... Wie gesagt: Möglichkeiten gibts Viele.. Zitat:
|
Re: bedarf des Arbeitsspeichers meiner Anwendung verringern
Vielen Dank euch beiden.
Der Filealyzer hats gebracht. Bisher konnte mir kein tool wirklich zeigen, was ich mitcompiliert habe. Doch nun kann ich eindeutig die genutzten DLL´s und die daraus genutzten Funktionen sehen, aus denen ich nur 1-2 Funktionen brauche. Jetzt weiß ich wo ich hinlangen muss. also thema erledigt. thx + greez gabneo :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz