PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] SetConsoleIcon



DDL
05.12.2011, 17:04
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:

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.

G36KV
05.12.2011, 18:28
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.

IRET
05.12.2011, 19:42
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:


// 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 == 0 || 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(hModule, MAKEINTRESOURCE(IDT_ICON1));
// Icon setzen
SetConsoleIcon(hModule, ico);
// 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.

derp
05.12.2011, 20:44
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.

DDL
06.12.2011, 12:40
@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?

G36KV
06.12.2011, 17:50
hier:


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)));