MARCH 1993 VOLUME 5 NUMBER 3
INDEX
Hello and welcome to the March 1993 issue of Bullets!
"March-Madness" in the computer industry is over. As though at a basketball game, we watched
at the IBM OS/2 Technical Interchange, at Interop and Uniforum, at the Microsoft Tech*Ed and
at BrainShare '93 as hardware and software vendors alike dribbled, took foul shots and
slam-dunked their way through hours of exciting competition.
At Interop, Novell "set the pick" for the arrival of NetWare 4.0. At BrainShare, John Landry
asked us to watch our "fast break" and re-evaluate how we define future development, and Drew
Majors told us that, while writing NLMs may not be "nothing but net," writing them is... "just
different." And, in "three-point land," a new IBM leader said he will not hesitate to make the
necessary changes. No matter where you looked, the contest was "in your face."
Competition, whether in sports or computers, is essential. This summer the Olympic Festival '93
will be held in San Antonio. Novell's NetWare SFT III has won the honor of being the hosting
network on IBM PCs with a variety of popular third-party word processing, data entry and
communications software invited to do the information exchange.
More on that after a word from our sponsors.
Happy_Programming!
Mad "Magic" Poarch
Director
Developer Support/Service
NWSNut: Developing NLMs with Novell's Look & Feel
The NLM SDK for NetWare 4.0 introduces new opportunities for NetWare application
developers. An important component of the NLM SDK for NetWare 4.0 is the NWSNut
interface. The NWSNut interface provides a set of C language library APIs for the NLM
environment which allow developers to write NLMs that have the "look and feel" of NLMs
developed by Novell. Now NetWare developers can design NLMs which have user interfaces
similar to NLMs like MONITOR and INSTALL. This article describes the NWSNut interface,
discusses its impact on developers, and finally, examines a sample NLM detailing the use of the
NWSNut screen handling APIs.
NWSNut Overview
The screens created with the NWSNut Library APIs are much easier to manage and have
expanded functionality over NLMs currently developed outside of Novell. The libraries allow
you to use multiple colors and windows on the server, providing for a more robust product.
In addition to producing NLMs that look and feel like Novell NLMs, the NWSNut libraries
provide a common standard for NLM user interfaces. Also included are tools that allow
developers to create language-enabled, internationalized NLMs. Screens and function keys will
operate the same for all NLMs written to use the NWSNut interface. As a result, this
standardized interface will produce a simplified environment for end-users of NLM products.
NWSNut NLMs developed with the NLM SDK for NetWare 4.0 can also run on NetWare 3.11
servers when the AFTER311 NLM is also loaded on the server. These NLMs will run
unmodified on NetWare 3.11 servers as long as NetWare 4.0-specific APIs are not used.
The NWSNut Interface is a set of C language APIs. The NWSNut library is made up of six major
components:
- Portals
- Lists
- Menus
- Forms
- Screen Messages
- Help
Portals
The NWSNut library allows client NLMs to create windows on a server screen. The size,
location, and type of these windows, or portals, can be controlled with the functions exported
from the NWSNut library. Most of the information presented on a server screen by the NWSNut
Library is done within a portal. When a portal is created, NWSNut sets up a portal control block
(PCB) which manages and holds information about the portal, including the portal's position on
the screen, its frame size, and its cursor state and position.
There are two categories of portals: direct and virtual. The type of the portal depends on whether
the portal's screen is accessed directly, making it a "direct" portal, or buffered in memory,
indicating a virtual portal. The portal type is determined by the value of the directFlag passed to
NWSCreatePortal.
A virtual portal is an area of memory into which data intended for the portal is written. The data
in memory is displayed on the physical screen when NWSUpdatePortal( ) is called. A virtual
portal is normally used when the data to be displayed is larger than the physical screen or portal
display area size. The portal must be scrolled from side to side or top to bottom to see the hidden
parts of the screen in the virtual portal.
When you use a direct portal, the information displayed in the portal is written directly to the
portal screen. What you see is what you get and the portal screen area cannot be scrolled.
Lists
The NWSNut NLM library allows client NLMs to build lists of items that can be
presented on the screen for user interface actions. Lists are built using NWSNut APIs that create
doubly linked lists containing pointers to the list items.
Lists are displayed in virtual portals. Menus and Forms are specialized lists, which users can
scroll through and select the appropriate item(s). Each list type (lists, forms, menus) has related
APIs that boost functionality.
Menus
Menuing is one of the basic areas of functionality available to NWSNut client NLMs.
Menus present various options in a portal on the NWSNut screen which allow users to select an
item from a range of available choices.
Forms
The NWSNut interface defines a type of list called a form that allows users to interactively
edit many types of fields (integers, strings, booleans, and menus). Users can move between the
different fields in the form and enter whatever kind of information each field requires.
Screen Messages
Screen messages presented in the NWSNut NLM Library are created with a set of utilities
called the Message Tools. For language-enabling purposes, it is desirable to isolate all text
strings from the source code. This functionality is provided by the way NWSNut interacts with
the Message Tools. Isolated screen messages can be retrieved using the NWSGetMessage
function.
Help
Help screens to be used with the NWSNut Library are created with the Help Librarian,
HELPLIB.EXE. Help messages are isolated from the code in the same manner as screen
messages. Isolation allows help messages to be language- enabled as well.
Other Features
A new feature of NetWare 4.0 is natural language enabling. The Message Tools and Help
Librarian, included in the NLM SDK for NetWare 4.0, allow you to write language-enabled
NLMs using the NWSNut interface. The language an NLM uses to display messages is
determined by which language set you select as the preferred language set for the server when the
NLM is loaded. The selected language set will be used whenever a message file exists for the
specific NLM being loaded.
Default messages and help screens are an important part of the NLM. So, a French developer
marketing an NLM to a primarily French audience would link in default messages in French.
When selling the same NLM to an English or German audience, the French developer would ship
English or German message files with the NLM, although the default language would still be
French. The multi-language capability of NWSNut NLMs will greatly increase the marketability
of language- enabled NWSNut NLMs.
This article does not focus on the language enabling capabilities of the NWSNut libraries in
conjunction with the Message Tools. Although not required, the Message Tools do work closely
with the NWSNut Libraries, giving developers the ability to write language-enabled applications.
NWSNut NLM Development
Developing an NWSNut-based NLM can be simple or a very advanced process, but
several concepts are common to all NWSNut-based NLMs. The following section discusses the
basics steps required to use the NWSNut user interface APIs. NDEMO.NLM, included as the
NWSNut example in the NLM SDK for NetWare 4.0, is used as a basis for this discussion. This
NLM clearly demonstrates the basic features of the NWSNut APIs.
The initial code for the sample NLM (see Figure 1) is typical of the code required for all
NWSNut client NLMs.
FIGURE 1: NDemo example source code
/* Get a handle for allocating a resource tag. */
NLMHandle = GetNLMHandle();
/* Create a screen for displaying our information. */
CLIBScreenID = CreateScreen("NUT Demo Screen",
AUTO_DESTROY_SCREEN);
if (!CLIBScreenID)
return;
/* Allocate a resource tag to use for memory allocations. */
allocTag = AllocateResourceTag(NLMHandle,
"NUT DEMO Alloc Tag",
AllocSignature);
if (!allocTag)
{
DestroyScreen(CLIBScreenID);
return;
}
/* Initialize the screen interface. */
ccode = NWSInitializeNut(UTILITY_MSG, VERSION_320,
NORMAL_HEADER, 0, 0, 0,
CLIBScreenID, allocTag,
&handle);
if (ccode)
{
DestroyScreen(CLIBScreenID);
return;
}
/* Setup a procedure to be called if unloaded from the
console with an UNLOAD XXXXXX command. */
AtUnload(myunload);
/* Activate the screen that you have created. */
DisplayScreen(CLIBScreenID);
END of FIGURE 1
The first step is to obtain the NLMHandle of the executing NLM. NWSNut uses the
NLMHandle to track the resources allocated for the NLM. NWSNut uses a screen created by the
client NLM. Therefore, you need to create a screen and save the screenID, so NWSNut will
know which screen to use to display portals. NWSNut also allocates memory on behalf of the
client NLM if provided with a resource tag that is allocated by the client.
Once all of the requirements listed above are fulfilled, the client NLM calls NWSInitializeNut( ).
This initialization function creates the NWSNut screen and screen header using the screen handle
of the client NLM. The initialization function also creates a NUTInfo structure to track NWSNut
data for the client. The NUTInfo structure is defined in NWSNUT.H. It is used to keep track of
the status of the current portal, saved lists, help context, and messages for your NLM.
An "atunload" procedure is required to allow you to cleanup resources allocated on your behalf
by NWSNut. The minimum requirement of the atunload function is to call NWSRestoreNut()
and to destroy the CLIB screen.
The next step is to display, or "make current," the NWSNut screen created using the CLIB
screen. The screen is displayed by calling the CLIB function DisplayScreen. The newly created
NWSNut screen can now be used to create portals, lists, etc.
As portals are the basis of most NWSNut screens, they deserve additional discussion. Portals
are created by calling the NWSCreatePortal API. The height, width, type and attributes of the
portal are required to create the portal. However, the act of creating a portal does not enable
NWSNut functions to write data to the portal. A Portal Control Block (PCB) is required for all
functions that write to portals. To obtain the PCB,
call NWSGetPCB( ) and pass in the portal number obtained from NWSCreatePortal( ).
Whenever you make a call to NWSSelectPortal( ), the portal is activated. NWSSelectPortal( )
brings the portal to the front, highlights the portal title and border, and enables the portals cursor
if a cursor was specified when the portal was created.
To deselect a portal, you use the NWSDeselectPortal function. This selection and deselection
capability gives you the ability to manage several different portals on the same screen, preferably
in a user-friendly manner. To destroy Portals, call NWSDestroyPortal( ).
As discussed earlier, list items are created as a doubly- linked list. The list pointers point to the
message lines to be used when the list is displayed. You can add items to the linked list by
calling the NWSAppendToList function (see Figure 2). Items appended to lists are normally
obtained from message files using the NWSGetMessage( ).
FIGURE 2: NWSNut list example
NWSInitList (handle, Free);
NWSAppendToList (NWSGetMessage (LIST_ITEM_1,
&(handle->messages)),
(void *) 0, handle);
NWSAppendToList (NWSGetMessage (LIST_ITEM_2,
&(handle->messages)),
(void *) 0, handle);
NWSAppendToList (NWSGetMessage (LIST_ITEM_3,
&(handle->messages)),
(void *) 0, handle);
NWSAppendToList (NWSGetMessage (LIST_ITEM_4,
&(handle->messages)),
(void *) 0, handle);
NWSList( ) (LIST_HEADER, 10, 40, 4,
strlen (NWSGetMessage (LIST_HEADER,
&(handle->messages))) + 4,
M_ESCAPE | M_SELECT, NULL,handle,
NULL, ListAction, 0);
/* cleanup and discard this list */
NWSDestroyList (handle);
END of FIGURE 2
After creating the list, you can display it by calling NWSList( ). NWSList( ) displays the
current list and allows the user to mark, select and perform other LIST options on the current list.
As mentioned previously, menus are specialized forms of lists created using
NWSAppendToMenu( ). You can display a menus by calling the NWSMenu function. NWSNut
menus allow you to select multiple menu options from one menu, as well as specify a default
selection.
To create forms, call NWSInitForm( ) and build the form by appending various types of fields to
the form using append functions. Once all of the fields are appended to the form, it can be
displayed by calling NWSEditForm( ). Various types of fields can be appended to the form,
including integer, hexadecimal, boolean, comment, prompt string and menu fields. Menu fields
allow you to give the user a group of selections from which to select for a specific field.
Examples of these operations are contained in NDEMO.NLM.
One last step remains, however, that is essential to developing NWSNut client NLMs. The
deallocation of NWSNut allocated resources is the responsibility of the client NLM. For every
portal, list, menu or form create function there is a corresponding destroy function. The destroy
function will deallocate the resources allocated on behalf of the client NLM for the specific
function.
Finally, there are two steps that are common to the development of all NWSNut client NLMs.
Since two of the initial steps were the NWSNut initialization and the creation of a CLIB screen,
you must also recover the resources allocated by the NWSInitializeNut and destroy the CLIB
screen. NWSRestoreNut( ) deallocates the tables created by the NWSInitializeNut and must be
called before the termination of any NWSNut client NLM.
NWSNut client NLMs help NLM developers to create a useful and interactive computing
environment. The NWSNut APIs provide a standardized, more supportable user interface NLM.
Built-in language-enabling creates a larger marketing arena for NLM developers. The NWSNut
APIs provide everything you need to develop NLMs with Novell's "look and feel."
For more information on the procedures described in this article, contact the Developer Support
Group at 1-800- NETWARE (1-800-638-9273) or 1-801-429-5588. To purchase the NLM SDK
for NetWare 4.0 or any other Novell Software Developer's Kit, contact Novell's Professional
Developers' Program at 1-800-NETWARE or 1-801-429-5588.
DR DOS v6.0 Configuration & Batch Processing
DR DOS v6.0 allows you to take advantage of very powerful configuration and batch
processing commands. This short article provides several general examples of how you can use
these commands to create a variety of configurations and select any one on bootup.
Example 1: The use of GOTO in CONFIG file
The GOTO statement, as shown in Figure 3, is used to proceed directly to a label. This
function works like the GOTO statement found in batch file processing.
FIGURE 3: GOTO statement in CONFIG file
?"Do you want to run QEMM (y/n)? " goto QEMM
?"Do you want to run MemoryMAX (y/n)? " goto DRDOS
:QEMM
DEVICE=c:\QTR_DECK\QEMM386.SYS
DEVICE=C:\DRDOS\HIDOS.SYS /B=FFFF
(additional QEMM driver lines go here...)
goto COMMON
:DRDOS
hidos=on
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO...
...
:COMMON
files=40
hibuffers=20
END of Figure 3
Example 2: The use of CHAIN in the CONFIG file
This example in Figure 4 shows how you can link to other files that hold your configurations for
each system setup. In the following CONFIG.SYS file, the two lines direct the configuration
process to the files, QCONFIG.SYS and MCONFIG.SYS. The appropriate FILES, BUFFERS,
etc. information is contained within those files and not within the main CONFIG.SYS file. If the
response to both questions is no, a default configuration begins. The RETURN command cannot
be used to return to the parent CONFIG file.
FIGURE 4: CHAIN statement in CONFIG file
?"Do you want to run QEMM (y/n)? " chain=QCONFIG.SYS
?"Do you want to run MemoryMAX (y/n)? " chain=MCONFIG.SYS
files=40
hibuffers=20
END of Figure 4
Example 3: Using SWITCH/RETURN and labels
With this technique, processing pauses on the SWITCH command until the user chooses an
option. The appropriate option is selected by choosing a number. The SWITCH command then
goes to the corresponding label. In Figure 5, 1 selects the label :NOLIM, 2 selects the label
:512K and so on. The RETURN command returns processing to the line after SWITCH. Notice
the use of the ECHO statement for setting up the menu options.
FIGURE 5: Using SWITCH/RETURN and labels
ECHO = Choose how much Extended Memory you want to
convert
ECHO = to LIM Memory for this session.
ECHO =
ECHO = 1 (or ENTER) No LIM Memory
ECHO = 2 512K of Memory
ECHO = 3 1024K of Memory
ECHO = 4 2048K of Memory
ECHO =
ECHO = Make your selection...
SWITCH NOLIM, 512K, 1024K, 2048K
GOTO DEFAULTS
:NOLIM
DEVICE=C:\DRDOS\EMM386.SYS /F=NONE /K=AUTO /B=FFFF /R=AUTO
RETURN
:512K
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO /K=512 /B=FFFF /R=AUTO
RETURN
:1024K
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO /K=1024 /B=FFFF /R=AUTO
RETURN
:2048K
DEVICE=C:\DRDOS\EMM386.SYS /F=AUTO /K=2048 /B=FFFF /R=AUTO
RETURN
:DEFAULTS
SHELL=C:\COMMAND.COM \C: /P /E:512
HIDOS=ON
HIBUFFERS=20
FILES=30
END of Figure 5
Example 4: How to use environment variables in the CONFIG
The use of variables in the CONFIG is not quite the same as in batch files. Because the
command processor (COMMAND.COM) is not loaded until after CONFIG processing,
environment variables are stored. These variables are then passed to the command processor
where they can be tested and processed through the AUTOEXEC.BAT or other batch files.
It is not possible to test an environment variable in the CONFIG. The CLS, CPOS, EXIT and
SET commands are featured in the example in Figure 6.
FIGURE 6: CLS, CPOS, EXIT and SET commands in CONFIG.SYS
:DEFAULTS
SHELL=C:\COMMAND.COM \C: /P /E:512
HIDOS=ON
HIBUFFERS=20
FILES=30
etc....
ECHO = Choose which TSRs and Utilities you want
loaded
ECHO = at BOOT time for this session.
ECHO =
ECHO = 1 (or ENTER) None... just continue
ECHO = 2 Mouse & Cursor Drivers
ECHO = 3 Keyboard "Speeder"
ECHO = 4 Novell Network
ECHO = 5 Done with selections
ECHO =
ECHO = Make your selection...
:MORE
CPOS 10,33
SWITCH NOTHING, CURSMOUS, SPEEDKEY, NOVELL, DONE
GOTO MORE
:DONE
:NOTHING
CLS
EXIT
:CURSMOUS
SET THINGS=ON
RETURN
:SPEEDKEY
SET SPEEDKEY=ON
RETURN
:NOVELL
SET NETWORK=ON
RETURN
END of Figure 6
The AUTOEXEC.BAT shown in Figure 7 picks up the environment variables. The
AUTOEXEC.BAT file now allows testing of the environment variables and executes commands
based upon the conditionals illustrated Figure 7.
FIGURE 7: AUTOEXEC.BAT picking up environment variables.
@ECHO OFF
:drdosbeg
VERIFY OFF
PATH C:\;C:\DRDOS;C:\BATS;C:\TOOLS;C:\WINDOWS
if "%things%"=="on" prompt
$e[s$e[0;70H$e[1;36m$t$e[u$e[1;36mDR
DOS6$p$g$e[2;32m
if not "%things%"=="on" PROMPT [DR DOS] $P$G
SET TEMP=C:\TEMP
IF NOT "%TEMP%"=="" MD %TEMP% >NUL
if "%things%"=="on" HILOAD MOUSE
if "%things%"=="on" HILOAD CURSOR /s10
if "%speedkey%"=="on" c:\drdos\mode con:rate=30 delay=1
if "%network%"=="on" hiload c:\lan\ipx
if "%network%"=="on" hiload c:\lan\net3
:drdosend
END of Figure 7
Other Examples
Figure 8 shows how to select different AUTOEXEC.BAT files from CONFIG.SYS using the
? and the Shell statement. In the Shell statement the /P switch can be followed by a filename.
When present, the named file will be executed instead of the AUTOEXEC.BAT. The named file
must have a .BAT extension and cannot exceed 11 characters including path.
FIGURE 8: Selecting different AUTOEXECs using the "?" and the Shell statement
?"Default Autoexec? (y/n) "SHELL=C:\COMMAND.COM C:\ /P
/E:256
?"Alternate Autoexec? (y/n) "SHELL=C:\COMMAND.COM C:\
/P:ALTERNAT.BAT /E:256
END of Figure 8
The example in Figure 9 employs "menu" choices with SWITCH. Notice how the "SET
environment" variables can be used and tested for different AUTOEXEC type files in this
example.
FIGURE 9: Employing "menu" choices with SWITCH
CONFIG.SYS
ECHO = 1 For Windows Configuration
ECHO = 2 For QEMM Configuration
ECHO = 3 For DR DOS MemoryMAX Configuration
ECHO = 4 For 386MAX Configuration
ECHO = 5 For no Configuration... just exit
SWITCH win, qemm, memm, 386m, none
:none
set autoexec=norm
exit
:win
set autoexec=win
chain=wconfig.sys
:qemm
set autoexec=qemm
chain=qconfig.sys
:memm
set autoexec=memm
chain=mconfig.sys
:386m
set autoexec=386m
chain=386conf.sys
AUTOEXEC.BAT
@echo off
PATH C:\DRDOS;C:\;C:\UTIL;
VERIFY OFF
PROMPT $P$G
DISKMAP C: D:
IF "%autoexec%"=="norm" goto DRDOSEXIT
SHARE /L:40
IF "%autoexec%"=="win" SUPERPCK /EM /L:2048
IF "%autoexec%"=="qemm" CALL QEMM.BAT
IF "%autoexec%"=="memm" SUPERPCK /A /L:2048
IF "%autoexec%"=="386m" CALL 386.BAT
:DRDOSEXIT
END of Figure 9
For more information about Novell's DR DOS v6.0 product, call 1-800-NETWARE or
1-801-429-5588.
Optimization with Duplicate Field Names (NetWare SQL v3.0)
If multiple tables in the same dictionary use the same field name, there can be a problem in
optimizing some SQL statements. In Figure 10, notice that the tables both have a field called
"Name", which is an index in table T2.
FIGURE 10: Example tables containing duplicate field names
CREATE TABLE T1 USING "T1.DAT"
(Name CHAR(20), ID INT(4)) WITH INDEX (ID);
CREATE TABLE T2 USING "T2.DAT"
(Name CHAR(20), Cust_ID INT(4)) WITH INDEX (Name);
END of FIGURE 10
The following select statement performs a join of these two tables:
SELECT * from T2, T1 where T2.ID =
T1.Cust_ID and Name = "John";
This statement will return the proper data set, but can also cause NetWare SQL to perform an
optimized search utilizing the index in table T2 on the "Name" field. Since table T2 is the
primary table in the view, and the restriction is based on an indexed field in the primary table,
NetWare SQL should use the index to retrieve the records to be joined to table T1. This will only
occur if NetWare SQL uses the "Name" field from table T2 when performing the restriction, and
not the "Name" field from table T1.
When processing this query, NetWare SQL determines which Name field to use when it searches
the dictionary for a field called "Name" that is in one of the tables in the view. Whichever Name
field it finds first is the "Name" field it will use to perform the restriction. Since table T1 was
created first, NetWare SQL will find its "Name" field first, and so it will use "T1.Name" to
perform the restriction. In this case, NetWare SQL will do a file scan of table T2, join each
record to table T1, and then check the resulting record for a Name of "John" from the T1 portion
of the record.
To ensure that the optimization is performed correctly, qualify the field name with the
appropriate table name or alias that should be used. The following select statement performs an
optimized join of the two tables:
SELECT * from T2, T1 where T2.ID =
T1.Cust_ID and T2.Name = "John";
The "Name" field in the restriction is qualified with the table name from which the field should
be taken. In this case, since "T2.Name" is an indexed field, NetWare SQL will retrieve only
those records from table T2 which have a value of "John", and then join those records to table
T1.
New CLib Documentation (Network C for NLMs v2.0 (e))
Network C for NLMs SDK (e) includes a file called NEW311.TXT that contains
documentation for the following new CLib APIs:
- ASCIIZToMaxLenStr( )
- ReturnNLMVersionInfoFromFile( )
- RetrurnNLMVersionInformation( )
- RingTheBell( )
- ThreadSwitchWithDelay( )
NEW311.TXT is located in the \NOVM directory of the SDK.
Btrieve Programmer's Manual Correction (NetWare Btrieve (NLM) v6.00)
The Btrieve Programmer's Manual for the v6.0 SDK incorrectly documents the Filter
Portion for the Get Next Extended (36) operation, Get Previous Extended (37) operation, and
Step Next Extended (operation 38) operations.
On page 4-69 and 4-83 the Get Next Extended and Get Previous Extended operation Filters are
documented as:
1 Byte Data type of field
2 Byte Length of field
1 Byte Comparison code
On page 4-131, the Step Next Extended operation Filter is documented as:
1 Byte Data type of field
2 Byte Offset of field
1 Byte Comparison code
Each of the extended retrieval operations should specify a filter as on page 4-141 for the Step
Previous Extended operation Filter:
1 Byte Data type of field
2 Byte Length of field
2 Byte Offset of field
1 Byte Comparison code
SuspendThread() Suspends Entire Thread Group (Network C for NLMs v2.0 (e))
With the Network C for NLMs SDK, when a thread uses SuspendThread( ) to suspend
itself, it works properly. However, if you pass it the ThreadID of a different thread, it will
suspend all threads in that thread's group.
To avoid suspending all threads in the group, if you want to suspend one thread from a another
thread, place the thread to be suspended in its own thread group.
Compiler Error Using XQL.H Header (NetWare SQL v2.11)
The WATCOM v9.0 compiler does not allow any reference to the extra registers es, gs
and fs in flat model. The XQL.H file contains a pragma which has the statement which results in
the compiler error, "Illegal register modified by 'XQLEntry' #pragma":
modify [eax ecx edx fs gs 8087];
To avoid the compiler error, modify the statement by removing the reference to fs and gs as
follows:
modify [eax ecx edx 8087];
The XQL.H file is used in conjunction with XQLNLM.C when developing an NLM that can
communicate with the NetWare SQL NLM. The header and source module were first distributed
with the NetWare SQL Developer's Kit v2.11.
Matching Btrieve Requester and DLLs (Btrieve for Windows v5.10)
Btrieve can return status 97 (Data Message Too Small) on Create operations with a
Windows application if improper versions of the Btrieve Requesters and DLLs are used.
However, this status code will not be returned at all workstations; some workstations will run the
application without problems.
This situation results from leaving different versions of WBTRCALL.DLL in directories or
having an inappropriate DLL in the default drive. If you have several DLLs in your path
statement, Windows will search for DLLs in the following order:
- Application-specific directory specified in an
- .INI file
- Current directory
- Windows directory (e.g. C:\win31)
- Windows system directory (e.g., C:\win31\system)
- Application directory (i.e., path from which the program is retrieved (only Windows
v3.1))
- Directories specified in path
- Mapped network directories
If you want to use both the client and requester versions of WBTRCALL.DLL, the client
version must be converted WBTRLOCL.DLL with the WNDBCNUT.EXE utility. Make sure
that you are always using the latest requesters available; currently BREQUEST.EXE v6.00b and
WBTRCALL.DLL v6.00c. Make sure that no other versions of these two DLLs exist in other
directories specified in your PATH statement. Otherwise, Btrieve may return the message
"Requester not loaded," seemingly inappropriate status codes or the system may generate a
general protection fault (GPF).
Reclaiming Memory from Deleted Extended Attributes (Network C for NLMs v2.00)
Calling WriteEA( ) with the dataBufferSize set to zero will remove the particular key and
data components. The space occupied by a deleted extended attribute is not relinquished back to
the operating system for general use. However, if another WriteEA( ) call is made that is actually
entering a new extended attribute, the data space is used again. The data space can be recovered
for general use, if the volume on which the extended attribute resided is dismounted and
remounted.
NetWare LU6.2 DOS Programmers Guide Update (NetWare for SAA LU6.2 Tools v1.4)
In the documentation for NetWare LU6.2 v1.4, the workstation-to-workstation examples
fail to mention a step involved in invoking NOVELL2.EXE. In the Netware LU6.2 DOS
Programmer's Guide (page 5-9), before the statement "Please enter the 8 character mode name,"
insert the statement "Please enter the LU Local address (0 to 255)." NOVELL2.EXE requires this
address. In addition, the manual should state that all options should be entered in upper case.
Open Btrieve Files & Non-Btrieve Apps (NetWare Btrieve (NLM) v6.0)
If Btrieve v6.0 opens files, they can still be accessed by a non-Btrieve application (like a
DOS v5.0 COPY) without generating a Sharing Violation error. This situation does not arise
with pre-6.0 versions of Btrieve and is not the result of a bug.
BTRIEVE.NLM v6.0 opens files differently than earlier versions of Btrieve. With Btrieve v6.0,
files are first opened in Shared Read mode by the foreground process and, when data is written to
the files, they are reopened by the Background Writer in exclusive Write, Shared Read mode.
Versions of Btrieve before v6.0 opened the files with one exclusive Read/Write handle.
If you use BTRIEVE.NLM v5.x, the following scenario applies:
- Backups fail if the Btrieve file is open.
- A Sharing Violation Error is returned on any attempt to use a non-Btrieve application to
open a Btrieve file that is already opened by Btrieve v5.x. With Btrieve 6.0, the outcome is
different. To ensure database integrity when backing up files, either:
- Make sure all the Btrieve files are closed before running the backup.
- Use Continuous Operations.
- Use a backup utility that opens the files in exclusive write mode. Even though the backup
utility is only going to read from the file, it has to open the file in a mode that will prevent other
processes from writing to it. Exclusive Write mode guarantees this. Make sure the backup utility
can get exclusive rights to the file.
Self-Joined Views are Read-Only NetWare SQL v3.0
Under certain circumstances, a view is considered to be Read-Only --i.e., Insert, Update
and Delete operations are not allowed. A list of criteria determining whether a view is Read-Only
or not is included in the Getting Started manual provided with the NetWare SQL Developer's Kit
v3.0, on pages 1-10 and 1-11. However, this list does not state that if a view contains a self-join
(i.e., a file joined to itself), it is a Read-Only view.
Do not attempt to insert, update or delete records using a view containing a self-join. Any
attempt to do so will return a status 318 - "Cannot Update View Defined in Read- Only Mode."
Fast Answers to Common Questions
NetWare C Interface for DOS
Q - When I try to delete a drive mapping, the floppy drive is accessed. Why
does this happen?
A - MapDriveUsingString( ) does some processing and then calls the MapDrive API.
If you look in the library source, however, you will notice that it always passes MapDrive( ) a
base drive number of zero, which is the A: drive.
To avoid accessing the floppy drive, either use MapDrive( ), or correct the
MapDriveUsingString( ) library source code as shown in Figure 11.
FIGURE 11: Necessary correction to MapDriveUsingString( )
Old line:
/*-- map the drive --*/
ccode = MapDrive( currConnectionID, (BYTE)0, fullPath,
searchFlag, searchOrder, &driveLetter );
New line:
/*-- map the drive --*/
if (searchFlag == DRIVE_DELETE)
ccode = MapDrive( currConnectionID, 0xff, fullPath,
searchFlag, searchOrder, &driveLetter );
else
ccode = MapDrive( currConnectionID, (BYTE)0, fullPath,
searchFlag, searchOrder, &driveLetter );
END of FIGURE 11
Tip When you use the Borland C++ Compiler to compile an application, the
linker may return unresolved external errors. These errors result because the NetWare C Interface
for DOS and the NetWare C Interface for Windows use standard C functions. To resolve these
error messages, use the following code fragment when including header files from these
interfaces.
#ifdef __cplusplus
extern "C" {
#endif
#include
#include
#include
#ifdef __cplusplus
}
#endif
NetWare OS/2 SDK
Q - The documentation for the NetWare OS/2 Software Developer's Kit v1.3 does not
describe an initialization value for the sequence number parameter in the
NWScanFileInformation call. What is the proper value for this parameter?
A - The sequence number parameter should be initialized to -1.
Q - The documentation for the NetWare OS/2 SDK v1.3 describes the sequence
number parameter for NWScanFileInformation2( ) as being an integer and also does not provide
an initialization value. Please clarify this information.
A - The sequence number parameter should be declared as type "long" and should
also be initialized to -1.
Q - On page IPX4-9 of the NetWare OS/2 API Reference, the first parameter in
IPXGetLocalTarget( ), *puchTarget, is defined as a pointer to PUCHAR. However, PUCHAR is
already defined as a pointer to an unsigned character typedefed in the OS/2 DEF.H file. What is
the correct definition?
A - The documentation is incorrect. Define puchTarget as an output parameter (not an
input parameter) of type PUCHAR (instead of *puchTarget).
NetWare Btrieve NLM
Q - Using the NetWare Btrieve NLM v6.0, BTRMON and NDBMON show files as
opened by a different user than the one that originally opened the files and I can't back up or
close those files. Why does this happen and what should I do?
A - When NetWare time restrictions are in force and a user's NetWare connection is
terminated, Btrieve files opened to this connection remain open. If someone logs in and gets the
same connection ID as the user who previously opened the files, the Monitor utilities show that
the new user opened the files. Actually, Btrieve has these files open. The files should not be
backed up unless they are in Continuous Operations mode.
The new user cannot access these files because he doesn't have the necessary Btrieve
position blocks. The connection ID does not give the user access to the files because the user
never opened the files. To avoid leaving files open, your application should perform an explicit
Btrieve Reset operation, or the workstation should be rebooted before the NetWare time
restrictions take effect.
NetWare SQL
Q - When I pass the view name for a joined view to the sTableNames parameter, a
Status 204 (Table not defined in dictionary) is returned. What should I do?
A - To update a joined view, place the "*.*" string in the sTableNames parameter.
The wildcard characters will ensure that all the tables associated with a joined view name will be
updated. Another option is to send each table name comprising the joined view as a string (e.g.,
Personnel0Payroll0Dept0).
Designing Software for the International Market (Special supplement)
The international software market presents a large and expanding market for software
developers, as can be seen by the worldwide system revenues outside the United States.
Currently, the Japanese and Latin American software market are enjoying double-digit growth.
Analysts expect this trend to continue for the next several years.
Novell currently receives about 51% of its revenue from markets outside the UnitedStates. For
this reason, Novell is committed to expanding the international market. Third party developers
are invited to join Novell in this market by making sure that their NetWare applications fit
within the Novell internationalization strategy. This is the first in a series of articles to help you
better understand how to develop your application for markets outside of the U.S.
Where do I start?
To bring your product to international markets, it is best is to understand some of the
terminology involved in this effort.
- Retroffiting - the process of adapting an existing product for a specific language.
Retrofitting is generally undesirable if you plan to develop your application for several languages
because of its high initial cost and even higher maintenance costs. In addition, the engineering
effort must be repeated for each specific locale.
- Enabling - the process of designing, implementing, and testing software that is easily
adaptable to different locales with a minimum of engineering effort when introducing another
language. The initial investment may be as high as retrofitting, but with each subsequent
additional language, costs are greatly reduced.
- Localization - the process of adapting an enabled piece of software to a particular locale.
It consists of translation of user-viewable data and verification of the translation. The translation
is typically done by professional translators, often in the particular locale, ideally with little or no
work on the part of the application developer.
- Internationalization - the combined process of enabling and localization. In other words,
the programming effort required to enable software, plus the linguistic effort to translate and
adapt it to a particular locale.
How Do I Enable my Products?
To enable products for the international market, Novell recommends that you first isolate
all translatable data from your software. The data in a program that should be isolated and
translated are often called resources. Various resources that should be isolated are as follows:
- Text strings - including informational messages, abends, error messages, help
text, etc.
- Panels - also sometimes called dialogs, windows, and screens. C-worthy programmers
must define the panels programmatically by composing a number of screens. A similar panel in
Windows would be defined as a single resource, called a dialog template.
- Program control - any shortcut commands (called accelerators in Windows) for
experienced users. These accelerators are often mnemonically-based (for example, CTRL-C),
and should therefore be translated.
- Graphics - icons and bit maps are also frequently culture-specific and must be translated.
For example, check marks in the U.S. are used to mark desired items. In Japan, a check mark
means that something is bad or should be discarded.
What Tools Are Available for Enabling?
In NetWare 4.0, Novell provides a suite of utilities called Message Enabling Tools to
manage the enabling and translation of software string resources such as error messages and
menu items. The Message Enabling Tools are designed to work with the displayable text strings
in NLMs, the NetWare operating system, text-based utilities, and DOS system-level software.
Specifically the message tools do the following:
- Isolate text messages from the source code, so that you don't have to recompile
the source code whenever you want to change languages
- Place the original text messages and translated versions of the messages into Language
Modules, which are bound to their respective programs
- Help test product enabling
- Simplify dealings with translation houses by providing a single interface to translators
- Provide technical support with a quick way to look up message sources
- Provide translators with terminology lists derived from messages
In future versions of NetWare, Novell will support the graphical user interface
environment by placing strings in resource-only DLLs.
How do I Translate Message Files for a Particular Locale?
Translation is only one part of localization but it is also a very important part. You should
annotate the message strings before you give them to a translator. The more information you give
the translator, the fewer headaches you will have later. Some of the information you may want to
give the translator includes:
- Length limits - almost all messages will be longer in their translated form than
they were in English. In general, you should enable your software to handle variable-length
messages, but if there are some messages that must not exceed a certain length, you must tell the
translator.
- Translatability - messages often contain keywords or product names that should remain
the same in translation. Point these out to the translator.
- Format - some messages are padded to begin or end in a certain column on the screen. If
format is important for the message, you should tell the translator how to format the translation.
- Variables - Variables, such as "%d" and "%s," must be annotated so that the translator
knows if they are proper names. You must also number each variable so that the translator can
indicate how they are to be reordered.
- Context - when you extract messages from the source code, make sure you extract them
from their context. It may be obvious when you are running a program that "Restore Menu" is
the header title of the menu, but out of context, the translator could just as easily interpret it as
the command "Restore the Menu."
In general, be generous when supplying general context notes for the translator; it will
make the translator's job much easier and the translation will be much more accurate.
What Comes After Translation?
After translation, you will need to couple your localized resources with the executable
code. The process is called coupling or bindling. Several coupling scenarios are possible.
Novell uses load coupling. In load coupling, the program finds its resources and loads them into
memory during program initialization. Load time coupling facilitates multilingual support. There
can be a different resource subdirectory for each language. Load time provides for flexible
packaging (when customers want a language update, they receive only resources, no code). This
method is used and recommended by Novell.
Some other possible coupling scenarios are as follows:
- Compile/Assemble - because compilation and assembly require engineering
resources, they should not be used to couple resources to executable code. It makes the logistics
of the localization process more difficult (and many additional problems will come back to the
engineer).
- Link - for the same reasons, linkers should not be used to couple resources.
- Static coupling - a utility either appends the resources to the executable image, or inserts
the resources in a reserved area of the program. Static coupling has many of the disadvantages of
compiling and linking the resources, and is not recommended.
- Run - every time the program needs a resource, it loads it in from a resource file.
Conceivably, a user could change the language at any moment during the program. This has the
disadvantage of causing disk operations during inconvenient (or impossible) moments.
Special Considerations with Enabling and Localization
Some things you may want to be aware of in your enabling and localization efforts are as
follows:
- Monocasing - the method for converting a - z to uppercase using a simple
arithmetic operation such as "if ('a' <=c && c<='z') c = 0x20;" will not support characters with
diacritical marks or double-byte characters. The solution is to use monocasing tables for each
locale.
- Collation - like monocasing, collation is locale- dependent and should be handled in
collation tables for each locale. For example, in Danish, the ligature ' comes after Z. For
languages with non-alphabetic systems, such as Japanese, collation is much more complicated.
- Date Formats - formats vary from country to country. For example, the date format in the
U.S. is MMDDYY, in Spain, it is DDMMYY, and in Japan, YYMMDD.
- Time Formats - time formats vary from a 12-hour to a 24-hour clock. The U.S. is one of
the only countries that does not use a 24-hour clock. Some locales use colons to separate hours,
minutes and seconds, others use periods.
- Numeric and Monetary Formats - like time and date formats, these formats can vary from
locale to locale.
- Character Sets - 7-bit and 8-bit character sets are insufficient to handle the scripts used by
many of the world's languages. If you want to handle Oriental scripts, you mast handle
double-byte character sets as well
- Hardware Enabling in the Japanese Market - the five different hardware architectures
used in Japan present special challenges for software internationalization. Enabling applications
for the Japanese market means converting programs to run not only on Japanese hardware, but on
several different types of hardware. Thus, making sure that your application is independent of the
hardware on which it is running becomes a must for applications intended for this market.
Products for International Software Development
To begin your application development now for the international marketplace, you will
want to purchase one or both of the following products:
- NetWare Client SDK for DOS, OS/2, and Windows (for client development)
- NLM SDK for NetWare 4.0 (for server development).
Note that currently the Message Enabling Tools are only available with the NLM SDK for
NetWare 4.0.
Are there any tools specific to development for the Japanese market?
Novell is working to make the NetWare 3.11J for DOSV operating system avail-able to
registered members of Novell Professional Developers' Programs through a development license.
Used in conjunction with the NetWare Client SDK or the NLM SDK for NetWare 4.0, you can
retrofit your existing NetWare 3.11 applications using a standard IBM-compatible PC. Once you
have retrofitted your application for this platform, you can consider other platforms like NetWare
3.11J for NEC.
The advantage of developing to NetWare-J is that it eliminates many of the hardware
dependencies that developers encounter due to the various incompatible hardware platforms in
the Japanese market. Novell Developer Relations actively supports developers who want to write
to NetWare 3.11J. Contact Novell Developer Relations for more information on developing
applications for the NetWare-J operating system.
YES, Our NLM is NetWare Tested & Approved! (Special supplement)
When customers ask about your NLM application, wouldn't it be great if you could say
"YES! Our NLM is NetWare tested and approved." The NLM Certification Program allows you
to do just that. The NLM Certification Program allows third party developers to design, develop,
and submit their products for testing using the certification guidelines and test procedures from
Novell Labs. Once tested and approved, your application earns the privilege of wearing the YES,
NetWare Tested and Approved logo.
NLM Certification Program Benefits
Anyone who is developing NLM applications for the general marketplace can participate
in the NLM Certification program. But why would I want to participate in the program you ask?
The following are a few of the benefits you will receive:
- Your NLM will be leaner, faster, and more technically correct.
- Your NLM will be certified as running correctly with NetWare
- Your NLM will be ensured to use network resources correctly and thus, will not affect the
performance of the network or its integrity adversely
- Your sales will increase as more and more customers look for the "Yes, NetWare Tested
& Approved" logo on the products they consider purchasing
- You have an additional, indirect source of technical support through Novell Labs that can
help you write less code, encounter fewer problems, and generate better applications.
So is the process painful? No, actually it is quite simple. Read on for a step-by-step
procedure for having your NLM certified.
Step 1: Purchase the NLM Certification Kit
To start the certification process, you will need the NLM Testing Tools SDK (Part#
884-0000059-001). This SDK is included in the Network C for NLMs SDK, so you may already
have the tools you need. Otherwise, call 1-800-NETWARE and ask for the NLM Testing Tools
SDK. As with all SDKs, you must be a member of the Novell Professional Developers' Program
to obtain Novell SDKs. Membership in the program is free of charge to Novell developers.
The kit includes the following:
- NLM Certification Manual - Read this manual first. It explains what behavior
testing is and how to do it, as well as how to use the utilities provided on the diskette. It also
explains how to submit a product for certification and the associated fees involved.
- PCL User's Manual - A user's manual that describes how to determine the percentage of
your NLM that is executed during your own testing procedure and helps you develop adequate
testing procedures for your application.
- NLM Master User's Guide - describes the suite of products you are provided that allow
you to automate your NLM or DOS application testing on a network. This manual lets you
automate the tests you created with PCL (Procedure Coverage Logger).
- Three diskettes - that contain behavior testing utilities and user activity simulators.
If you plan to eventually have your NLM certified, it is better to use this Certification Kit
to help design the product, rather than retrofit your application to meet these certification
requirements later.
Step 2: Perform Testing at Your Location
Using the tools and guidelines provided in the kit, perform your own product testing at
your location. Try to find and correct any problems associated with your NLM before submitting
it to testing at Novell.
Note that you can stop at this step and never have to get your NLM certified, even if you
purchase and use the kit in the design of your product. It is important to Novell that you use the
kit to develop a quality NLM. Getting your NLM certified is a choice only you can make.
Step 3: Fill Out Forms and Pay Certification Fees
When you are ready to have your NLM certified, call Novell Labs at 1-801-429-5544 and
they will send you the following forms:
- Novell Labs Agreement - this form establishes the legal relationship between
Novell and your company. You fill out this form only once no matter how many of your products
are being certified.
- Testing Request Form - you must fill out one of these forms for each product that you
want tested and certified. Note that testing is requested and paid for by product, not by NLM.
With your completed forms, you will need to submit to the certification fee to Novell
Labs. Pricing is not yet determined for certifying additional products or for recertifying major
revisions to existing products (for example, your product is revised to run on additional operating
systems).
Finally, you will need to call Novell Labs and obtain an evaluation purchase order number at
1-801-429-5544.
Step 4: Submit Your NLM to Novell Labs
Submit the following to Novell Labs:
- Results of the behavior testing of the NLM performed at your site.
- Any specialized equipment required for your NLM (for example, your NLM may require
a particular CD-ROM drive). Novell Labs has standard network equipment at their site. All
equipment submitted will be returned when testing is complete.
- Two copies of your NLM: a copy containing Novell debugging information and a
standard release copy.
Step 5: Novell Labs Tests and Certifies Your NLM
Novell Labs receives your NLM and completes the testing process. It is important to note
that certification is not a pass/fail process. If changes to your NLM are required to complete
certification, Novell Labs works with your company on an individual basis until your NLM
completes the certification process. No one has ever failed to get their NLM certified. Novell's
goal is to certify as many NLMs as possible, and is committed to working with you to
accomplish this goal.
Step 6: Submit Shrink-Wrapped Products to Novell Labs
Once your NLM is certified, you will need to submit two shrink-wrapped copies of your
certified product to Novell. One copy will be used in Novell Labs to test for compatibility with
other certified products. The other one will be given to Technical Support to help with customer
support of your product.
Special Limited Time Offer
If you are writing a NetWare 4.0 NLM or upgrading your existing NetWare 3.x NLM
using the NLM SDK for NetWare 4.0, between now and July 1, 1993 Novell Labs may certify
your NLM free of charge. Please contact Novell Labs Administration at (801) 429-5544 to learn
more about this promotion.
Object Oriented Development Tools Announced (Special supplement)
At the Software Development Conference & Exhibition in February, Novell announced
that Powersoft Corporation will incorporate access to NetWare services into its PowerBuilder
object-oriented development environment.
PowerBuilder provides developers with an integrated suite of application painters and tools
through which they completely manage the development process. PowerBuilder's object oriented
approach allows developers to easily build quality graphic applications that communicate with
high-performance database servers and particular NetWare services.
Under a joint development and marketing agreement, Novell will provide Powersoft with
engineering support to ensure that the NetWare 3.11 and 4.0 APIs for directory, file, and print
services are fully implemented as a PowerBuilder Library for NetWare.
Powersoft and Novell plan to work together to gather customer input to determine which
additional services to incorporate in the future. The product will be available for all the operating
systems that Powersoft supports.
In addition to the PowerBuilder Library for NetWare, Powersoft will develop interfaces to
Novell's Btrieve record management system and the NetWare SQL relational database system.
Database interfaces have been an integral part of PowerBuilder since its initial release. These
interfaces allow developers to connect relational database servers to their applications. Currently,
PowerBuilder provides access to the NLM and other versions of popular SQL engines such as
Oracle, Sybase and Informix.
PowerBuilder for NetWare will be available during the third quarter of 1993.
For More Information
For additional information on development tools, developer support programs, and Novell
Developers' Programs, call 1-800-NETWARE or 1-801-429-5588 (in the U.S. and Canada), or
contact your local international Novell office.
Novell Developer Education offers several courses for developers who use Novell's development
& database tools, including NetWare SQL, Btrieve, Xtrieve PLUS, and the NetWare Client APIs.
- 904: Btrieve: An Overview
- This new course provides a general overview of NetWare Btrieve v6.x and its new
features. It covers file structures, indexing, data integrity, record and file locking, caching,
operating modes, segmented keys, backward compatibility and utilities.
- 905: Programming with Btrieve
- This course has been enhanced to cover all Btrieve operations & environments. It provides
a complete introduction to Novell's server-based record manager. 50% of class time is spent in
programming workshops. Working knowledge of C, BASIC, Pascal, or COBOL required.
Prerequisite: 904: Btrieve: An Overview
- 907: Xtrieve PLUS
- This course has been updated to include new features introduced with NetWare SQL v3.0.
It teaches developers to use Xtrieve PLUS as a Btrieve or NetWare SQL programming utility.
Trains users of Btrieve- or NetWare SQL-based database applications to work effectively with
this menu driven utility.
- 911: NetWare Database Administrator
- This new course gives a complete, hands-on look at installing and configuring NetWare
SQL and NetWare Btrieve. It covers the basics of ANSI Standard Structured Query Language
(SQL), focusing on NetWare SQL and key database features like security, referential integrity
(RI), database design, data normalization and performance.
- 912: Programming with NetWare SQL
- This new course is designed for developers and experienced network and database
administrators who will be developing NetWare SQL applications or enhancing existing Btrieve
applications with NetWare SQL. It provides an in-depth look at the functionality of NetWare
SQL and discusses optimizing database systems for development of efficient applications using
Novell database tools.
- 930: Developing NetWare Loadable Modules (NLMs)
- This course introduces C programmers to server-based application development in the
32-bit NetWare 3.x environment. It covers basic concepts for writing server-based C applications
that access the NetWare 3.x C library (CLib). Requires working knowledge of the C language.
- 940: NetWare Programming: Basic Services
- This new lab-oriented class (40 percent lab work) introduces NetWare programming
concepts. It covers topics such as bindery services, file system services, print services, queue
management, connection and file-server services, and accounting and synchronization services.
This class requires knowledge of the C programming language.
- 945: NetWare Programming: Protocol Support
- This new class covers protocol support features. It also discusses network programming
concepts and techniques for developing client-side applications, including Service Advertising
Protocol (SAP) IPX/SPX, diagnostics, NetBIOS, TLI, and Named Pipes. This class requires
strong knowledge of the C programming language.
To obtain information on pricing, location, scheduling, & course content for classes held in the
US, call 1-800-233- 3382, 1-801-429-5508 or 1-800-NETWARE. Customers outside of the US
should call 1-801-429-5508. For information on availability, location, and prices of classes
outside of the US, contact your local Novell office.
Applying current patches can save you a call to the Developer Support Group. The latest
NetWare drivers, example code for NetWare API development tools, OS/2 requester patches, and
patches for Novell database tools are available on Novell's Netwire forum on CompuServe. Back
issues of Bullets and developer FYIs are also available (NOVLIB, library 11).
New information is first stored in NOVLIB library 1, and moved to library 7 after a period of
30 days. If you do not have access to CompuServe, you may request these files from Novell's
Developer Support Group at 1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.
When you call, be ready to provide a shipping address, disk preference (5.25", 3.5", HD, or
DD) and, if you prefer overnight delivery, your company's Federal Express account number. If
you do not provide a Federal Express account number, the patch disk will be sent to you via
regular mail. Updated NetWare API SDK components can be obtained from Novell's NDEVREL
forum on CompuServe. For more information on Novell developer programs contact Novell at
1-800-NETWARE (1-800-638-9273) or 1-801-429-5588.
A document describing available patches and other files and their location on CompuServe is
available through Novell Developer Relation's Automated Fax System (AFS). AFS can provide
you other useful information as well.
To use the AFS, call 1-800-RED-WORD (1-800-733-9673) or 512- 794-1799 from a touchtone
phone. Choose the option for the Automated Fax System, select the documents you wish to
receive, and supply your fax number (the fax number to which you want the document(s) sent).
Document #7805 describes the patches. Document #1 lists other documents available through the
AFS. You may request up to five documents per call.
Developer Support
Developers in the U.S. and Canada may contact Novell Developer Support via telephone, fax,
BBS or electronic mail via CompuServe, MHS or the Internet.
Voice
For both presales and postsales support, call Novell Developer Support between 8:00 a.m. and
5:00 p.m. Mountain Time at 1-801-429-5588. Many calls to Novell Developer Support are
passed to a software support engineer immediately. Calls to Novell Developer Support generally
will be acknowledged or answered within four hours.
Fax
If you prefer, you may contact Novell Developer Support via fax at 1-801-429-2990. Faxed
questions are acknowledged or answered within 24 hours.
Developer BBS
If you do not have access to either CompuServe or the Internet, send test cases to our BBS. Set
your communication software to N-8-1 and call 1-801-429-5836.
E-mail: CompuServe
Post your messages in the appropriate section addressed to Novell at 76701,171. These messages
will receive a response within 24 hours.
E-mail: MHS
You may direct your questions and comments to Novell Developer Support via Novell's Message
Handling Service E-mail facility. Address your messages to devsup@novell. These messages
will receive a response within 24 hours.
E-mail: Internet (SMTP)
An alternative method of contacting Novell Developer Support is through the Internet E-mail
system. Send your messages to devsup@novell.com. These messages will receive a response
within 24 hours.
NetWire on CompuServe
Novell's NetWire forum is open to all registered CompuServe subscribers. Through the
NDEVSUP forum, professional developers writing applications with Novell development tools
can gain access to information specific to Novell development. Support, patches, periodicals and
product information, as well as information on all of the programs and services provided for
Novell developers are accessible through this forum. Post your messages in the appropriate
section addressed to Novell at 76701,171. Technical questions will be acknowledged or
answered by Novell Developer Support within 24 hours.
Novell Products and SDKs
Novell products on the "Currently Shipping Developer Products" list (see page 15 of this
issue), including the Red Box Products, are available to Novell Professional Developer's
Program members. Call 1-800-RED-WORD (1-800-733-9673) or 1-303-894-4135 to order these
products or to receive additional information. To order other Red Box Products not listed,
contact your local Novell office or Novell Authorized Reseller.
Novell Labs
For information on Novell Labs development tools, education classes and product certification,
in the U.S. and Canada call 1-800-453-1267 ext. 5544 or 1-801-429-5544, or call your local
Novell office (see back cover of this issue).
Novell Developer Relations
Novell Professional Developers or those wishing to become members may contact Novell
Developer Relations via telephone, fax, or electronic mail via Compuserve, MHS or the Internet.
Voice
For general information or questions on Novell Developer Relations programs, in the U.S.
or Canada call 1-800-RED-WORD (1-800-733-9673). All others call 1-801-429-5281.
Fax
If you prefer, you may contact Novell Developer Relations via fax at 1-801-429-7207.
NetWire on CompuServe
Novell's NetWire forum is open to all registered Compuserve subscribers. Through the
NDEVREL forum, Novell Professional Developer's Program-related issues or general questions
may be posted. Through the NDEVINFO forum, customers who do not have products may post
pre-sales product information questions on all Novell SDKs.
E-mail: MHS or Internet (SMTP)
You may direct your questions and comments to Novell Developer Relations via Novell's
Message Handling Service E-mail facility. Address your messages to devprog@novell.com. Use
the same address when going through the Internet E-mail system.
Publisher: Mad Poarch
Editor: Kirk R. Humphries
Design: Creative Services, Provo
Feature Articles: Clint McVey
Robert Rodriguez
Holly Roff
Contributors: Linda Anderson
Jack Gumaer
Chris Ojeda
Raj Perubhatla
Matt Pinsonneault
Bob Quinlan
Randy Reddy
Michael A. Spano
Wolfgang Schreiber
Glenn Stephens
Aslam Tejani
Shiva E. Waldecker
Brenda Wallace
Novell Professional Developer Bullets is a publication from Novell's Developer Support Group.
Special thanks to the Developer Support, Development, Developer Relations, Product Marketing,
and Marketing Communications staff who contributed time and valuable input.
(c) 1993 Novell, Inc. All rights reserved. Novell, the N design, NetWare, Btrieve, XQL,
LAN WorkPlace and LANalyzer are registered trademarks; NetWare Loadable Module (NLM),
NetWare Global Messaging, NetWare System Calls for DOS, NetWare Runtime, NetWare SQL,
NetWare Btrieve, NetWare C Interface for DOS, NetWare System Interface Technical Overview,
NetWare RPC, NetWare RPC 386, NetWare LU6.2, Report Executive, NetWare MHS, NetWare
Asynchronous Communication Services (NACS), NetWare Management System, Professional
Development Series, NetWare 3270 LAN Workstation, SFT III, and Xtrieve PLUS are
trademarks; and NetWire and Professional Developers' Program are service marks of Novell, Inc.
IBM and OS/2 are registered trademarks, and NetBIOS and SAA are trademarks of International
Business Machines Corporation. Microsoft is a registered trademark, and Windows is a
trademark of Microsoft Corporation. Apple, AppleTalk, and Macintosh are registered trademarks
of Apple Computer, Inc. CompuServe is a registered trademark of CompuServe Corporation.
NFS is a registered trademarks of Sun Microsystems, Inc. UNIX is a trademark of UNIX
Systems Laboratories, Inc., a subsidiary of AT&T. Univel is trademark of Univel, Inc.
|