A lot of programs save their icon in the Extended Attribute .ICON. You may use the following code to extract the icon from the EAs of a program (see also Icon resources in default OS/2 DLLs and Get icons from the OS2.INI file):
/* */
/* Name: GetIcon.CMD */
/* */
/* Function: */
/* sample program to get the icons from the OS2.INI file */
/* */
/* Usage: */
/* GetIcon fileName */
/* */
/* Where: */
/* fileName - name of the file with the .ICON EA */
/* */
/* Returns: */
/* - */
/* */
/* Credits: */
/* - */
/* */
/* History: */
/* RXT&T v2.00 /bs */
/* - initial release */
/* RXT&T v2.10 /bs */
/* - added some error checking code */
/* */
/* Notes: */
/* */
/* The .ICO files are created in the current directory. */
/* */
/* Tested only with WARP. */
/* */
/* */
/* (c) 1996 Bernd Schemmer, Germany, EMail: Bernd.Schemmer@gmx.de */
/* */
parse arg sourceFileName
sourceFileName = strip( sourceFileName )
/* load the necessary REXXUTIL function */
call RxFuncAdd "SysGetEA", "REXXUTIL", "SysGetEA"
/* check the parameter */
if sourceFileName = "" then
do
say "Usage: GetIcon fileName"
exit 2
end /* if sourceFileName = "" then */
iconData = ""
/* use ".ICON1" to retrieve the Animation icon of */
/* folder */
if SysGetEA( sourceFileName, ".ICON", "iconData" ) <> 0 | iconData = "" then
do
say "Error: Either the file does not exist or the file has no .ICON EA"
exit 3
end /* if SysGetEA( ... */
/* check the type and format of the EA v2.10 */
parse var iconData EAType +2 EALength +2 IconData /* v2.10 */
EALength = c2d( translate( "12", EALength, "21" ) ) /* v2.10 */
if EAType <> "F9FF"x | , /* v2.10 */
EALength <> length( iconData ) then /* v2.10 */
do /* v2.10 */
say "Error: The .ICON EA is corrupted!" /* v2.10 */
exit 5 /* v2.10 */
end /* if EAType <> "F9FF"x | ... */ /* v2.10 */
/* create the name for the target file */
i = lastPos( ".", sourceFileName )
j = lastPos( "\", sourceFileName )
if i = 0 | ( i < j ) then
targetFileName = sourceFileName || ".ICO"
else
targetFileName = substr( sourceFileName, 1, i ) || "ICO"
if stream( targetFileName, "c", "QUERY EXISTS" ) <> "" then
do
say "Error: The targetfile " || ,
targetFileName || ,
" already exist!"
exit 4
end /* if stream( ... */
/* create, write and close the ICON file */
call stream targetFileName, "c", "OPEN WRITE"
call CharOut targetFileName, iconData
call stream targetFileName, "c", "CLOSE"
say "Iconfile " || targetFileName || " created."
exit 0