                  Welcome to Borland C++ for OS/2
                  -------------------------------

  This README file contains important information about Borland C++.
  For the latest information about Borland C++ and its accompanying
  programs and manuals, read this file in its entirety.

  For useful information on working with the Borland Debugger, see the
  online file README.TD in the DOC subdirectory of your Borland C++
  installation.


TABLE OF CONTENTS
-----------------
I.   How to Get Help
II.  Installation
III. Features
IV.  Important Information


 I. HOW TO GET HELP
-------------------
  If you have any problems, please read this file, the online help,
  and other files in your DOC subdirectory, and the Borland C++
  manuals first. If you still have a question and need assistance,
  help is available from the following sources:

  1. Type

        GO BORLAND

     on the CompuServe bulletin board system for instant access to
     the Borland forums with their libraries of technical information
     and answers to common questions.

     If you are not a member of CompuServe, see the enclosed
     special offer, and write for full details on how to receive
     a free IntroPak containing a $15 credit toward your first
     month's on-line charges.

  2. Check with your local software dealer or users' group.

  3. Borland's TECHFAX service. Call (800) 822-4269 for a FAX 
     catalog of entries.

  4. If you have an urgent problem that cannot wait and you have
     sent in the license agreement that came with the package,
     you may call the Borland Technical Support Department at
     (408) 461-9133. Please have the following information ready
     before calling:

     a. Product name and serial number on your original
        distribution disk.  Please have your serial number ready
        or we will be unable to process your call.

     b. Product version number. The version number for Borland
        C++ can be displayed by pressing Alt-H/A in the IDE.

     c. Computer brand, model, and the brands and model numbers of
        any additional hardware.

     d. Operating system and version number. (The version number
        can be determined by typing SYSLEVEL at the OS/2 shell
        prompt.)

     e. Contents of your CONFIG.SYS file.


II. INSTALLATION
---------------

To install Borland C++, just type

    A:INSTALL

in an OS/2 window, assuming A: is a 3.5" floppy drive. Or click on the
"Drive A" prompt on the desktop, and double-click the Install icon.
You can then select installation options, or click on the install
button to begin installing immediately.


If you are building a help file, and see a message regarding a
missing .TAG file, you should set the IPFC environment variable to
the IPFC path in this release. Edit CONFIG.SYS to include this line:

    SET IPFC=C:\BCOS2\IPFC

Change the path to match your own installation configuration if
necessary. You may already have a SET IPFC line in your CONFIG.SYS
file, in which case you can add the Borland C++ path:

    SET IPFC=C:\OS2;C:\BCOS2\IPFC


In order to perform a search on All libraries from Help it is
recommended that you set the following environment variables in your
CONFIG.SYS file:

    HELP=C:\BCOS2\BIN;

Change the path to match your own installation configuration if
necessary. You may already have a SET HELP line in your CONFIG.SYS
file, in which case you can add the Borland C++ path:

    HELP=C:\OS2;C:\BCOS2\BIN;


III. FEATURES
-----------

  - An IDE for Presentation Manager with integrated debugging
  - A standalone debugger that runs under Presentation Manager
  - Extensive context-sensitive online help
  - Resource Workshop for OS/2, a tool for resource creation
    and editing.


IDE
---

  - Local popup menus for most IDE desktop objects: editor, transcript,
    project, and others

  - Drag and drop support from project to IDE desktop and PM to IDE
    desktop

  - Background compiling and Transfer features

  - A speedbar with icons for compilation, debugging, and editor
    actions

  - Easy access to all configuration options via the Settings notebook
    by choosing the Project|View Settings menu command

  - Buttons to revert to default settings in notebooks

  - Syntax highlighting for increased code readability

  - Configurable key bindings for the editor using the Editor Key Bindings
    setting in the Environment|Preferences subsection of the Settings
    notebook

  - Printing support under File|Print

  - Context-sensitive help on most objects and keywords

  - Extensive integrated debugging

