home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / smart21b.zip / SM_PORT2.INF (.txt) < prev    next >
OS/2 Help File  |  1995-09-15  |  18KB  |  451 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Contents ΓòÉΓòÉΓòÉ
  3.  
  4.    The SMART Programming Guide
  5.      for Portability
  6.        Version 2.1B
  7.       September 1995
  8.  
  9.    (C) 1991, 1994, 1995 One Up Corporation
  10.      All Rights Reserved
  11.  
  12. Topics: 
  13.  
  14.        Introduction 
  15.        Portability Basics 
  16.        Factors Affecting Portability 
  17.        Designing code for Portability 
  18.        Windows Issues 
  19.        Windows Functionality Not Supported 
  20.        OS/2 Changes 
  21.        Summary 
  22.  
  23.  CONTINUE 
  24.  
  25.  
  26. ΓòÉΓòÉΓòÉ 2. Introduction ΓòÉΓòÉΓòÉ
  27.  
  28. PROGRAMMING FOR PORTABILITY 
  29.  
  30. Programming applications for portability between platforms requires careful 
  31. planing and decision making before the application is started. 
  32.  
  33. The new GUI based platforms make it convenient to program by providing rich 
  34. interface API (Application Programming Interface) functions available to the 
  35. developer for performing many of the GUI calls, along with memory management, 
  36. I/O and other service functions. 
  37.  
  38. Unfortunately each platform has a different set of API functions to perform 
  39. similar functionality. With the platform specific API calls completely imbedded 
  40. and dispersed in the application code, porting to a different platform is time 
  41. consuming and very costly. 
  42.  
  43. Worse yet, numerous uses of functionality that may exist in one platform, yet 
  44. unsupported in another platform will require large portions of the application 
  45. to be rewritten. Exploiting the powerful features of one platform may lead to a 
  46. non-portable application. 
  47.  
  48. The ultimate case of non-portability is in the extensive use of third party 
  49. libraries in object or executable code which does not support multiple 
  50. platforms. 
  51.  
  52. The following sections will outline the steps to more portable programming for 
  53. applications. Specific suggestions will be made regarding the functionality and 
  54. issues that will cause difficulty in porting Windows applications to OS/2. 
  55.  
  56. By using the programming suggestions offered in this document you will be able 
  57. to create programs that are more portable to new operating platforms. 
  58.  
  59.       CONTINUE - Portability Basics 
  60.       BACK - Contents 
  61.       CONTENTS 
  62.  
  63.  
  64. ΓòÉΓòÉΓòÉ 3. Portability Basics ΓòÉΓòÉΓòÉ
  65.  
  66. BASIC RULES FOR PORTABILITY 
  67.  
  68. The rules for new application development which provide portability are 
  69. straight forward. 
  70.  
  71.          Isolate as much of the platform dependent functions as possible. 
  72.       Although you may introduce an additional layer of code, you will find a 
  73.       great deal more portability in creating your own functional layer to 
  74.       isolate the platform. 
  75.  
  76.          Understand that exploitive features in one platform may not be 
  77.       portable to another. Plan around this reality if you need the 
  78.       portability. 
  79.  
  80.          Be careful in the use of third party libraries if you do not have 
  81.       access to the source code.  You simply cannot port someone else's object 
  82.       files. 
  83.  
  84.          Choose a programming language that is supported with tools and 
  85.       compilers on the platforms that you wish to serve. 
  86.  
  87.          Research programming tools and code generators that support multiple 
  88.       platforms. In many cases these products can effectively generate the code 
  89.       for the platforms that you are targeting. 
  90.  
  91.          Develop a set of development and coding standards that can be used by 
  92.       the programming members of your project.  This will help prevent any one 
  93.       of the developers writing platform dependent code. 
  94.  
  95.          Plan and make use of macros, ifdefined preprocessor code blocks and 
  96.       other coding techniques that may enable you to integrate multiple 
  97.       platform dependencies within the same source code files. 
  98.  
  99.          Stick to basics, where possible.  Tricky solutions may depend upon 
  100.       platform dependent functionality and subtle side effects that may require 
  101.       thorough knowledege to port. 
  102.  
  103.          Make liberal use of coding comments so that the code can be changed 
  104.       to meet the requirements of another platform.  Quite often the original 
  105.       programmer is not the one to modify the code for porting to a new 
  106.       platform. 
  107.  
  108.       CONTINUE - Factors Affecting Portability 
  109.       BACK - Introduction 
  110.       CONTENTS 
  111.  
  112.  
  113. ΓòÉΓòÉΓòÉ 4. Factors Affecting Portability ΓòÉΓòÉΓòÉ
  114.  
  115. FACTORS AFFECTING PORTABILITY 
  116.  
  117. There are many factors that affect the difficulty of porting code from any 
  118. platform to OS/2. The factors include: 
  119.  
  120.          complexity of the code 
  121.  
  122.          "cleanliness" of the code 
  123.  
  124.          exploited functionality in the source platform 
  125.  
  126.          use of third-party libraries 
  127.  
  128.          abstractness of the design 
  129.  
  130.          tools being used 
  131.  
  132.          experience level of the programmers porting the code. 
  133.  
  134.  Most applications have evolved over several years and have been worked on by 
  135.  programmers of various levels of experience. The result is usually an 
  136.  application with many blocks of code which have similar functionality but use 
  137.  a completely different set of API calls. While programming standards may be in 
  138.  place now the standards most likely have changed over the years and the 
  139.  strictness to which programmers stick to those standards is questionable at 
  140.  times. 
  141.  
  142.  Many Windows applications also get away with using memory and object handles 
  143.  after they have been released.  This will cause a problem when the code is 
  144.  ported to the protected memory environment of OS/2.  A good guide for helping 
  145.  to identify such a problem is to run your application using the debug version 
  146.  of Windows. 
  147.  
  148.  The use of third-party libraries in an application makes it extremely 
  149.  difficult to port your application to OS/2 or any other platform.  The future 
  150.  portability of the application is dependent upon the owner of the library 
  151.  providing a version for each platform.  If there was one item which is 
  152.  recommended when designing an application it would be to try to use abstract 
  153.  design techniques. 
  154.  
  155.  Whenever a system level, third-party library, or operating system dependent 
  156.  function is required it should be given a functional name and placed into 
  157.  either a separate source file or library. 
  158.  
  159.  For example, instead of calling GlobalAlloc every time that memory is 
  160.  allocated create a function called AllocateMemory.  This will centralize the 
  161.  porting activity to the single function and will enable the main logic of the 
  162.  application to remain mostly intact during the porting process. 
  163.  
  164.       CONTINUE - Designing code for Portability 
  165.       BACK - Basics 
  166.       CONTENTS 
  167.  
  168.  
  169. ΓòÉΓòÉΓòÉ 5. Designing Code for Portability ΓòÉΓòÉΓòÉ
  170.  
  171. DESIGNING CODE FOR PORTABILITY 
  172.  
  173. Most applications are designed with a single operating system platform in mind. 
  174. Designing applications which can be ported to run on multiple  platforms 
  175. requires a little more forethought and understanding of the target platforms. 
  176. The key to designing an application for portability lies in abstracting the 
  177. various platform functionality that is required by the application. 
  178.  
  179. For example, memory management functions differ from one platform to another. 
  180. However, the basic functionality of allocating and freeing memory is the same. 
  181.  
  182. By abstracting this type of functionality into individual modules or components 
  183. the process of porting simplifies to replacing these abstract modules. The core 
  184. functionality of your application remains the same. 
  185.  
  186. There will certainly be some functionality of a platform that you will want to 
  187. exploit in your application. Multiple threads or long filenames may be 
  188. something that you want to take advantage of in OS/2. Since this kind of 
  189. functionality may not exist on another platform it is recommended that you 
  190. place any exploitive functionality into a separate module. 
  191.  
  192. You will want to provide a function which checks the platform and indicates 
  193. which of the exploitive features are supported on the current platform.  That 
  194. way the application can provide an alternate path of execution if the support 
  195. is not available. 
  196.  
  197. The operating system services provide the necessary functionality to make your 
  198. application work on a specific platform. By separating the core logic from the 
  199. operating system services the changes are reduced to the modules which 
  200. implement the abstracted functionality. 
  201.  
  202. Remember that the proprietary logic in your application is what differentiates 
  203. your application from other applications. 
  204.  
  205. The following list identifies several items which should be abstracted in your 
  206. application design to make platform portability easier. Keep in mind that all 
  207. of these recommendations are for the purpose of minimizing the  number of 
  208. changes required to port your application to another platform. 
  209.  
  210.    1. Eliminate datatype dependencies. 
  211.  
  212.  Wherever possible define macros for declaring datatypes and for accessing 
  213.  portions of the datatype. If a variable is to contain more than one piece of 
  214.  data (e.g., packing two words into a double-word variable) define macros which 
  215.  pack and unpack the data. 
  216.  
  217.  Use the "sizeof" directive to determine size and offset of datatypes. 
  218.  
  219.    2. Use "message crackers" for accessing message parameters. 
  220.  
  221.  Define macros which return the message parameter value that is being 
  222.  referenced. The format of messages differs between platforms.  Using macros to 
  223.  return the requested message parameter value allows you to modify the macro 
  224.  for the ported platform and affect the change throughout the code. 
  225.  
  226.    3. Use "message forwarding" macros for sending and posting messages. 
  227.  
  228.  Define macros which format and send or post messages to a window. The format 
  229.  and identity messages differs between platforms. Using macros to format 
  230.  parameter values allows you to modify the macro for the ported platform and 
  231.  affect the change throughout the code. 
  232.  
  233.    4. Abstract the memory-management functions into a separate module. 
  234.  
  235.  Define a set of functions for allocating, reallocating, locking, unlocking, 
  236.  freeing, and querying memory. 
  237.  
  238.    5. Abstract the file input/output functions into a separate module. 
  239.  
  240.  Define a set of functions for opening, reading, writing, closing, and querying 
  241.  files and directories. Include functions for searching, moving, renaming, 
  242.  deleting, and copying files.  Also include file name parsing functions in the 
  243.  module. 
  244.  
  245.    6. Abstract the setting of graphics attributes into a separate module. 
  246.  
  247.  Define a set of functions for setting and querying line, fill, bitmap, and 
  248.  font attributes. This includes color, style, and pattern attributes.  Also 
  249.  abstract the creation, retrieving, and deletion of drawing areas (i.e., 
  250.  device-context or presentation space). 
  251.  
  252.    7. Abstract coordinate calculations functions into macros or functions. 
  253.  
  254.  Coordinate systems can differ across platforms. Define a set of macros or 
  255.  functions for calculating vertical coordinates for graphics primitives.  For 
  256.  example, define a function called "MoveDown" for calculating a y-coordinate 
  257.  which is positioned a specified distance below another coordinate. 
  258.  
  259.    8. Abstract graphic primitive functions into a separate module. 
  260.  
  261.  Define a set of functions for performing the graphic drawing capabilities 
  262.  required for your application.  For example, define functions called 
  263.  "DrawFilledRect" and "DrawPie" to draw a rectangle which is filled with a 
  264.  brush or pattern and to draw a closed arc. 
  265.  
  266.       CONTINUE - Windows Issues 
  267.       BACK - Factors Affecting Portability 
  268.       CONTENTS 
  269.  
  270.  
  271. ΓòÉΓòÉΓòÉ 6. Windows Issues ΓòÉΓòÉΓòÉ
  272.  
  273. WINDOWS TO OS/2 IMPLEMENTATION ISSUES 
  274.  
  275. There are approximately 4700 points of difference between Windows (3.1) and 
  276. OS/2 and this doesn't even cover the changes required for conversion from 
  277. 16-bit to 32-bit code or the use of third-party libraries. It is even more 
  278. amazing to realize that there are over 14,000 points of difference between 
  279. Win32 and OS/2 2.1. 
  280.  
  281. It is not appropriate to list all of these items here. However, there are a 
  282. number of functional areas found in common with most applications which cause 
  283. the most amount of difficulty and effort in the porting process. While many of 
  284. the areas have what appear to be simple solutions the practical aspect of it is 
  285. that they can cause either a lot of rework or redesign to integrate properly 
  286. into the ported code. 
  287.  
  288.          Resource files must be converted from Windows to OS/2 format. 
  289.  
  290.          Dialog units in Windows are calculated based on the font used in the 
  291.       dialog while dialog units in OS/2 are calculated based on default system 
  292.       proportional font. 
  293.  
  294.          Font names and selections must be converted to those available in 
  295.       OS/2. 
  296.  
  297.          Menus for dialogs must be defined at run-time and not in the resource 
  298.       file. 
  299.  
  300.          Icons, cursors, and bitmaps must be converted to an OS/2 recognized 
  301.       format. 
  302.  
  303.          Multiple Document Interface (MDI) must be implemented in the 
  304.       application. 
  305.  
  306.          The frame window, frame control windows, and client windows are all 
  307.       separate windows in OS/2. Subclassing must be performed in OS/2 to 
  308.       monitor and process non-client window activity. 
  309.  
  310.          Windows brushes and pens must be converted to area and line bundle 
  311.       attributes. Different OS/2 functions are used for drawing filled and 
  312.       non-filled objects as well as drawing a nominal width line versus a wide 
  313.       line. 
  314.  
  315.          APIs for drawing an arc, chord, pie, etc. require several function 
  316.       calls in OS/2. 
  317.  
  318.          The OS/2 coordinate system is lower-left origin versus Windows 
  319.       upper-left origin. All coordinate calculations for positioning windows 
  320.       and drawing must be converted to be relative to the lower-left corner. If 
  321.       window positions are to remain relative to the upper-left corner when a 
  322.       parent window is re-sized code must be added to reposition child windows. 
  323.  
  324.          The CS_CLASSDC class style is not supported in OS/2. 
  325.  
  326.          Regions are bottom-right exclusive in Windows and top-right exclusive 
  327.       in OS/2. 
  328.  
  329.          The bits for monochrome bitmaps in OS/2 are reverse from those of 
  330.       Windows. 
  331.  
  332.          Windows metafiles must be converted to OS/2 metafiles. Metafile 
  333.       enumeration is not directly supported in OS/2. 
  334.  
  335.          Applications have less direct control over printing properties in 
  336.       OS/2. Applications should use the job properties dialog to allow users to 
  337.       modify the printing characteristics. 
  338.  
  339.          Support of tabstops in a listbox is not available in OS/2. Columns 
  340.       are supported in OS/2 by using the container class. 
  341.  
  342.          Cursors are not registered with a window class in OS/2. The setting 
  343.       of the pointer in OS/2 is performed during the WM_CONTROLPTR or 
  344.       WM_MOUSEMOVE message. 
  345.  
  346.          Background brushes are not registered with a window class in OS/2. A 
  347.       background fill color can be set by setting a presentation parameter for 
  348.       the window. 
  349.  
  350.          Control activity messages are received in a WM_CONTROL message 
  351.       instead of the WM_COMMAND message. 
  352.  
  353.          Processes must explicitly gain access to shared memory and all 
  354.       processes having access to shared memory must free it before the memory 
  355.       is freed. This differs from Windows where the shared memory is freed when 
  356.       the creator of the memory frees it. 
  357.  
  358.          Memory and window classes allocated and registered by a DLL are not 
  359.       available to other processes. In Windows the ownership of window classes 
  360.       and memory objects is based on the code-segment which registered the 
  361.       class or allocated the memory. In OS/2 all resources, classes, and memory 
  362.       objects are owned by the process that allocated or registered them. 
  363.  
  364.          OLE is not supported in OS/2. 
  365.  
  366.          There is not a Color or Print common dialog in OS/2. The options 
  367.       available for the font and file common dialog differ from Windows. 
  368.  
  369.       CONTINUE - Windows Functionality Not Supported 
  370.       BACK - Designing code for Portability 
  371.       CONTENTS 
  372.  
  373.  
  374. ΓòÉΓòÉΓòÉ 7. Windows Functionality Not Supported ΓòÉΓòÉΓòÉ
  375.  
  376. WINDOWS 3.1 FUNCTIONALITY NOT SUPPORTED IN OS/2 2.1 
  377.  
  378. The following categories of APIs or functionality are not directly supported in 
  379. OS/2. These items require that you either rework the application to implement 
  380. an alternative strategy or remove the functionality from the application to 
  381. successfully port to OS/2. 
  382.  
  383.         OLE - Not available 
  384.         DDEML - Not available 
  385.         MDI - Use MDI library (see SMARTAUX\SMARTMDI\MDI.DOC) 
  386.         DIB driver interface (DIB.DRV) - Not available 
  387.         Direct printer driver interface - Not available 
  388.         Selector-based memory manipulation - Conversion required 
  389.         TrueType Support - Not available 
  390.         Tabs in a listbox - Convert to ownerdraw listboxes 
  391.         Common color dialog - Not available 
  392.         Common find/replace dialog - Not available 
  393.         Window Property APIs - Not available 
  394.         Metafile enumeration APIs - Not available 
  395.         VersionInfo API - Not available 
  396.         LZ Compression API - Not available 
  397.  
  398.       CONTINUE - OS/2 Changes 
  399.       BACK - Windows Issues 
  400.       CONTENTS 
  401.  
  402.  
  403. ΓòÉΓòÉΓòÉ 8. OS/2 Changes ΓòÉΓòÉΓòÉ
  404.  
  405. OS/2 1.3 FUNCTIONALITY SIGNIFICANTLY CHANGED IN OS/2 2.1 
  406.  
  407. The following categories of APIs or functionality have changed significantly 
  408. from 16 bit OS/2 to 32 bit OS/2.  Most of the APIs listed are not available in 
  409. the 32-bit version of OS/2. The semaphore functions have changed in name and 
  410. definition, however the same capabilities are available.  They do require 
  411. changes to any existing semaphores being used. 
  412.  
  413.         Semaphore API conversions - Conversion required 
  414.         DosFindNotifyFirst - Not available 
  415.         DosFindNotifyNext - Not available 
  416.         DosFindNotifyClose - Not available 
  417.         WinMsgSemWait - Not available 
  418.         WinMsgMuxSemWait - Not available 
  419.         WinAvailMem - Not available 
  420.         WinLockHeap - Not available 
  421.         WinCatch  - Not available 
  422.         WinThrow - Not available 
  423.         GpiRealizeColorTable - Not available 
  424.         GpiUnrealizeColorTable - Not available 
  425.         WinInstStartApp - Not available 
  426.         DosPrintJobGetId - Not available 
  427.         DosGetPPID - Not available 
  428.         DosGetPrty - Not available 
  429.         DosReadAsync - Not available 
  430.         DosWriteAsync - Not available 
  431.         WinRegisterWindowDestroy - Not available 
  432.  
  433.       CONTINUE - Summary 
  434.       BACK - Windows Functionality Not Supported 
  435.       CONTENTS 
  436.  
  437.  
  438. ΓòÉΓòÉΓòÉ 9. Summary ΓòÉΓòÉΓòÉ
  439.  
  440. IN SUMMARY 
  441.  
  442. Developing applications that are portable between platforms requires planning 
  443. and development adherence to techniques of functional encapsulation and 
  444. isolation. Knowledge of the platform dependence of the source and targeted 
  445. platforms helps to identify the functions that are best isolated into 
  446. convenient, modifiable modules. 
  447.  
  448.       RESTART 
  449.       BACK - OS/2 Changes 
  450.       CONTENTS 
  451.