Wie mache ich mein win32 Prog. kleiner?



  • Einfach mal das Fenster minimieren und staunen, wie wenig Speicher verbraucht wird. 🤡

    Alternative könntest Du regelmäßig SetProcessWorkingSetSize mit -1 für den zweiten und dritten Parameter aufrufen, beispielsweise in WM_ENTERIDLE. Das geht aber ganz arg zu Lasten der Performance.

    Eventuell bringt es auch etwas, die Stack-Size herunterzudrehen.

    Aber was ist denn überhaupt das Problem? Was soll das?



  • 16kb ??? Da kann ich ja gleich in VB schreiben.

    Geht doch auch mit 1kb:

    .386
    .model flat, stdcall  ;32 bit memory model
    option casemap :none  ;case sensitive
    
    include 1kBDialogTest.inc
    
    include windows.inc
    include kernel32.inc
    include user32.inc
    include Comctl32.inc
    include shell32.inc
    
    includelib kernel32.lib
    includelib user32.lib
    includelib Comctl32.lib
    includelib shell32.lib
    
    DlgProc			PROTO	:HWND,:UINT,:WPARAM,:LPARAM
    
    .const
    
    IDD_DIALOG1			equ 101
    
    .data
    Hello db "Hello World!",0
    .code
    
    ALIGN 4
    
     DlgTemplateOffset:
    
      ; X:\radasm\Masm\Projects\1kBDialogTest\binres 154 bytes
    
      db 1,0,255,255,0,0,0,0,0,0,0,0,64,8,200,16
      db 2,0,6,0,6,0,76,0,50,0,0,0,0,0,32,0
      db 58,0,41,0,0,0,8,0,0,0,0,1,77,0,83,0
      db 32,0,83,0,97,0,110,0,115,0,32,0,83,0,101,0
      db 114,0,105,0,102,0,0,0,0,0,0,0,0,0,0,0
      db 0,0,1,80,18,0,31,0,38,0,17,0,235,3,0,0
      db 255,255,128,0,69,0,120,0,105,0,116,0,0,0,0,0
      db 0,0,0,0,0,0,0,0,1,0,0,80,2,0,3,0
      db 72,0,17,0,233,3,0,0,255,255,130,0,49,0,107,0
      db 66,0,32,0,33,0,0,0,0,0
    
    start:
    
    	invoke DialogBoxIndirectParam,400000h,offset DlgTemplateOffset,NULL,addr DlgProc,NULL
    	invoke ExitProcess,0
    
    ;########################################################################
    
    DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    
    	mov		eax,uMsg
    	.if eax==WM_COMMAND
    		.if word ptr[wParam]==1003
    			invoke MessageBox,0,offset Hello, offset Hello,MB_OK
    			jmp @F ;Quit!
    		.endif
    	.elseif eax==WM_CLOSE
    		@@:
    		invoke EndDialog,hWin,0
    	.else
    		mov		eax,FALSE
    		ret
    	.endif
    	mov		eax,TRUE
    	ret
    
    DlgProc endp
    
    end start
    


  • Blumentopf schrieb:

    16kb ??? Da kann ich ja gleich in VB schreiben.

    Geht doch auch mit 1kb:

    .386
    .model flat, stdcall  ;32 bit memory model
    option casemap :none  ;case sensitive
    
    include 1kBDialogTest.inc
    
    ...
    

    Na toll, ich rede aber schon noch von C/C++ und nicht von Assembler 🙄

    MfG SideWinder



  • konstruktive Beiträge lese ich da, ich meine allerdings den RAM Bedarf, kann man wohl nicht mit Codereduktion verkleinern oder?

    Das mit dem Assembler gefällt mir - echt heavy 🙂



  • Dann geh mal dort hin:

    http://radasm.visualassembler.com/
    da gibts nen visual assembler for windows editor mit dem machst du ein
    assembler window in 30 sekunden. 1kb klein.
    Dann brauchst du noch den masm32 microsoft compiler, den gibts gratis bei
    http://www.movsd.com/ ---> MASM32 Download



  • ist sicher interessant, habs mir kurz angesehen, kam aber nichts dabei heraus, wer mich mal mit der materie befassen - danke



  • Was soll denn jetzt der Assembler-Quatsch? Mit was willst Du das vergleichen, mit SideWinders Beispiel? Wieviele DialogBoxen siehst Du denn da?

    Außerdem ist mit 16k noch lange nicht Ende der Fahnenstange. Ich habe SideWinders Code fast ohne Änderung in eine 2k exe compiliert (VC6).



  • ich vergleich garnichts, will einfach nur wissen woher diese 1024 k ram belegung bei einem normalen generierten hello world winapi kommen...



  • l00P schrieb:

    ich vergleich garnichts,

    Dich habe ich auch nicht gemeint.

    l00P schrieb:

    will einfach nur wissen woher diese 1024 k ram belegung bei einem normalen generierten hello world winapi kommen...

    Es werden eine ganze Reiche an Kernel- und User-Objekten erzeugt. Die brauchen nunmal Speicher. Deine MessageQueue bekommst Du auch nicht umsonst. Allein die GDI Handle-Table belegt 268K in Deinem Adressraum.

    Da aber auch viele Bereiche von verschieden Processen gemeinsam benutzt werden (z.B. die GDI Handle-Table), ist das wirklich kein Problem.

    [edit] Zusätzlich werden auch noch Dlls in Deinen Adressraum gemappt. In Deinem Fall mindestens user32.dll und kernel32.dll. Die belegen natürlich auch noch. [/edit]



  • -King- schrieb:

    Was soll denn jetzt der Assembler-Quatsch? Mit was willst Du das vergleichen, mit SideWinders Beispiel? Wieviele DialogBoxen siehst Du denn da?

    Außerdem ist mit 16k noch lange nicht Ende der Fahnenstange. Ich habe SideWinders Code fast ohne Änderung in eine 2k exe compiliert (VC6).

    Ich habs zwar vorhin bloß "schnell, schnell" optimiert aber auf 2k komm ich auch nicht runter - wie geht das? Was hast du da noch eingestellt?

    @King: Ihn interessiert ja auch gar nicht wie man den Speicherverbrauch verringern kann sondern warum es gerade 1024K sind - was imho jetzt geklärt ist: Rein zufällig, es könnten genauso gut 1025K sein.

    Diese Diskussion auf "Mach das Prog kleiner" hab ich angefangen, da ich zuerst an den Plattenplatz gedacht habe.

    MfG SideWinder



  • SideWinder schrieb:

    Ich habs zwar vorhin bloß "schnell, schnell" optimiert aber auf 2k komm ich auch nicht runter - wie geht das? Was hast du da noch eingestellt?

    Das Übliche:

    #pragma comment(linker, "/OPT:NOWIN98")
    #pragma comment(linker, "/MERGE:.rdata=.text")
    #pragma comment(linker, "/MERGE:.data=.text")
    
    #include <windows.h> 
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 
    
    EXTERN_C int __cdecl WinMainCRTStartup(VOID)
    {
        ExitProcess(WinMain(GetModuleHandle(NULL), NULL, NULL, SW_SHOW));
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int nShowCmd) 
    { 
        .
        .
        .
    

    Rein zufällig, es könnten genauso gut 1025K sein.

    Das nun gerade nicht, ein Vielfaches von 4K wird es schon sein. 😉



  • -King- schrieb:

    SideWinder schrieb:

    Ich habs zwar vorhin bloß "schnell, schnell" optimiert aber auf 2k komm ich auch nicht runter - wie geht das? Was hast du da noch eingestellt?

    Das Übliche:

    #pragma comment(linker, "/OPT:NOWIN98")
    #pragma comment(linker, "/MERGE:.rdata=.text")
    #pragma comment(linker, "/MERGE:.data=.text")
    
    #include <windows.h> 
     
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 
     
    EXTERN_C int __cdecl WinMainCRTStartup(VOID)
    {
        ExitProcess(WinMain(GetModuleHandle(NULL), NULL, NULL, SW_SHOW));
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int nShowCmd) 
    { 
        .
        .
        .
    

    Rein zufällig, es könnten genauso gut 1025K sein.

    Das nun gerade nicht, ein Vielfaches von 4K wird es schon sein. 😉

    Okay, okay ;).

    MfG SideWinder



  • aha, das heißt also kleinermachen wäre zu aufwendig und bringt nicht viel. Weißt du zufällig wie man ein Programm als Dienst laufen lassen kann und welche nachteile ich dadurch hätte? Ich muß nämlich ein logging tool schreiben das keine Oberfläche hat und maximal durch ein icon im Tray zu finden ist, wie würdest du das anstsellen??

    Gruß
    l00P



  • l00P schrieb:

    aha, das heißt also kleinermachen wäre zu aufwendig und bringt nicht viel. Weißt du zufällig wie man ein Programm als Dienst laufen lassen kann und welche nachteile ich dadurch hätte? Ich muß nämlich ein logging tool schreiben das keine Oberfläche hat und maximal durch ein icon im Tray zu finden ist, wie würdest du das anstsellen??

    Gruß
    l00P

    Das kommt drauf an: Soll das Tool ein Dienst sein oder nicht? Da liegt ja schon eine grundlegende Entscheidung die du treffen musst.

    MfG SideWinder



  • Durch einen Service hast Du keine Nachteile. Nur das mit dem Icon solltest Du Dir verkneifen. Ich halte nichts von Diensten, die mit dem User interagieren. Du bist besser dran, wenn Du Deinen Dienst frei von Fenstern hälst.

    Die Administratoren wissen auch so, wie sie den Dienst starten und stoppen können.


Anmelden zum Antworten