Turbo Assembler
---------------

  - Extended GETFIELD and SETFIELD directives

    TASM 3.0 for DOS let the source and target working registers remain
    the same for these directives, but generated useless code.
    When GETFIELD is used 'in place', it no longer generates the
    nonfunctional 'MOV target, source' instruction.  Similarly,
    the SETFIELD 'in place' doesn't OR the source value to
    itself, but will ensure that those unset fields of the target
    register will be 0.


  - Added switches to select desired linker

    The new switches /os and /oi, combined with the existing
    switches /o and /op, constitute a new selection in TASM of the
    object format pertinent to the selected linker.  The following
    table describes these switches:

    Switch  Meaning
    ------  -------
    /os     The default selection; Output standard TLINK-compatible
            objects without overlay support
    /o      Output standard TLINK-compatible objects with overlay support
            enabled
    /oi     Output IBM linker-compatible objects (IBM's linear-
            executable linker)


  - Added a new segment attribute and uninitialized segment warning

    TASM 3.0 offered no way to discover if data was being
    inadvertently written to segments intended to be
    uninitialized.  A new segment attribute has been added
    to correct this problem. In a segment directive, the
    attribute can be invoked by including an 'UNINIT' as part of
    the segment description.  For example,

      BSS SEGMENT PUBLIC WORD UNINIT 'BSS'

    All data written to such a segment will produce a warning.
    (This warning can be disabled using the directive 'NOWARN UNI'
    and re-enabled with 'WARN UNI'.)

    Note that all uninitialized segments declared with the
    simplified segment directives will be declared with the UNINIT
    attribute.


  - Added PUSHSTATE and POPSTATE directives

    PUSHSTATE and POPSTATE let you have code that's independent
    of the current operating state, but doesn't affect the current
    operating mode.

    PUSHSTATE saves the current TASM state on an internal stack 16
    levels deep. The actual state saved includes the following:

    . Current emulation version, such as T301
    . Mode selection: IDEAL, MASM, QUIRKS, MASM51
    . EMUL/NOEMUL switch
    . Current processor/coprocessor selection
    . MULTERRS/NOMULTERRS switch
    . SMART/NOSMART switch
    . Current radix
    . JUMPS/NOJUMPS switch
    . LOCALS/NOLOCALS switch
    . Current local symbol prefix

    POPSTATE restores the last-saved TASM state from the stack.


  - Added a new version name 'T301'

    The version name T301 is now the current default version.
    Put the VERSION T300 directive at the beginning of any code
    that conflicts with new keywords added in TASM 3.01.

  - .487 and P487 processor directives support


IV. IMPORTANT INFORMATION
----------------------
This version of Borland C++ for OS/2 is designed to run under the
shipping version of OS/2 2.0 with the Service Pak upgrade installed.
You may have problems running these tools under later OS/2 versions.


OS/2 Issues
-----------

- OS/2 provides a master index file you can use to access the Presentation
  Manager reference online help file.  In order to access this index, you
  must add the following lines to your CONFIG.SYS file:

    SET PMREF=PMFUN.INF+PMGPI.INF+PMHOK.INF+PMMSG.INF+PMREL.INF+PMWIN.INF+ 
              PMWKP.INF 
    SET HELPNDX=EPMKWHLP.NDX

  Then at the OS/2 prompt type "VIEW PMREF".  You can reference the entire
  Presentation Manager online reference from this single index.


Compiler
--------

  This compiler supports the three distinct character types specified
  in section r.3.6.1 of the Second Edition of "The C++ Programming
  Language", by Bjarne Stroustrup. This means that calls to some
  functions taking char which were legal and unambiguous in Borland
  C++ 3.1 will now cause an ambiguity error.

  Casting, using the compiler option to change the default char
  handling, or supplying functions for the three types are some ways
  to resolve these errors.

  Another change from the October ANSI C++ draft supported is
  support for virtual functions differing in return type. Section
  10.2 specifies that the return type for an overriding function
  can be a pointer or reference to any class publicly derived
  from the base class used as the overridden return type:

      struct X{};
      struct Y: public X{};
      class B
      {
        ...
        public:
         virtual X* xFunc();
      };

      class D : public B
      {
        ...
        public:
          Y* xFunc();  // now legal: returns pointer to derived class
      };

  This compiler supports 16-bit wide characters, which increases the
  range of codes for the wchar_t type. Size-dependent definitions may
  be affected by this change. Specifically, use

    L"abc"             for wchar_t strings, and
    L'a'               for wchar_t characters.

  Enum operator overloading is also supported in this compiler.


  The compiler now supports the AT&T CFRONT 3.0 template function
  overloading resolution extensions.

  Note, these extensions are disabled if the strict ANSI compliance
  compiler switch (-A for the command line, Options | Source | Ansi for
  the IDE) is enabled.

  When searching for an exact match for template function parameters;

    1) Trivial conversions are now considered exact matches.  For example:

    template<class T> void foo(const T a)
    {
      ...
    }
    ...
    foo(0); // This is illegal under ANSI C++: unresolved foo(int).
            // However, Borland C++ now allows foo(const int) to be called.

    2) Derived class pointer or references arguments are permitted to
    match their public base classes.  For example:

    template<class T>
    class B {
      ...
    };

    template<class T>
    class D : public B<T> {
      ...
    };

    template<class T> void foo(B<T> *b)
    {
       ...
    }
    ...
    foo(new D<int>); // This is illegal under ANSI C++:
                     //   unresolved foo(D<int> *).
                     // However, Borland C++ now allows
                     // foo(B<int> *) to be called.

  The conversion from derived class to base class is allowed only for
  template parameters, non-template parameters still require exact
  matches.  For example:

    class B {
      ...
    };

    class D : public B {
       ...
    };

    template<class T> void bar(T ignored, B *b)
    {
      ...
    }
    ...
    bar(0, new D);  // Illegal under CFRONT 3.0, ANSI C++ and Borland C++:
                    // unresolved external bar(int, D *), D * -> B * is not
                    // considered an exact match.


IDE
---

  Differences from the Borland C++ Version 3.x interface:

  - Transfer tools are no longer listed under a special system
    menu, but are instead listed under a new Tools menu.
    This menu also includes all message management actions.
    Transfer items are installed through the Transfer section
    of the Settings notebook. Open the Settings notebook by
    choosing the Project|View Settings menu command.

  - The message window and modal compile dialog have been combined
    into the new modeless Transcript Window.  This is an enhancement
    to support background compilation.

  - The Options menu has been replaced with the Project Settings
    Notebook; the notebook is accessed through the Project|View Settings
    menu item.  The notebook contains sections and pages which correspond
    to the nested menus and dialogs accessed from the original Options
    menu.

    Note that the Settings notebook works like other notebooks in
    Presentation Manager: changes made to controls take effect immediately
    rather than pending confirmation as in dialogs; the notebook
    is modeless.

    Searching in selected text with the Settings notebook environment
    editor "Persistent Blocks" option set to OFF is not possible. The
    block is removed before the search is attempted; therefore the search
    will fail.

    Occasionally  doing Help | Topic search on a valid help topic will fail
    on machines running the OS/2 Service pak from October 1992.  Access
    the Help via the Help | Contents menu item.	

  Integrated debugging:

  - "Return from function" under the Run menu will run the current
    function at full speed until it returns to the function which
    called it.

    The Breakpoints detail view keeps track of changes made to
    source modules containing breakpoints by inserting the new
    line number information along side the original breakpoint
    information.

  - Debugging a process the second time may result in old information
    displayed in the Breakpoints or Disassembly view if the Settings 
    notebook environment preferences "Auto Save Editors" is set to OFF
    Saving changed files before restarting a debugging session fixes 
    the problem.

  - If you experience very slow stepping while a DOS window
    is open, you should set IDLE_SENSITIVITY under Settings|Session|DOS 
    settings to a low value. This also applies to standalone debugging.

Turbo Debugger GX
-----------------

  For useful information on working with the Borland Debugger, see the
  online file README.TD in the DOC subdirectory of your Borland C++
  installation.


DLLs
----

  When creating a DLL which will be loaded by either a non-Borland built
  executable, or explicitly loaded by calling DosLoadModule, the global
  variable _multidll must be set as follows to ensure initialization of the
  DLL.

    extern int _multidll = 0;

  This statement should be placed globally in some module being linked into
  the DLL.

  When _multidll is set to zero, the DLL initializes itself when it is 
  loaded by the operating system.   When _multidll is set to one, executables
  built using Borland tools initialize the DLL after the DLL is loaded by the
  operating system.

  Under OS/2 2.0 there is no guarantee that interdependent DLL's will be
  initialized in the correct order.  An example of interdependent DLL's 
  would be a DLL containing a global class instance where that class' 
  constructor makes a call to some Runtime Library (RTL) function.  If the
  dynamic version of the RTL was linked to the DLL, the RTL DLL would need 
  to be initialized first.

  By default, DLLs built using Borland tools let Borland-built executables
  do the initialization.  This works only if the DLL was loaded implicitly
  when the executable was loaded.  If the DLL was loaded with the kernel
  function DosLoadModule, the DLL would need to initialize itself by setting 
  _multidll to one.


Resource Workshop
-----------------

- The text editor included in Resource Workshop is limited to ASCII
  representations of resources that are no greater than 32K in length.

- View|Show items or View|Show identifiers may give "Too many items to view"
  or "Too many defines to view" message if there are more than 1800 or so
  items in your project.  You will always get this if your project includes
  a header file with many items in it, such as OS2.H.  Temporarily excluding
  such a file will allow you to use these View menu facilities.

- There is no comprehensive way to import Windows resources and projects
  into the OS/2 version of Resource Workshop.  However it is possible,
  under WIN-OS/2, to copy a Windows bitmap resource to the OS/2 clipboard 
  and then paste the resource into the bitmap editor in Resource Workshop 
  for Presentation Manager.

- Due to the graphical nature of many tasks performed with Resource Workshop
  for Presentation Manager, there are a variety of painting and display problems
  that occur as a result of the video driver being used in a particular config-
  uration.  If you encounter these types of problems, check with your video
  card supplier to see if there is a newer driver provided for the setup you
  are using.  Note that SVGA driver services currently seem to have more
  limitations than VGA.
