Ergebnis 1 bis 6 von 6
  1. #1

    Standard [C++] SetConsoleIcon

    Um hier in die C++-Ecke ein bisschen Leben einzuhauchen, hab ich mich entschlossen hier mal ein paar Tuts und SourceCodes von mir + the internetz zu posten, die relativ cool sind und zeigen, dass man mit C++ und dem MS Compiler + VS gut was schreiben kann. Zum Anfang um sozusagen einem Standard "Hello World"-Console einen netten Touch zu verschaffen:
    SetConsoleIcon ist zwar nicht auf MSDN aufgeführt existiert jedoch in der Kernel32.dll. Mit dieser Funktion können wir bei einer normalen Console das Icon ändern.

    Source:
    PHP-Code:
    BOOL _SetConsoleIcon(HICON hIcon)
    {
        
    typedef BOOL (WINAPI *SetConsoleIcon_t)(HICON handle);

        
    SetConsoleIcon_t SetConsoleIcon;

        
    HMODULE hDll GetModuleHandleA("kernel32");
        if(
    hDll)
        {
            
    SetConsoleIcon = (SetConsoleIcon_t)GetProcAddress(hDll"SetConsoleIcon");
            if(
    SetConsoleIcon)
                return 
    SetConsoleIcon(hIcon);
        }

        return 
    false;
    }

    // kann zB so in main() verwendet werden (mit VS ):
    _SetConsoleIcon(LoadIcon(instance,MAKEINTRESOURCE(IDI_ICON1))); 
    Credit bzw Denkanstoß: Somewhere in the internet.
    Geändert von DDL (10.12.2011 um 11:36 Uhr)

  2. #2
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    Also bitte bevor du so einen Müll postest, poste lieber gar nichts. In diesem Code Schnipsel sind so viele Fehler drin. Dazu kommt noch, dass du da Techniken verwendest, die ein Anfänger erst nach Monaten verstehen kann. Copy/Paste klappt auch nicht, weil man in der, von dir vorgeschlagenen, main() Methode keine "instance" Variable hat.

  3. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    motion (05.12.2011), sotpot (05.12.2011)

  4. #3
    Transpinguin Avatar von IRET
    Registriert seit
    02.09.2008
    Beiträge
    1.295

    Standard

    Zuerst mal danke für deinen Versuch, doch poste bitten keinen Blödsinn.
    Du kannst die DLL nicht wieder "befreien" bevor du die Funktion nicht verwendet hast. Bei einer anderen DLL wird es sicher zu einem Fehler kommen, da die angegebene Adresse dann nicht mehr existiert. Der einzige Grund warum es hier geht ist, dass kernel32.dll sowieso immer geladen ist.
    Weiters sind absolut keine nützlichen Kommentare drin.
    Außerdem ist es total ineffizient die DLL jedes mal neu zu laden.
    Meine ausgebesserte C-Version:
    PHP-Code:
    // Variable für die Funktion
    typedef BOOL (WINAPI *SetConsoleIcon_t)(HICON handle);

    // Main-Funktion
    int main(void)
    {
        
    // Variablen für main()
        
    SetConsoleIcon_t SetConsoleIcon;   // Funktions-Variable
        
    HMODULE hKernel32;    // Handle für kernel32.dll
        
    HICON ico;    // Handle für das Icon
        
    HMODULE hModule;    // Handle für eigene Instanz

        // kernel32.dll laden
        
    hKernel32 LoadLibrary("kernel32.dll");
        
    // Hole Adresse der Funktion und setze Funktions-Variable darauf
        
    SetConsoleIcon = (SetConsoleIcon_t)GetProcAdress(hKernel32,"SetConsoleIcon"); 
        
    // Sollte ein Fehler aufgetreten sein, wird dieser jetzt gemeldet
        
    if (SetConsoleIcon == || hKernel32 == 0)
        {
            
    MessageBox(0,"Error loading kernel32.dll or getting Adress of SetConsoleIcon()","Error",0);
            return -
    1;
        }
        
    // Instanz holen
        
    hModule GetModuleHandle(0);
        
    // Icon laden
        
    ico LoadIcon(hModuleMAKEINTRESOURCE(IDT_ICON1));
        
    // Icon setzen
        
    SetConsoleIcon(hModuleico);
        
    // Aufräumen
        
    FreeLibrary(hKernel32);

        return 
    0;

    Ich habe das jetzt frei getippt, hoffe allerdings dass es eher verständlich ist. Allerdings muss man hierbei auch wissen was Resourcen sind.

  5. #4
    Neuling
    Registriert seit
    27.10.2011
    Beiträge
    2

    Standard

    Kommentare wie die, die du hier vorschlägst, sind absolut sinnfrei. Dann schreib lieber über die Funktion ein paar Sätze, als jede triviale Zeile zu kommentieren ("// Aufräumen", seriously).

    Du kannst die DLL nicht wieder "befreien" bevor du die Funktion nicht verwendet hast. Bei einer anderen DLL wird es sicher zu einem Fehler kommen, da die angegebene Adresse dann nicht mehr existiert.
    Read ALL the MSDN.

  6. #5

    Standard

    @G36KV: Dann zeig mir bitte mal meine Fehler im Code, bevor du einen reinen Flame-Post raushaust.
    instance soll nur anzeigen, dass dort noch die HINSTANCE oder HMODULE eingefügt werden muss. Dies erhält man zB wie bei fuckinghot19 mit hModule = GetModuleHandle(0);

    @fuckinghot1: Mkay...
    Ineffizienz im Sinne von ???, man ruft die Funktion ja nur einmal auf...
    BTW sehe ich das mit den Kommentaren gleich wie derp, zu viele lassen den Code nur unübersichtlich aussehen und wer verbietet mit hier in "SourceCode"-Sektion nur ein Code-Snippet zu posten.

    @derp, könntest du das bitte genauer erklären? Bezieht sich der reference count auch auf die SetConsoleIcon?

  7. #6
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    hier:

    PHP-Code:
    BOOL _SetConsoleIcon(HICON hIcon)
    {
        
    typedef BOOL (WINAPI *SetConsoleIcon_t)(HICON handle);

        
    SetConsoleIcon_t SetConsoleIcon;

        
    HMODULE hDll LoadLibraryA("kernel32"); //loadlibrary ist falsch -> getmodulehandle
        
    if(hDll)
        {
            
    SetConsoleIcon = (SetConsoleIcon_t)GetProcAddress(hDll"SetConsoleIcon"); // null check fehlt
            
    FreeLibrary(hDll); // weg
            
    return (BOOL)SetConsoleIcon(hIcon); // C return - int
        
    }
        else 
            return 
    false// c++ return - bool
    }

    // kann zB so in main() verwendet werden (mit VS ):
    _SetConsoleIcon(LoadIcon(instance,MAKEINTRESOURCE(IDI_ICON1))); 

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •