[Toc][Index]

The keyword ICONRESOURCE


This section is written & Copyright by Christian Langanke (see EMail 
Addresses) Please send any comments or additions to Christian. 
---------- * ----------

All comments on the keyword ICONRESOURCE apply as well to the keyword 
ICONNRESOURCE. 
When loading icons from resource DLLs using the keyword ICONRESOURCE, you 
can specify the DLL in two different ways: 
   1. module name only: ICONRESOURCE=60,PMWP; 
      Such a DLL must be already loaded via (BEGIN/END)LIBPATH. 
      This approach is mostly used with system resource DLLs coming with 
      OS/2 WARP.   
   2. full pathname with extension: ICONRESOURCE=123,D:\TEST\MYRES.DLL; 
      Such a DLL must be already loaded into memory under WARP 3 and must 
      not be loaded under WARP 4 (see comments below) in order to use it 
      with the ICONRESOURCE keyword. 
      This approach is recommended to be used where C/C++ programs or REXX 
      scripts create WPS objects with WinCreateObject/SysCreateObject 
      calls using icons from within application resource DLLs. For that 
      such DLLs need not to reside in a directory being contained in the 
      LIBPATH statement, which is convenient for DLLs only being used 
      within one application. 
 
 See further notes on DLLS at the end of this page about loading DLLs. 
   
 Problems with using the keyword ICONRESOURCE under WARP 3 
    
    Under WARP 3 using the keyword ICONRESOURCE will only succeed when 
    using DLLs being already loaded by the Workplace Shell (like PMWP.DLL) 
    or another process. This applies both to DLLs being referenced with 
    their module name only (such as PMWP) as well as to DLLs being 
    referenced with full pathname and file extension. 
    To achive this, any module being specified to load an icon from must 
    explicitely be loaded before, either by another process or a REXX 
    script itself. Otherwise the specified icon resource will not be 
    useable, which will result in creating objects not showing up with the 
    desired icon. While it is easy to load a DLL from within a C/C++ 
    program, this is rather complicated from within a REXX script. 
    The following methods allow to load a resource DLL from within REXX: 
      *  use an external REXX extension DLL. This requires an additional 
         DLL to be shipped with the REXX script, which I would recommend 
         to avoid, if you do not need such external DLL in the same or 
         another REXX script of the same application for other purposes 
         anyway. 
      *  load the DLL with the built-in method RxFuncAdd. This requires to 
         have at least one REXX compliant C-function within the resource 
         DLL, which must be registered and called by the REXX script to 
         let the REXX runtime effectively load the resource DLL. 
         Search http://hobbes.nmsu.edu for the ICONRESOURCE package 
         (iconresource*.zip) of C.Langanke@TeamOS2.de, which contains the 
         source and the compiled version of such a DLL plus a sample REXX 
         script showing you the handling of the resource DLL (see also 
         ICONRESOURCE) 
         A REXX programmer can use the precompiled resource DLL of this 
         package without recompiling the C source by just adding resources 
         with the resource compiler coming with plain OS/2 WARP 3 and 4.     
 Problems with using the keyword ICONRESOURCE under WARP 4 
    
    In contrast to WARP 3, under WARP 4 a resource DLL being referenced by 
    the ICONRESOURCE keyword MUST NOT be in memory, if a fully qualified 
    path is being specified. The DLLs seems implicitely to be loaded by 
    WARP 4 and be freed afterwards. Only a DLL specified without path and 
    extension (such as PMWP), that has been loaded via (BEGIN/END)LIBPATH, 
    may already be in memory to be used with the ICONRESOURCE keyword. 
     
 General notes about (resource) DLLs:   
   *  A DLL loaded via module name only is loaded into a public DLL 
      namespace. The system can load only one DLL with the same name into 
      this namespace. When loading a second DLL from within a different 
      directory (e.g. with the "." entry in the LIBPATH or with 
      BEGIN/ENDLIBPATH), no error is returned, but still only the first 
      DLL is being used !   
   *  A DLL loaded via full pathame and extension is loaded into a 
      namespace being private per process. The system can load different 
      DLLs with the same name, but from different directories.   
   *  The filename extension for DLLs being loaded via the full pathname 
      does not necessarily need to be .DLL, any other extension will do 
      fine. This does not apply to DLLs being loaded via 
      (BEGIN/END)LIBPATH, herefore the extension MUST be .DLL. Thus a DLLs 
      extension, which does not need to be loaded via LIBPATH can always 
      safely be changed to any extension from one to three characters.   
   *  Modifying the name part of a DLL is not that harmless, as under some 
      circumstances the name of the DLL must be identical to the module 
      name being stored in the EXE header of the DLL:   
        -  If a DLL is only be used to load resources or functions of a 
           DLL are being linked to dynamically, the name of the DLL can be 
           changed without a problem (at least according to my testings, 
           please send mail to C.Langanke@TeamOS2.de if you found out 
           something different). Note that the name needs to be 8.3 FAT 
           filesystem compliant since WARP 3 !.   
        -  If a DLL contains functions, that other programs link 
           statically to, the name of the DLL MAY NOT be simply renamed. 
           You have to use appropriate tools (like DLLRNAME.EXE from IBM 
           compilers), which path the module name to the new name for you. 
           Such tools usually restrict you to choose an name of either the 
           same or shorter length, so that the EXE header needs not to be 
           completely rewritten. 
     

Created using Inf-PHP v.2 (c) 2003 Yuri Prokushev
Created using Inf-HTML v.0.9b (c) 1995 Peter Childs