News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

Creating an Icon for a Console application

Started by pcMike, April 19, 2016, 01:44:46 PM

Previous topic - Next topic

pcMike

I have a Console mode Win32 application that I want to have a custom icon for, but after following instructions I found in the old forum, I'm unable to make it appear in the upper-left corner of my application.

I placed a MyIcon.ico in my project folder, along with an rsrc.rc file that contains the following line:
100 icon discardable "MyIcon.ico"

Then I ran the resource compiler like so:
\masm32\bin\rc /v rsrc.rc
\masm32\bin\cvtres /machine:ix86 rsrc.res

This successfully created the rsrc.res and rsrc.obj files.

Next I load my ASM file into QE, and select "Console Assemble & Link". and I see the .EXE file is about 1K larger then before, so it seems to have the new resource included. But when I run it, the Icon is still the default Command Prompt icon.

Can anyone see what I did wrong?

pcMike

I discovered the Icon only fails to load when I open the application from a Command Prompt. If I open it from Windows Explorer, then the icon loads as it should.

It might be because I'm running under Windows 10 (Using the Legacy Command Prompt), but I see other Win32 Console programs are able to set it correctly even when run from the same Command Prompt.

hutch--

Mike,

This is just a guess but when you run the console, the icon would be for CMD.EXE, not your app.

pcMike

Right Hutch, it is the CMD.EXE icon that continues to appear after I run my program from the Command Prompt. The same happens under Windows 7.

I did some more research and I see that I will need to use the LoadIcon() and SetConsoleIcon() functions.
I found a nice example from Vortex here in written in C which correctly sets the icon from the Command Prompt:

http://www.masmforum.com/board/index.php?topic=14795.0


pcMike

I found another thread in which Vortex had converted the above C sample to MASM32, and this was exactly what I needed.

http://www.masmforum.com/board/index.php?topic=11772.0

nidud

#5
deleted

TWell

An another way:.386
.model flat,stdcall

ExitProcess PROTO :DWORD
GetModuleHandleA PROTO :DWORD
GetConsoleWindow PROTO
INCLUDELIB kernel32.lib
LoadIconA PROTO :DWORD,:DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
SendMessageA PROTO :DWORD,:DWORD,:DWORD,:DWORD
INCLUDELIB user32.lib
;WM_GETICON = 007Fh
;WM_SETICON = 0080h

.data?
hWnd   dd ?
hIcon0 dd ?
hIcon  dd ?

.code
start:
    invoke  GetModuleHandleA,0
    invoke  LoadIconA,eax,100
    mov     hIcon,eax
    invoke  GetConsoleWindow
    mov     hWnd,eax
    invoke  SendMessageA,eax,7Fh,0,0 ; original icon
    mov     hIcon0,eax
    invoke  SendMessageA,hWnd,80h,0,hIcon
    invoke  MessageBoxA,0,0,0,0
    invoke  SendMessageA,hWnd,80h,0,hIcon0 ; original icon back
    invoke  ExitProcess,0
END start

jj2007

Totally sufficient, provided you link it with the *.res file produced by \masm32\bin\rc.exe:
include \masm32\include\masm32rt.inc
.code
start:
  inkey "ok?"
  exit
end start


You won't see the icon from a DOS prompt. However, start ConsoleWithIconMasm32 works.

pcMike

Thanks for all the feedback everyone!  :t

Nidud: I tryed using Open Watcom resource compiler using the command line you suggested, and it made my exe larger but when I try to run it, Windows 10 x86 says:
"This App can't run on your PC. To find a version for your PC, check with your software publisher."
It seems to have done something that Win10 does not approve of.

Tim: Your suggestion works perfectly, and I like that I don't need to use an undocumented function. It's also nice that I can restore the original icon for CMD.EXE when I exit.

JJ: So if I understand correctly, you are saying that cvtres.exe is not needed after running rc.exe? In any case, my goal is to have the icon appear even when running it from the Command Prompt.


jj2007

Quote from: pcMike on April 20, 2016, 03:05:48 PMJJ: So if I understand correctly, you are saying that cvtres.exe is not needed after running rc.exe? In any case, my goal is to have the icon appear even when running it from the Command Prompt.

In case you already have \Masm32\MasmBasic\RichMasm.exe on your disk, attached an example. Just replace Eye.ico with, for example, globe.ico and hit F6.

The point is that Windows knows what to do with an icon in the resource section. But check also the OPT_Run parameter.

Note you need MasmBasic's editor but the code generated is plain Masm32.

nidud

#10
deleted

Siekmanski

Creative coders use backward thinking techniques as a strategy.

Vortex

A resource linker can be used to add an icon to an executable :

QuoteThis small command line tool links a binary Win32 resource file (*.res) into an executable (exe or dll).
Binary resource files you can create using the Borland Resource Workshop, with the Microsoft Resource Compiler and many other resource compilers.
First build your application (exe/dll) using your favorite compiler and after You can link the resources into your application using RLINK32.EXE

http://www.rowalt.de/pc/programming/toolse.htm

pcMike

nidud: Where can I download asmc?

Vortex: The ConsoleIcon.exe shows the icon when I run it from explorer or QuickEditor, but not from the Command Prompt.  Interestingly I can run your build.bat and run ConsoleIcon.exe, but if I use that batch file to build my console App, then when I run it I get the same Windows 10 error "This app can't run on your PC. To find a version for your PC, check with the software publisher" which I also got when using WRC.EXE.

I narrowed down the problem to my program defining an 8k buffer in .data?
If I change this to a 1k buffer and run your build.bat again, then Windows 10 runs it without the error.

.386
.model flat,stdcall

option casemap:none
   include \masm32\include\windows.inc
   include \masm32\include\user32.inc
   include \masm32\include\kernel32.inc
   include \masm32\include\masm32.inc
   include \masm32\macros\macros.asm
   includelib \masm32\lib\user32.lib
   includelib \masm32\lib\kernel32.lib
   includelib \masm32\lib\masm32.lib

.data?
;----------------------------------------------------
   wcCHAR_INFO     db 8000 dup (?) ; CHAR_INFO Buffer
;----------------------------------------------------
.code

start:
   print "hello world",13,10
   invoke ExitProcess,0
end start


nidud

#14
deleted