home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 32 Periodic
/
32-Periodic.zip
/
edmi3-1.zip
/
EDMI3-1.INF
(
.txt
)
< prev
next >
Wrap
OS/2 Help File
|
1995-01-05
|
185KB
|
1,791 lines
ΓòÉΓòÉΓòÉ 1. Jan 1995 Title Page ΓòÉΓòÉΓòÉ
EDM/2
The Electronic Developer's Magazine for OS/2
Portions copyright (c) by Larry Salomon Jr.
Volume 3, issue 1
New Directions
Merry Christmas, Happy New Year, etc. to each of you out there in net-land.
This issue marks the beginning of a new year, and with a new year comes new
directions. From the magazine's perspective, many new directions will be
explored, beginning with this issue - what I have written, including what you
are reading now, I have written using a word processor. It has been decided
that one of the directives for 1995 is to make it easier for potential authors
to disseminate the information that they have learned and wish to share. Since
writing in .IPF is quite daunting, this has often dissuaded people from
submitting an article, and this hurts the OS/2 community. Additionally, it
never was easy to spell-check an .IPF file. <grin> Since many word processors
now support the rich-text format (or RTF), this will now become the requested
file format for new submissions. Please see the new Article Submission
Guidelines, which has been rewritten and uploaded to hobbes.nmsu.edu, for more
information.
Another directive for the magazine is to change the file format of the
magazine. It only makes sense that, in order to increase the size of our
audience, the quickest way is to change the format to that which can be read
with viewers that are available on multiple platforms. Since there are many
"arm-chair" programmers who do not develop OS/2 applications as part of their
daily routine, it would be nice if they could read the magazine on the machine
they use the most, whether that may be running DOS, Windows, or UNIX. We will
keep you posted on this issue as we receive more information.
You'd Be Surprised...
at how many people thought the Title Page had nothing but legal drivel on it.
This came to light when I complained that only one person had voted for the
Reader's Choice Awards during the first three weeks following the release of
last issue; many people responded with "when was this mentioned?" To prevent
this from happening in the future, we have moved the legal portions of the
magazine to the end of this page so that more people will read this section of
the magazine. After all, we wouldn't want you to miss all of the humor.
<grin>
And Speaking of Voting...
I am pleasantly surprised at the response my complaint generated. Since that
time, I have received many more than the fourteen I received last year. It
still isn't a flood, but I'll take what I can get. Still, you have until
January 15 to send in your three votes for the best articles of the year 1994.
See last issue's Title Page for a complete list of the articles eligible for
this award.
It's really funny what some of the votes were for. I'm not trying to pick on
anyone, but receiving votes for software and books that weren't even mentioned
in the magazine, much less part of the magazine (for which your votes should
be) gave me quite a chuckle. I will be including those in the results so that
you, too, can have a grin or two.
Welcoming Another Network
We would like to officially announce the arrival of EDM/2 on America On-line
(AOL). Our network distributor for AOL approached us with the desire to do
this for us and we are glad to have Jason B. Tiller (PeerGynt@aol.com) on the
EDM/2 team! Also, a Scooby Snack goes to David Pedigo who pointed out that, on
the site generalhq.pc.cc.cmu.edu, the directory name should be
/pub/NewsLetters/EDM2 and not /pub/newsletters/edm2 as was stated in previous
issues.
Reader Feedback
One reader, Tarjei T. Jensen, wrote in regarding the Coding for Dollars - Copy
Protection and Prevention article that appeared in last issue. He suggested
that, for simultaneous access of an application, another scheme called NetBIOS
Name Defense can be used for tracking the number of licenses. While his
explanation was detailed, I am a bungling idiot when it comes to anything
dealing with communications. I invite Tarjei to write a "followup" article to
mine explaining this and the other methods that he mentioned in his letter.
Michael Shillingford also wrote in and brought up a very good point that, if
you're bored with the gray on black coloring of your command prompt, you can
use ANSI escape sequences in your prompt string to liven things up.
Unfortunately, these must go in a .CMD file, which you can execute during the
opening of the command window using the /K parameter of CMD.EXE. The escape
sequence is $e[nm, where n is a color from the following list:
Value Color
30 Dark gray
31 Red
32 Green
33 Yellow
34 Blue
35 Pink
36 Cyan
37 White
The background color may be changed also by using the following numbers:
Value Color
40 Black
41 Red
42 Green
43 Brown
44 Blue
45 Purple
46 Dark cyan
47 Pale gray
Finally, using the number 0 indicates that foreground colors are to be from
the low-intensity set, while using the number 1 specifies the high-intensity
set.
If you don't want to set the prompt command twice, you may separate the
numbers by a semicolon; the entire command ends with a lower-case m, e.g.
prompt $e[37;40m[$p] sets the prompt to white on black with the directory name
in brackets.
Is IBM Opening Up?
It would seem so. After a discussion on comp.os.os2.programmer.misc about the
undocumented APIs used in OS/2, I received from a friend who received from a
friend (etc. ad nauseum) the function prologues for the Session Manager APIs.
It really doesn't help much more than any of the Programmer Reference guides
that have been in the toolkits over the years, but it is better than what is
readily available to most of the public.
Finally
Speaking of the Programmer's Toolkit, I received my copy of the DevCon 5,
Special Edition CD-ROM during the last week of December, which I used to
install the Warp toolkit. Noted changes are the inclusion of the
bi-directional interface and the MMPM/2 toolkit in the "base" toolkit. Also,
while perusing through the folder, I was quite pleased to find the on-line
documentation completely redone. Granted, I was only browsing things and
wasn't actually trying to use them, but it seems that they are actually usable
now for more than just a reference guide. Additionally, IBM has included new
on-line documents such as Multimedia Application Programming Guide, Multimedia
Subsystem Programming Guide, OS/2 Bi-directional Language Support Development
Guide, and Workplace Shell Programming Guide. Many, many thanks to IBM for
this much-needed improvement of the toolkit.
Copyright Notice and Other Stuff
The Editor-in-Chief of this electronic magazine is Larry Salomon, Jr.
Portions of EDM/2 are copyrighted by the editors. This publication may be
freely distributed in electronic form provided that all parts are present in
their original unmodified form. A reasonable fee may be charged for the
physical act of distribution; no fee may be charged for the publication
itself.
All articles are copyrighted by their authors. No part of any article may be
reproduced without permission from the original author.
Neither this publication nor the editors are affiliated with International
Business Machines Corporation.
OS/2 is a registered trademark of International Business Machines Corporation.
Other trademarks are property of their respective owners. Any mention of a
product in this publication does not constitute an endorsement or affiliation
unless specifically stated in the text.
Title Page - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 2. The Design and Implementation of VIOWIN: Part 5 ΓòÉΓòÉΓòÉ
ΓòÉΓòÉΓòÉ 2.1. Introduction ΓòÉΓòÉΓòÉ
The Design and Implementation of VIOWIN: Part 5
Written by Larry Salomon, Jr.
Introduction
For my job, I once had to write an application that ran only when OS/2 booted
from the floppy diskettes. Because I had no access to the functionality PM
provides, I resorted to a line-oriented interface, where messages were
displayed on the screen and scrolled up when necessary. It was a good
interface, I thought; it was fully NLS enabled and had intelligent defaults so
the user basically only had to type in the name of the application.
Unfortunately, the Quality Assurance team didn't concur with my opinion. "We
want a nice interface!" one exclaimed. "Yeah, one with different windows and
such!" another shouted.
I was backed into a corner that I could only get out of one way.
This series describes the design and implementation of VIOWIN, a library that
implements a subset of the Win APIs provided by PM for fullscreen sessions.
The reasoning behind writing this series is that it provided me and will
hopefully provide you with some unique insights into how a windowing system is
developed; and since it is based on PM, your familiarity with the already
defined interface will increase your capability to fully understand what is
being described.
Obviously, this series assumes you have PM application development experience,
but it isn't required.
This Month
This month we will wrap up our discussion of the base library so that we may
begin looking at the window classes next month.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume 3,
Issue 1
ΓòÉΓòÉΓòÉ 2.2. Timers ΓòÉΓòÉΓòÉ
Timers
Timers were probably the most exciting to develop for me, because never before
had I given thought to how they were implemented. Seeing them work for the
first time was quite enjoyable. Before we look at the VIOWIN/PM timer, we
should look at the timer-like services provided by the kernel -
DosStartTimer(), DosAsyncTimer(), and DosStopTimer(). The first one starts a
recurring timer with a specified timeout; the second starts a timer that ends
after the first timeout; and the third stops a timer started with either
function. Timers signify their timeout by posting a shared ("public") event
semaphore which can be checked using the DosWaitEventSem() function.
A first pass at guessing how to implement VIOWIN timers would lead you to use
the DosStartTimer() function. Consider the situation when the user calls
vwStartTimer() on an already started timer with the desire to change the
timeout value. Using DosStartTimer() makes implementing this ability more
difficult than is necessary. Therefore, we instead use DosAsyncTimer() to
restart the kernel's timer each time, referencing the current timeout value.
Thus, to change the timeout, we simply change the appropriate variable, which
is used the next time DosAsyncTimer() is called.
It should also be obvious that, since timers continue in the background, a
separate thread must be provided for the timers. It is conceivable that a
single, auxilliary thread could be used for all timers in the system, but it is
easier to implement if we create a new thread for each timer created.
Take a look at the vwStartTimer(), vwStopTimer(), and timerThread() functions
in the source provided; they should not be difficult to understand, especially
with the comments scattered throughout the source.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume 3,
Issue 1
ΓòÉΓòÉΓòÉ 2.3. Resources ΓòÉΓòÉΓòÉ
Resources
The title is actually misleading, because VIOWIN only supports STRINGTABLE
resources. The problem is supporting resources is not getting the resources,
but decyphering the data that comes back from the kernel. For this, I used
Microsoft's Quickhelp utility and Martin Lafaix's article Resources and
Decompiling Them from EDM/2 volume 2, issue 6.
STRINGTABLEs are a curious beast because they are the only resource for which
one does not specify a resource identifier for the table itself. Instead, the
resource compiler breaks the table into 16-string subtables whose strings have
contiguous identifiers. So, if you have a table whose strings have identifiers
of 1, 17, 33, and 49, the resource compiler will create 4 subtables containing
strings from 0-15, 16-31, 32-47, and 48-63, though each of these subtables
contains only one string. You can obviously see why you would benefit from
using contiguous identifiers for your strings in the STRINGTABLE.
The kernel provides the DosGetResource() and DosFreeResource() functions for
loading the resource into memory and freeing the memory used by the resource
(the former returns a PVOID which is why the latter function is necessary).
Unfortunately, the online references do not tell you the format of the data,
which I had to figure out with the help of my two other references.
STRINGTABLEs (actually, the subtables) have the following form:
Size of the table (2 bytes)
Length of string 0 (1 byte)
String 0 (n bytes)
Null-terminator (1 byte)
Length of string 1 (1 byte)
String 1 (n bytes)
Null-terminator (1 byte)
:
Length of string 15 (1 byte)
String 15 (n bytes)
Null-terminator (1 byte)
The null-terminator is not included in the length. The identifier of the
subtable is calculated given the identifier of any string within it by dividing
the string identifier by 16 using integer division. The position (0- 15) of
the string is calculate by taking the remainder of the previous division. So,
string 120 is in the subtable with the id 120/16=7 and is in position 120%16=8
(meaning 7 when counting at base 0).
The code for vwLoadString() should be easy to digest given the above
discussion. Take a look and send me any questions.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume 3,
Issue 1
ΓòÉΓòÉΓòÉ 2.4. Drawing ΓòÉΓòÉΓòÉ
Drawing
Since PM clips the output of any window to the rectangle defining the window, I
couldn't use printf() for output, since it knows nothing of these rules imposed
by the UI. However, one must be able to output something, and since graphics
are not allowed in text mode, I decided to limit myself to two functions:
vwDrawText() and vwFillRect(). These two deviate from their counterparts in
that they do not accept an HPS as the first parameter, and they use the window
rectangle as the maximum clipping region, which can be reduced using the
appropriate parameter. Because these functions do not perform any black-magic,
per se, they will not be discussed, but you are encouraged to look at the
source for them to be sure you understand what they are doing. It should be
noted that these functions are one of the very few that actually write anything
to the screen; these use the VIO subsystem, as documented in the 1.3
Programmer's Reference.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume 3,
Issue 1
ΓòÉΓòÉΓòÉ 2.5. Cursors ΓòÉΓòÉΓòÉ
Cursors
Cursors in PM are something that not many people use unless they are writing
their own general-purpose window classes, yet they are an integral part of PM.
Since our drawing in VIOWIN is limited to textual information, we cannot
support the wide-range of options in the WinCreateCursor() function, but we can
provide enough functionality to allow the creation and manipulation of a
blinking underline cursor. This could probably be expanded to block cursors as
well, but I was lazy.
It is important to note that a cursor is clipped and can be visible or not.
These two states are completely independent of each other, so you should resist
the urge to wrap them both up in a single flag. I initially did this and then
found to my chagrin that the following sequence of events will produce a result
inconsistent with what should happen:
1. Move the cursor outside of the window so that it is clipped
2. Hide the cursor
3. Move the cursor inside of the window again
Having a single flag for both clipping and visibility results in the cursor
being shown after step 3 although it is clearly obvious that it shouldn't be.
VIOWIN provides four functions for cursor support: vwCreateCursor(),
vwDestroyCursor(), vwShowCursor(), and vwQueryCursorInfo(). These all behave
much like their counterparts.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume
3, Issue 1
ΓòÉΓòÉΓòÉ 2.6. Source Code ΓòÉΓòÉΓòÉ
Source Code
The complete source for the base library is provided in viowin.zip. Of course,
the library is useless without the classes, but it is helpful to have
nonetheless. The archive contains the following source files:
File Contents
VIOWIN.C Miscellaneous functions.
VWCLASS.C Class functions.
VWCURS.C Cursor functions.
VWDRAW.C Drawing functions.
VWMSG.C Message functions.
VWRECT.C Rectangle functions.
VWRES.C Resource functions.
VWTIMER.C Timer functions.
VWUTIL.C Utility functions used internally by the library.
VWWND.C Window functions.
The provided makefile can be used to compile the library. IBM's C-Set++
compiler was used; you may have to make modifications to the makefile in order
to use another compiler.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume
3, Issue 1
ΓòÉΓòÉΓòÉ 2.7. Next Month ΓòÉΓòÉΓòÉ
Next Month
That's it for the base library! Next month, we will begin by looking at our
first window class - the button class - and how it is implemented. Any
comments or suggestions will be quite welcome.
The Design and Implementation of VIOWIN: Part 5 - EDM/2 - Jan 1995 - Volume 3,
Issue 1
ΓòÉΓòÉΓòÉ 3. RMX-OS2: An In-Depth View (Part 1) ΓòÉΓòÉΓòÉ
ΓòÉΓòÉΓòÉ 3.1. Introduction ΓòÉΓòÉΓòÉ
RMX-OS2: An In-Depth View (Part 1)
Written by Johan Wikman
Introduction
This is the first in a series of articles where I am going to describe ReMote
eXecution for OS/2 - RMX-OS2, or simply RMX. In this first article I am only
going to give an overview of RMX, but in the articles to follow - which I will
do my best to provide at a pace of one per month - I will dig into details and
present some stuff you'll find interesting (I hope :-).
RMX-OS2: An In-Depth View (Part 1) - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 3.2. Remote Execution ΓòÉΓòÉΓòÉ
Remote Execution
I've been using and programming for OS/2 ever since version 1.1. At the same
time I have also used various flavors of Unix and hence also the X Windowing
System.
X and PM are essentially pretty much alike: they provide an API with which
graphical applications can be written. In one respect, however, X differs
radically from PM (and most other windowing systems for that matter) as it
allows applications to run remotely. That is, the application can run on one
computer but the user can use it on another computer. The two computers can
reside anywhere on a network, if necessary in different buildings or even in
different countries.
This is something that OS/2 and PM does not support: an application must run
on the same computer where it is used. Yes, applications can, of course, be
explicitly split into client and a server parts where the two parts can run on
different computers (e.g. database applications), but you cannot take an
arbitrary PM application and run it on one computer and use it on another.
Running PM applications remotely is what RMX is all about.
Why would you want to do that then? Well:
1. Remote execution allows you to run an application on the most appropriate
(powerful) computer on the network, yet interact with the application
where it is most convenient.
2. Instead of being forced to have n powerful computers for n people, you
can have 1 powerful computer, where resource hungry applications are run,
and n - 1 less powerful (and much cheaper) computers that are used as
display servers for remote applications and for running ordinary
applications.
3. Once OS/2 for PowerPC is available you can run applications on a PowerPC,
yet use them on a cheap Intel.
4. It offers a convenient way for monitoring other computers.
5. It is simply a neat feature :-).
To be honest, the list above is slightly vapour as RMX currently is on beta
level and couldn't be used in a production environment. Nevertheless, the
functionality for providing the services in the list (except item 3 of course)
is there.
RMX-OS2: An In-Depth View (Part 1) - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 3.3. RMX in Practice ΓòÉΓòÉΓòÉ
RMX in Practice
Ok, so what does remote execution mean in practice? A PM application's
structure can schematically be pictured as:
Figure 1) Schematic picture of a PM application.
The application consists of application code that more or less frequently call
operating system and PM functions. All user interaction is handled through
calls to PM. If we for each call to PM instead...
1. make a packet out of the function arguments,
2. send the packet to another computer,
3. on the other computer extract the arguments from the packet,
4. execute the actual function,
5. make a packet out of the returned value,
6. send the packet back to the other computer,
7. extract the returned value from the packet, and
8. return the result back to the application
...the visual appearance and interaction of the application can be moved to
another computer.
Figure 2) Schematic picture of a RMX application.
In practice, each PM call (i.e., a call to a Win or Gpi function) is replaced
with the following pseudo code. We ignore for the moment exactly how that
replacing is done.
ReturnType WinFunction(arguments)
{
Copy all arguments to a transfer buffer
Send buffer to server
Read buffer from server (this call blocks until there is something to read)
Extract result
Return result to caller
}
The arguments of the function is simply copied into a buffer and sent over a
communications link to the server. On the server the arguments are extracted
and the actual function is executed.
void winFunction()
{
Read buffer from client
Extract arguments from buffer
Call actual PM function
Copy return value into buffer
Send buffer to client
}
The server reads the raw data, converts it into arguments of proper type and
calls the actual PM function. Essentially it is a question of transparently
turning local procedure calls (LPCs) into equivalent remote procedure calls
(RPCs). Seems rather trivial doesn't it? In practice, however, there some
rather interesting problems to be solved:
How can the functions be replaced without a need for a recompilation or
relink?
It is not only the application that calls PM functions, PM calls window
procedures of the application.
PM often reads resources from the executable. How should this be handled
when the actual executable is in another computer?
Arguments passed by value are trivial to handle, but what about pointers?
I'll return to these questions in a later article.
RMX-OS2: An In-Depth View (Part 1) - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 3.4. Design Requirements ΓòÉΓòÉΓòÉ
Design Requirements
When I started designing RMX - which actually is a part of my Master's Thesis -
I made a list of requirements that would have to be fulfilled if RMX was ever
to become an product people would use.
No recompilations - if somebody would suggest to me, "Hey, if you write your
application according to these fancy guidelines, then you'll get this neat
remote execution feature," I wouldn't even look at the stuff. Even a relink is
too much as it effectively means that only developers could use the product.
Hence, an absolute design requirement was that it should be possible to run any
executable remotely without a recompile or relink. (An observant reader
notices that I don't rule out patching :-).
Localized cost - of course there is a performance cost involved when
applications are run remotely and LPCs are replaced with RPCs. (However, this
applies only to threads that call PM; non-PM threads run at the full speed of
the CPU-server. The remote execution and the speed of the display-server do
not influence them at all.) That cost is acceptable as long as the added value
of remote execution in itself is bigger. However, it would be unacceptable if
you would have to pay for the remote execution mechanism also when you run the
application locally, i.e., when you run and use it on the same computer.
Any communications media - remote execution is ultimately a question of moving
data between a client and a server. The entire remote execution mechanism can
be built so that it does not depend on the media or actual low-level data
transfer mechanism used. Hence, RMX had to be designed so that the data
transfer mechanism can be replaced without a need for changes in RMX.
Optional security - remote execution opens a loophole in the security as it
allows remote applications to connect to a computer and start monitoring
keystrokes. In many environments a lack of security is not an issue; in others
it would prevent RMX from being used. The conclusion is that security is
needed, but it must be provided in such a way that different levels of security
can easily be supported.
Visual appearance - it should not be possible to detect any difference between
an application running remotely and an application running locally.
Simultaneous Use - it must be possible to run remote and local application
side-by-side.
So, those were some of the requirements I specified before I started designing
RMX.
RMX-OS2: An In-Depth View (Part 1) - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 3.5. Example ΓòÉΓòÉΓòÉ
Example
In the following I'll show you a concrete example of how RMX is used. The
basic requirement is two computers that are connected somehow. This example
assumes that we are using a network that supports named pipes.
Although RMX essentially does not care what mechanism is used for transferring
data between the client and server computers, it has to be told what mechanism
to use. That is done by specifying an environment variable:
set RMXCOMMS=RMXPIPE
The value of the variable should be the name of a DLL that provides certain
functionality (I'll tell exactly what in the next article). That variable
usually needs to be set only once - in CONFIG.SYS - but it is quite possible to
specify on a case by case basis what communications DLL to use.
An application must be marked (patched) before it can be run remotely. This has
to be done only once, and it does not influence the application's normal use
(apart from the requirement that certain DLLs of RMX must be present), and if
need be the application can be unpatched.
rmxpatch -p -d app.exe
I'll explain the flags and describe exactly what RMXPATCH does in a later
article.
Then we have the question of how to start a remote application. After all, it
will be running on a computer that may physically reside quite far from the
computer where we will use it. For that purpose there is RMXSTRTR.EXE and
RMXSTART.EXE. RMXSTRTR.EXE is a daemon application whose only responsibility is
to start remote applications upon requests from RMXSTART.EXE. Being a daemon
it is usually started when the CPU-server is booted.
detach rmxstrtr.exe
Before we can start a remote application that will appear on the display-server
we must start a server application that provides services to the remote
application. This is also something that normally is done when the computer is
booted.
start pmserver.exe
Now everything is set and we can start the remote application. Assume that
\\ODIN is the network name of the CPU-server and that \\LOKE is the name of the
display-server.
rmxstart \\LOKE \\ODIN app.exe
This command will start app.exe on the computer \\ODIN but the application will
appear on \\LOKE. Note, in the normal case this last step is the only thing
that is needed in order to start a remote application.
RMX-OS2: An In-Depth View (Part 1) - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 3.6. Conclusion ΓòÉΓòÉΓòÉ
Conclusion
Ok, so that was a brief introduction to RMX. In the articles that follow I
will go a lot deeper and provide a lot more details. As I haven't written
those articles yet, I don't know exactly what they will contain, but the
following list shows roughly what I will cover.
Low level transfer - as mentioned, the low-level transfer mechanism of data
between the remote application and the display server is completely outside
RMX. In this article I will thoroughly describe the mechanism along with a
detailed description of the current implementation that relies on named pipes.
Based on this article it should be possible to write an implementation for
TCP/IP, for example.
Marking applications for remote execution - basically any 32-bit PM application
can be marked for remote execution. In this article I will describe how it is
done.
Starting remote applications - RMXSTRTR.EXE and RMXSTART.EXE provide the means
for starting an application on a remote computer. In this article I'll
describe exactly what they do and how they do it.
Protocol - when data is transferred between two processes a protocol is needed.
That is also the case in RMX.
Turning LPCs into RPCs. - basically remote execution is a question of turning
certain LPCs into equivalent RPCs. In this article I will describe how that is
done for the OS/2 PM API.
Threads - quite a few PM program use threads and obviously they must be
supported as well. How are tightly coupled threads in in two separate
processes managed?
Performance - replacing LPCs with RPCs means in the context of RMX that the
performance of the display updating will suffer. Fortunately, there are
measures with which the perfomance penalty can be reduced.
Security - RMX offers a possibility for adding a certain level of security. In
this article I will describe how a security DLL can be written.
The only thing I guarantee about this list is that the next article will be
about the low-level transfer. Apart from that, the items on the list and their
order may change.
As I mentioned, I developed RMX as part of my Master's Thesis. If you can't
wait for the articles, drop me a note and I'll mail the thesis to you. Being a
thesis it is more general than this article series will be, but on the other
hand it also contains material that I won't include in the articles.
If you want to give RMX a try, keep an eye on hobbes.nmsu.edu. I'll will upload
the first proper beta-release real-soon-now :-). Drop me a note if you want me
to notify you when that happens.
RMX-OS2: An In-Depth View (Part 1) - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4. /dev/EDM/BookReview ΓòÉΓòÉΓòÉ
ΓòÉΓòÉΓòÉ 4.1. Introduction ΓòÉΓòÉΓòÉ
/dev/EDM2/BookReview
Written by Carsten Whimster
Introduction
/dev/EDM2/BookReview is a monthly column which focuses on development oriented
books and materials. The column is from a beginning PM programmer, but
intermediate REXX programmer's eyes. Pick up whichever book strikes your
fancy, and join the growing group of people following our PM programming
columns. I will review books aimed at beginners for a while, and then move on
from there.
Please send me your comments and thoughts so that I can make this column as
good as possible. All mail gets read and responded to.
Designing OS/2 Applications is not a normal programming book. In fact, it talks
very little about programming, and a lot about designing programs, as might be
expected from its title. If that sounds a little cryptic, read on...
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4.2. Errata ΓòÉΓòÉΓòÉ
Errata
This month is a month of corrections. I obviously try to be accurate and fair,
but recently I made a couple of minor blunders:
In last month's review I criticized Charles Petzold's new book for using
"Windows graphics" in some of the figures. Of course it wasn't Windows
graphics, but rather OS/2 1.x graphics which happen to look identical. This is
a hangover from the first version of the book. One reader told me that the new
version is very similar to the old version, and that there is hardly any new
material, just some updates. If you can live with this (which means little, if
any, 2.1+ material), then I still recommend this book for its thoroughness.
Even further back, I managed to miss the WPS coverage in Anthony Rudd's
Application Development Using OS/2 REXX. When I looked closer, it actually
covered almost as much as the REXX Reference Summary Handbook, so I have
changed its rating in WPS from "No Coverage" to "Introductory Coverage", which
is now the same for both. The handbook covers a little more, but it is less
tutorial, so they end up about the same.
Well, with that off my chest...
I have rearranged the Content Index in a more logical order, and created a new
table called SYSTEM AND DESIGN BOOKS to suit books like this one, and other
non-programming books for programmers. At the moment, the first two tables are
near identical in layout, but that will change over time. In any case,
comparing programming books with design books doesn't make any sense, and the
separate tables reinforce that.
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4.3. Designing OS/2 Applications ΓòÉΓòÉΓòÉ
Designing OS/2 Applications
Designing OS/2 Applications is a unique type of book. It does not attempt to
teach you how to program, but rather how to design programs, or how to think
about programming. These are the chapter titles:
1. OS/2 as an End-User Platform
2. Why Program for OS/2?
3. OS/2 as a Development Platform
4. Good Programs Have Good Up-Front Design
5. OS/2 Kernel Architecture
6. Presentation Manager, Graphics, and the User Interface
7. Features for Your Application
8. Application Structure
9. Block Design and Architecture
10. Designing the User Interface
11. Where's the Beef?
12. The Development Environment
13. Prototyping the User Interface
14. Building the Core Functions
15. Using Advanced Functions
16. Non-English-Language Support
17. Base Tuning
18. Visual Tuning
19. Testing Methodology
20. Code Change
21. Designing the Installation Program
22. Appendix A: Summary and Conclusions
23. Appendix B: Bibliography
In addition to this layout, the chapters are divided into sections as follows:
1. Why OS/2? - chapters 1 through 3
2. Overall Application Design - chapters 4 through 8
3. Use Building Blocks or Your App Will Crumble - chapters 9 through 11
4. Making It Happen - chapters 12 through 16
5. Performance - chapters 17 and 18
6. Testing and Code Changes - chapters 19 and 20
7. Installation Programs - chapter 21
I will concentrate on the sections, rather than the chapters, since the
divisions between the chapters are much fuzzier than in actual programming
books.
Section I explains the advantages of OS/2 over other platforms. This is
explained both from an end-user's point of view, as well as from the
programmer's point of view. We all know the advantages of pre-emptive
multi-tasking, multi-threading, a flat 32-bit address space, device
independence, the object-oriented interface (WPS), DDE, virtual memory,
paging, swapping, drag-and-drop, and a consistent user interface (CUA). These
are all elaborated on. In addition, the API is touted as an advantage, both
with respect to power, and also with respect to the (theoretical) portability
of it. Third, the advantages of OS/2 as a development platform are outlined,
and include crash protection (tm), multi-tasking, and debugging support.
Section II is a large section, which outlines the overall application design
theory and procedures. The importance of good, solid, up-front design are
stressed over and over again. Examples of poor design practices are listed,
and their faults explained. Proper design techniques are carefully explained.
One funny quote which is a favorite of the author's is "There's never enough
time to do it right the first time, but there's always time to do it over".
This is so true! It doesn't take long thinking about the various products on
the market to come up with concrete examples of this. Even large
multi-platform companies with huge resources seem to think that if they
release a suite of programs quickly, and then fix it later, it will gain a
large, devoted user base. Wrong! Doing it wrong the first time loses a
developer a lot of potential respect, which is replaced by suspicion and
mistrust. Finally, the 60% design/30% code/10% test rule is introduced, and
the logic behind it is explained.
Starting in chapter 5, an overview of the inner workings of OS/2 is given,
beginning with the kernel, and proceeding through to the Presentation Manager,
The GPI, and the WPS. This section is important in that it gives those of us
who don't yet own a copy of The Design of OS/2 an insight into what goes on
behind the scenes. Following that, there is a section which explains what
features are available to programmers, on a purely conceptual level. Again,
this is very helpful, since it is hard to know what is available when you
haven't done much OS/2 programming. Then again, even if you had, there are
enough additions from version to version that keeping up with all the new
features would be difficult. Each feature available is explained in terms of
advantages and disadvantages, and intended use.
Application structure is the next stop on the journey, with device
independence featured prominently up front, closely followed by modular design
and using threads. Multi-process applications are also discussed, along with
some reasons that you probably shouldn't use them, unless you can't do it any
other way. DLLs, code sharing, resource sharing, and synchronization are all
stops along our merry way, and the chapter finishes with a mini lecture on
upgradability, portability, and serviceability concerns.
The next section discusses modularization in much greater detail. Reich
presents his idea of design (which is tempered by years of writing for OS/2,
so listen up), starting with the overall design accomplished by taking a
black-box approach to your app. The user interface is the next stop along the
design path, and CUA, data presentation, and window controls are all lightly
visited. Dialogs are paid a slightly longer visit, application defaults and
CASE tools are discussed. The Workplace Shell is treated particularly well,
as is fitting. The various levels of integration with the WPS are discussed,
and the ways of accomplishing them (in theoretical detail) are presented. I
particularly liked this chapter, and learned a lot about things that I only
had a vague idea about before. Core functions are discussed next, and
modularization, memory management, device drivers, application layout, file
system support, EXEs versus DLLs, INI files and multiprocess applications are
all revisited in greater detail than last time.
Making it Happen is the title of section IV. Practical decisions are the main
focus here, such as the choice of development environment, tools, source code
revision systems, and so on. Writing the code for the user interface is next,
and the pros and cons of using separate threads to do things like painting
your window are presented. Prototyping the interface is also a good way to
check the validity of your design, since only a little code needs to be
written to allow "walking through" your application. Self-verification steps
are common in this book, and allow you to get a better feel for whether you
are on the right track with your application design or not. Multi-threading
the interface is discussed in great depth at this point, and ways of keeping
the user interface responsive are presented, while keeping the code
manageable.
The next chapter deals with setting up the core function of your program
properly. Again, multi-threading is discussed, and semaphores are
re-introduced as one way of sharing resources safely.
Note: the example on semaphores and deadlock is, strictly-speaking,
inaccurate. I quote: "You can see there are three threads. Threads 1 and 2
make use of semaphore A. Threads 2 and 3 make use of semaphore B, and threads
1 and 3 make use of semaphore C. No two threads make use of the same
resources, but you can see that if thread 1 has semaphore A, thread 2 has
semaphore B, and thread 3 has semaphore C, any semaphore request by any of the
three will cause a deadlock." In fact, if, say, thread 1 requests semaphore
C, it is still possible for the three threads to complete as follows: thread
1 requests semaphore C, and locks. Thread 2 requests semaphore A, and locks.
Thread 3 finishes with semaphore C, releases it, requests semaphore B, and
locks. Thread 1 can now get semaphore C, and run to completion, releasing
semaphore A and C. Now thread 2 can get semaphore A, and run to completion,
releasing semaphore A and B. Finally, thread 3 gets semaphore B, and runs to
completion. In fact, any sequence of events will complete, which has one
thread giving up a semaphore before requesting another. If all three threads
needed two semaphores at the same time, and each acquired one, then any
further requests causes deadlock. This is slightly different than the
statement of the problem, but it is significant. I imagine this is what was
meant.
Critical sections are introduced next, as a still safer way to share
resources. The large expense of critical sections is explained, however,
emphasizing that if other designs are possible, they should be pursued.
The next topic is IPC. Various mechanisms, such as queues, pipes, and shared
memory are explored. Data formats, file formats, and file system dependency
is discussed, including LANs. Advanced functions come next in the ASCII
stream of the book. Getting the basic user interface and functionality into
code has been the priority so far, but now is the time to add the advanced
features that you want your application to have. It is good to do this long
before adding the advanced functions, partly because of the reluctance to
change something major after you have added lots of code. As Reich points
out, if you add the simple stuff first, changes are easier to make because
they don't make for much longer development cycles. DDE, printing, fonts, and
the help facility come under this heading. Non-English language support is
another, frequently overlooked item on the long list of things to look for.
It is very easy to do, when done right, and extremely tedious when done wrong.
How you can do it right the first time is carefully explained.
The next section deals with performance tuning. Many little neat performance
tricks are presented, such as minimizing fix-up costs, accessing DLLs
intelligently, thread priorities, EXE packing, and DLL placement. User
interface speed is also discussed in some detail.
The penultimate section deals with testing and changing code. These two
chapters are short, sweet, and use common sense, so I will leave them out
here.
The final section is on installation programs, and this happens to be a pet
peeve of mine. Frequently, you pick up some really neat program, but get
frustrated trying to install it correctly. In my opinion, a decent
installation procedure should include instructions on how to install manually,
in case the installation program fails. This is obviously difficult to do in
the case of something as complex as OS/2 itself. With the types of programs
that most of us write, however, it should be a breeze. In addition,
reinstalling and uninstalling are mentioned.
There is a brief summary following this, which concludes the book.
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4.4. Summary ΓòÉΓòÉΓòÉ
Summary
Designing OS/2 Applications is a different kind of book than anything else I
have reviewed so far. It is theoretical in nature, and avoids actual code as
much as possible. Instead, it concentrates on teaching the proper design
principles needed to create a new OS/2 application. As such, in many ways it
is much more valuable and important than a "mere" programming book, but it
sacrifices programming detail to do this. If you have ever wanted to know how
to go about designing and creating an OS/2 application, get this book. Once
you need to know about the nuts and bolts of programming, you'll have to look
elsewhere, however.
I like this book very much, yet there are a number of small areas that could be
addressed.
The few examples that are in the book are in C. Much of the material is
inherently bound to C programming, as well. For example, talking about the
message implementation in OS/2 doesn't make much sense in VX-REXX or PM-Cobol.
Because this inherent bias is there, I would like to see it be more explicit
and upfront. The alternative would be to abstract the material away from C
even more than it is, but I think it would be more workable to simply state
that 99% of all OS/2 programming is done in C, and that therefore there will be
a C bias in the examples. Even C++ programming is quite different, and many of
the topics covered in the book become irrelevant when programming in C++.
Some parts of the book have a vague feel to them, perhaps due to the fact that
the author tried to avoid a language bias. Specifically, the earlier parts
read slowly, and there is a fair amount of repetition. I do not mean that the
book is difficult or tedious to read, merely that it is sometimes slow going.
Tightening up the earlier parts might help a bit.
Of course, the semaphore and deadlock example should be reworded.
There are some OS/2 2.1+ features that warrant mentioning. This book has been
around for a bit, but a newer book is currently being written, and hopefully
this information will be included there.
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4.5. Books Reviewed ΓòÉΓòÉΓòÉ
Books Reviewed
ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
ΓöéBOOK ΓöéAUDIENCE ΓöéMARKΓöéCOMMENTS Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéReal-World Programming for OS/2 ΓöéIntermediateΓöéB+ ΓöéLots of good code examples, but Γöé
Γöé2.1, Blain, Delimon, and English, Γöéto Advanced Γöé Γöésometimes it is too complex for Γöé
ΓöéSAMS Publishing. ISBN ΓöéPM C Γöé Γöénovices. Accurate. Well organized. Γöé
Γöé0-672-30300-0. US$40, CAN$50. Γöéprogrammers Γöé ΓöéThe index needs a little beefing up. Γöé
Γöé Γöé Γöé ΓöéGood, but not entirely complete how-to Γöé
Γöé Γöé Γöé Γöéreference. Good purchase. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéLearning to Program OS/2 2.0 ΓöéBeginning PMΓöéB- ΓöéThis book can be both frustrating and Γöé
ΓöéPresentation Manager by Example, ΓöéC Γöé Γöévery rewarding. It is not very large, Γöé
ΓöéKnight, Van Nostrand Reinhold. ΓöéProgrammers Γöé Γöéand a bit pricey, but has some Γöé
ΓöéISBN 0-442-01292-6. US$40, Γöé Γöé Γöéexcellent chapters on certain beginningΓöé
ΓöéCAN$50. Γöé Γöé Γöétopics, such as messages, resources, Γöé
Γöé Γöé Γöé ΓöéIPF, and dialog boxes. Strictly for Γöé
Γöé Γöé Γöé Γöébeginners. This book has only one Γöé
Γöé Γöé Γöé Γöé(large) sample program! Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéWriting OS/2 2.1 Device Drivers inΓöéAdvanced C ΓöéA- ΓöéThe only thing a device driver Γöé
ΓöéC, 2nd Edition, Mastrianni, Van ΓöéProgrammers,Γöé Γöéprogrammer would not find in here is Γöé
ΓöéNostrand Reinhold. ISBN Γöéfamiliar Γöé Γöéhow to write SCSI, ADD, and IFS Γöé
Γöé0-442-01729-4. US$35, CAN$45. Γöéwith Γöé Γöédrivers. Most everything else is in Γöé
Γöé Γöéhardware Γöé Γöéhere, along with skeleton examples. AnΓöé
Γöé Γöéprogramming Γöé Γöéoptional DevHlp library of C-callable Γöé
Γöé Γöé Γöé Γöéfunctions can be purchased by those whoΓöé
Γöé Γöé Γöé Γöédon't have time to write their own. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéOS/2 Presentation Manager GPI, ΓöéIntermediateΓöéC+ ΓöéThis book needs updating for OS/2 2.x. Γöé
ΓöéWinn, Van Nostrand Reinhold. ISBN Γöéto advanced Γöé ΓöéIt is a well-written in-depth coverage Γöé
Γöé0-442-00739-6. US$35, CAN$45. ΓöéPM C Γöé Γöéof the OS/2 way of programming for Γöé
Γöé Γöéprogrammers Γöé Γöégraphics. It is not an introductory PMΓöé
Γöé Γöé Γöé Γöéor graphics programming book. You Γöé
Γöé Γöé Γöé Γöéshould know the basics of PM Γöé
Γöé Γöé Γöé Γöéprogramming already. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéThe Art of OS/2 2.1 C Programming,ΓöéBeginning ΓöéB+ ΓöéThis is a great introductory PM Γöé
ΓöéPanov, Salomon, and Panov, ΓöéOS/2 and PM Γöé Γöéprogramming book. It covers basic OS/2Γöé
ΓöéWiley-QED. ISBN 0-471-58802-4. Γöéprogrammers Γöé Γöéissues like threads before it jumps Γöé
ΓöéUS$40, CAN$50. Γöé Γöé Γöéinto PM programming. The coverage is Γöé
Γöé Γöé Γöé Γöéquite thourough, with just enough Γöé
Γöé Γöé Γöé Γöéreference material to make it useful Γöé
Γöé Γöé Γöé Γöéafter you read it through the first Γöé
Γöé Γöé Γöé Γöétime. The upcoming revised edition Γöé
Γöé Γöé Γöé Γöéshould be a killer. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéMastering OS/2 REXX, Gargiulo, ΓöéIntermediateΓöéB ΓöéThis book is very easy to understand. Γöé
ΓöéWiley-QED. ISBN 0-471-51901-4. ΓöéOS/2 users Γöé ΓöéIf you program with any regularity, Γöé
ΓöéUS$40, CAN$50. Γöéand Γöé Γöélook elsewhere, but if you need an Γöé
Γöé Γöébeginning Γöé Γöéeasily read, well-explained beginner's Γöé
Γöé Γöéprogrammers Γöé Γöébook, look no further. Some more Γöé
Γöé Γöé Γöé Γöédetailed, and complex real-world Γöé
Γöé Γöé Γöé Γöéexamples might be useful as you learn Γöé
Γöé Γöé Γöé Γöéthe material. Good coverage of REXX's Γöé
Γöé Γöé Γöé Γöécapabilities. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéREXX Reference Summary Handbook, ΓöéBeginning toΓöéA ΓöéThis little handbook is packed full of Γöé
ΓöéGoran, C F S Nevada. ISBN Γöéadvanced Γöé Γöéuseful information. Includes chapters Γöé
Γöé0-9639854-1-8. US$20, CAN$25 ΓöéREXX Γöé Γöéon both built-in and some popular Γöé
Γöé Γöéprogrammers Γöé Γöécommercial libraries. Well-written andΓöé
Γöé Γöé Γöé Γöécomprehensively indexed. A must for Γöé
Γöé Γöé Γöé ΓöéREXX programmers. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéApplication Development Using OS/2ΓöéIntermediateΓöéA- ΓöéExcellent coverage of everything REXX, Γöé
ΓöéREXX, Rudd, Wiley-QED. ISBN Γöéto advanced Γöé Γöéwith the occasional sparse section. It Γöé
Γöé0-471-60691-X. US$40, CAN$50 ΓöéREXX Γöé Γöéis a decent reference book, and has Γöé
Γöé Γöéprogrammers Γöé Γöéenough unusual material that it will Γöé
Γöé Γöé Γöé Γöéprobably find its way into many REXX Γöé
Γöé Γöé Γöé Γöéprogrammers' libraries. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéOS/2 Presentation Manager ΓöéBeginning PMΓöéA- ΓöéThis book has the most thorough Γöé
ΓöéProgramming, Petzold, Ziff-Davis ΓöéC Γöé Γöéintroduction to PM basics in any book IΓöé
ΓöéPress. ISBN 1-56276-123-4. Γöéprogrammers Γöé Γöéhave read so far. It leaves the field Γöé
ΓöéUS$30, CAN$42 Γöé Γöé Γöéwide open for a more thorough advanced Γöé
Γöé Γöé Γöé ΓöéPM book later. Very well written, veryΓöé
Γöé Γöé Γöé Γöéthorough, and very understandable. OnlyΓöé
Γöé Γöé Γöé Γöéa lack of in-depth treatment of controlΓöé
Γöé Γöé Γöé Γöéwindows and common dialog boxes keep itΓöé
Γöé Γöé Γöé Γöéfrom being perfect. Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéDesigning OS/2 Applications, ΓöéAll ΓöéA ΓöéThis book is about design, and making Γöé
ΓöéReich, John Wiley & Sons. ISBN Γöéprogrammers Γöé Γöéintelligent decisions in this process. Γöé
Γöé0-471-58889-X. US$35, CAN$45 Γöé Γöé ΓöéIt describes the OS/2 programming Γöé
Γöé Γöé Γöé Γöéenvironment well, and thus helps you Γöé
Γöé Γöé Γöé Γöémake the proper choices in designing Γöé
Γöé Γöé Γöé Γöéapplications. Highly recommended to Γöé
Γöé Γöé Γöé Γöéanyone creating more than just Γöé
Γöé Γöé Γöé Γöécommand-line tools and very small Γöé
Γöé Γöé Γöé Γöéprograms. Γöé
ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
This table contains all books I have reviewed, so that you can find what you
are looking for at a glance. I will be careful to rate books fairly. If I
feel a need to adjust ratings, I will adjust all of them at the same time, and
write a note explaining why I felt this necessary. Please note that books
aimed at different audiences should only be compared with great care, if at
all. I intend to concentrate on the strong points of the books I review, but I
will point out any weaknesses in a constructive manner.
LEGEND:
BOOK: The name of the book, author(s), publishing company, ISBN, and
approximate price.
AUDIENCE: This is a description of the audience I think the book targets best.
This is not intended as gospel, just a guideline for people not familiar with
the book.
MARK: My opinion of the success of the book's presentation, and how well it
targets its audience. Technical content, accuracy, organization, readability,
and quality of index all weigh heavily here, but the single most important item
is how well the book covers what it says it covers. Many books try to cover
too much, and get a lower mark as a result.
ΓöîΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
ΓöéA+ ΓöéGround-breaking, all-around outstanding book Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéA ΓöéExcellent book. This is what I want to see happen a lot Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéA- ΓöéExcellent book with minor flaws Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéB+ ΓöéVery good book with minor flaws or omissions Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéB ΓöéGood book with some flaws and omissions Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéB- ΓöéGood book, but in need of improvement Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéC+ ΓöéMediocre book with some potential, but in need of some updating Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéC ΓöéMediocre book with some good sections, but badly in need of fixing Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéC- ΓöéMediocre book, little good material, desperately in need of an overhaul Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéD ΓöéDon't buy this book unless you need it, and nothing else exists Γöé
Γö£ΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéF ΓöéDon't buy this book. Period Γöé
ΓööΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
COMMENTS: This is a very brief summary of the review proper.
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4.6. Content Index ΓòÉΓòÉΓòÉ
Content Index
This Content Index is designed to let you find the book that covers the topics
you need to learn about. It will eventually have a lot of categories, with
each book being rated along each row. These tables will be quite large, and
will continually grow, so please give me your feedback regarding what
categories you would like to see, and which you don't. It may take me a while
to flesh them out, so have a little patience.
Note: books which cover the same material can look similar in this table, but
be different in real life. The style of a book, for example, can not be seen
from a quick table, so make sure that you follow up by reading the reviews of
the books you find here. Finally, be sure that the books you are comparing are
aimed at the same audiences.
PM BOOKS:
ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
ΓöéBOOK ΓöéMARK ΓöéKernel ΓöéDevice ΓöéVIO andΓöéPM ΓöéGPI ΓöéFonts ΓöéPrint Γöé
Γöé Γöé ΓöéBasics ΓöéDriver ΓöéAVIO ΓöéIntro Γöé Γöé Γöé Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéRWP ΓöéB+ Γöé2 Γöé0 Γöé0 Γöé4 Γöé4 Γöé4 Γöé3 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéPME ΓöéB- Γöé1 Γöé0 Γöé0 Γöé2 Γöé2 Γöé2 Γöé0 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéODD ΓöéA Γöé0 Γöé5 Γöé0 Γöé0 Γöé1 Γöé0 Γöé1 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéGPI ΓöéC+ Γöé0 Γöé0 Γöé0 Γöé0 Γöé5 Γöé2 Γöé3 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéTAO ΓöéB+ Γöé3 Γöé2 Γöé1 Γöé4 Γöé1 Γöé2 Γöé0 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéPMP ΓöéA- Γöé1 Γöé0 Γöé1 Γöé5 Γöé3 Γöé4 Γöé2 Γöé
ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
SYSTEM AND DESIGN BOOKS:
ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
ΓöéBOOK ΓöéMARK ΓöéKernel ΓöéDevice ΓöéVIO andΓöéPM ΓöéThreadsΓöéGPI ΓöéFonts ΓöéPrint Γöé
Γöé Γöé Γöé ΓöéDriver ΓöéAVIO Γöé Γöé Γöé Γöé Γöé Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéDOA ΓöéA Γöé4 Γöé4 Γöé2 Γöé4 Γöé5 Γöé3 Γöé2 Γöé3 Γöé
ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
REXX BOOKS:
ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
ΓöéBOOK ΓöéMARK ΓöéREXX ΓöéWPS ΓöéReferenceΓöé
Γöé Γöé ΓöéIntro Γöé Γöé Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéMOR ΓöéB Γöé4 Γöé0 Γöé2 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéRSH ΓöéA Γöé1 Γöé2 Γöé5 Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéADO ΓöéA- Γöé3 Γöé2 Γöé4 Γöé
ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
BOOK LEGEND:
ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
ΓöéReal-World Programming for OS/2 2.1 ΓöéRWP Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéLearning to Program OS/2 2.0 Presentation Manager by Example ΓöéPME Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéWriting OS/2 2.1 Device Drivers in C, 2nd Edition ΓöéODD Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéOS/2 Presentation Manager GPI ΓöéGPI Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéThe Art of OS/2 2.1 C Programming ΓöéTAO Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéMastering OS/2 REXX ΓöéMOR Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéREXX Reference Summary Handbook ΓöéRSH Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéApplication Development Using OS/2 REXX ΓöéADO Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéOS/2 Presentation Manager Programming ΓöéPMP Γöé
Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
ΓöéDesigning OS/2 Applications ΓöéDOA Γöé
ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
RATINGS LEGEND:
ΓöîΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
Γöé0ΓöéNo coverage Γöé
Γö£ΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
Γöé1ΓöéVery light coverage Γöé
Γö£ΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
Γöé2ΓöéIntroductory coverage Γöé
Γö£ΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
Γöé3ΓöéGood Coverage Γöé
Γö£ΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
Γöé4ΓöéIn-depth coverage Γöé
Γö£ΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
Γöé5ΓöéAuthoritative Γöé
ΓööΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 4.7. Coming Up ΓòÉΓòÉΓòÉ
Coming Up
I am running a little low on books at the moment, but there is relief in sight.
Next month I may be looking at OS/2 Presentation Manager GPI, 2nd edition,
Winn. The following are the books I intend to review, in no particular order.
OS/2 Presentation Manager GPI, 2nd edition, Winn
OS/2 Unleashed, Moskowitz and Kerr
The Design of OS/2, 2nd Edititon, Kogan and Deitel
Designing High Powered OS/2 Applications, Reich (tentative title)
I am considering reviewing the IBM OS/2 Redbooks, since they are readily and
cheaply available, and look like good reference.
If anyone has a book they want to see reviewed, I will be happy to oblige.
Just mail me and tell me. Publishers can send me books at the address on my
personal page at the end of the magazine, and I will review all OS/2
development-related and advanced user books I receive.
/dev/EDM2/BookReview - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 5. C++ Corner ΓòÉΓòÉΓòÉ
ΓòÉΓòÉΓòÉ 5.1. Introduction ΓòÉΓòÉΓòÉ
C++ Corner
Written by Gordon Zeglinski
Introduction
Having a large collection of C++ objects, I was motivated to see if and how I
could use these objects within a SOM object. To keep things nice and familiar,
let's use the profile (INI) file manipulation objects as our test case.
C++ Corner - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 5.2. Using C++ Objects in SOM ΓòÉΓòÉΓòÉ
Using C++ Objects in SOM
In the second SOM article, we compared SOM and C++ versions of objects designed
to manipulate profile files. In each of these objects we went to the OS/2 API
to access the profile file. This time, the SOM object will use the C++ object
to manipulate the profile file.
The hardest part of this task is determining how to define things in a manner
that SOM will accept. Utilizing structures from other languages in SOM seems
somewhat cumbersome to me. Pointer types are not supported by CORBA, which
makes sense given the cross platform nature of CORBA. Ideally, we want some
way of storing a pointer to the instance of the C++ object within our SOM
object. Recall that in the IDL file, when you declare an instance of a SOM
object within another object, that instance is accessed through a pointer in
the C/C++ bindings. Also in SOM, you can declare an object "type" without
defining it's body. What if we declared an object type and then later included
C++ headers that defined a C++ object as the formentioned "object type"?
Using this idea, we create the following IDL file.
interface ProfileFile;
interface SOM_CPPini : SOMObject
{
typedef unsigned long ULONG;
typedef sequence<char> buffType;
void OpenFile(in string FileName);
ULONG GetError();
unsigned long GetHandle();
void SetHandle(in unsigned long H);
void WriteString(in string App,in string Key, in string String);
// write a string
void WriteData(in string App, in string Key,in buffType Buff,in ULONG BLen);
// write the Buffer
void WriteInt(in string App,in string Key,in long Num);
// write an "int"
ULONG GetDataSize(in string App,in string Key);
// return the lenght of the data
void GetData(in string App,in string Key,in buffType Buff, inout ULONG BufMax);
// return the data in Buff
ULONG GetString(in string App,in string Key,in buffType Buff,in ULONG BufMax, \
in string DefArg);
// return the String in Buff, defaults to DefArg if App/Key not present
ULONG GetStringNoDef(in string App,in string Key,in buffType Buff,in ULONG BufMax);
// return the String in Buff
long GetInt(in string App,in string Key,in long DefArg);
// return the "int" in App/Key or the DefArg if App/Key not present
long GetIntNoDef(in string App,in string Key);
// return the "int" in App/Key
#ifdef __SOMIDL__
implementation
{
ProfileFile INIFile;
releaseorder: GetHandle,SetHandle,GetError,OpenFile, \
WriteString,WriteData,WriteInt,GetDataSize,GetData,GetString,GetStringNoDef, \
GetInt,GetIntNoDef;
callstyle=oidl;
filestem = somcpp;
somInit: override; // initialize instance variables to 0
somUninit: override; // just for fun
passthru C_xh_after= "#define INCL_WINSHELLDATA" \
"#include <os2.h>" \
"#include \"iniflobj.h\"";
};
#endif /* __SOMIDL__ */
};
The line interface ProfileFile; declares a "SOM object" with the same name as
the "C++ Object" which manipulates the profile files. This object name is then
used within the SOM object definition to declare an instance of ProfileFile.
The passthru section of the SOM object definition, is used to include the C++
header files that declare the C++ object, ProfileFile. The C++ SOM bindings
allow SOM and C++ objects to be intermixed without any major syntax
differences. Following is the source code for MAIN.CPP.
void main(){
int i;
SOM_CPPini *Prf=new SOM_CPPini;
Prf->OpenFile("Test.ini");
Prf->WriteInt("App","Key",10);
i=Prf->GetIntNoDef("App","Key");
printf("i= %i\r\n",i);
delete Prf;
}
The new operator is used to create an instance of the SOM object, SOM_CPPini.
Thereafter, the -> operator is used to access its member functions. Following
is a snippet of code from the file SOMCPP.CPP.
SOM_Scope void SOMLINK OpenFile(SOM_CPPini *somSelf, string FileName)
{
SOM_CPPiniData *somThis = SOM_CPPiniGetData(somSelf);
SOM_CPPiniMethodDebug("SOM_CPPini","OpenFile");
if(somThis->INIFile)
delete somThis->INIFile;
somThis->INIFile=new ProfileFile(FileName,0);
}
SOM_Scope SOM_CPPini_ULONG SOMLINK GetError(SOM_CPPini *somSelf)
{
SOM_CPPiniData *somThis = SOM_CPPiniGetData(somSelf);
SOM_CPPiniMethodDebug("SOM_CPPini","GetError");
/* Return statement to be customized: */
{ SOM_CPPini_ULONG retVal;
if(somThis->INIFile)
retVal=somThis->INIFile->GetError();
else
retVal=1;
return (retVal); }
}
Remember that somThis->INIFile is a pointer to an instance of a C++ object.
Outside of the new ProfileFile(FileName,0); statement, the instantizing the C++
and SOM objects is the same. This difference is due to the different way SOM
and C++ handle constructors. Methods are called using the same syntax. This
allows for a fairly consistent style when mixing C++ and SOM objects.
C++ Corner - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 5.3. Wrapping Things Up ΓòÉΓòÉΓòÉ
Wrapping Things Up
Although a fairly simple example was presented here, we have seen that C++ and
SOM objects can be intermixed within a program and still maintain good
readability. C++ objects can be used as data members of SOM objects to provide
lower level support for the SOM methods. This type of interoperability allows
one to exploit each OOP model for it's unique features. C++ is still faster
than SOM, but SOM provides a much richer environment. In future articles, we
will look at DSOM and the new 2.1 SOM toolkit.
C++ Corner - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 6. Introduction to PM Programming ΓòÉΓòÉΓòÉ
ΓòÉΓòÉΓòÉ 6.1. Introduction ΓòÉΓòÉΓòÉ
Introduction to PM Programming
Written by Larry Salomon, Jr.
Introduction
The purpose of this column is to provide the readers out there who are not
familiar with PM application development the information necessary to satisfy
their curiosity, educate themselves, and give them an advantage over the
documentation supplied by IBM. Of course, much of this stuff could probably be
found in one of the many books out there, but the problem with books in general
is that they don't answer the questions you have after you read the book the
first time through.
I will gladly entertain feedback from the readers about what was "glossed over"
or what was detailed well, what tangential topics need to be covered and what
superfluous crap should have been removed. This feedback is essential in
guaranteeing that you get what you pay for. <grin>
It should be said that you must not depend solely on this column to teach you
how to develop PM applications; instead, this should be viewed as a supplement
to your other information storehouses (books, the network conferences, etc.).
Because this column must take a general approach, there will be some topics
that you would like to see discussed that really do not belong here. Specific
questions can be directed to me via email and I will do my best to answer them
in a timely fashion.
Last Month
Last month, we began looking at the WC_LISTBOX class. This month, we will take
a good look at the ownerdraw capabilities of this control class.
Introduction to PM Programming - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 6.2. A Message For You, Sir ΓòÉΓòÉΓòÉ
A Message For You, Sir
Each month before I write the next installment of this column, I re-read what I
wrote the prior month to discover what I have covered in order to determine in
what direction I should continue. As I read last month's column, it became
apparent that the message reference which I capitulated each month is nothing
more than a rehash of what's available in many sources, including the on-line
programming references and many books. I would like to discontinue my
inclusion of this information, given this enlightening of mine, unless the
teeming masses tell me that I should do otherwise. Any feedback on this would
be appreciated.
Introduction to PM Programming - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 6.3. This Isn't Picasso ΓòÉΓòÉΓòÉ
This Isn't Picasso
But ownerdraw listboxes give you quite an opportunity to do some interesting
things. For the original LaMail product from IBM, I wrote a LaGrep utility
which searched mail folders for text. The found text was displayed in a
listbox in a different color than the rest. Additionally, the configuration
options allowed to you change the color that the text was displaying using, and
the color selection was displayed in a listbox with the name of the color next
to it. Both of these are perfectly valid, real-world examples of ownerdraw
listboxes, and while there might be other window classes better suited for
these tasks, knowing how the ownerdraw capabilities work is a useful asset to
have tucked in your cap.
The ownerdraw architecture with regard to listboxes is represented by two
messages, which - incidentally - are used in ownerdraw menuitems in a very
similar fashion. These messages are the WM_MEASUREITEM and WM_DRAWITEM and
their purpose is just as their names suggest. The former message is sent,
usually upon the creation of the listbox, to determine the maximum height and
(if LS_HORZSCROLL) maximum width of the items to be displayed. The result is
returned to the listbox as MRFROM2SHORT(height,width). The latter message is
where all of the work is done and is sent whenever an item needs to be redrawn.
PVOIDFROMMP(mpParm2) points to an OWNERITEM structure, but you won't find its
definition in the listbox section of PMWIN.H. You have to look in the menu
section to find it, which is the following:
typedef struct _OWNERITEM {
HWND hwnd;
HPS hps;
ULONG fsState;
ULONG fsAttribute;
ULONG fsStateOld;
ULONG fsAttributeOld;
RECTL rclItem;
LONG idItem;
ULONG hItem;
} OWNERITEM, *POWNERITEM
hwnd is the handle of the control. hps is the handle to the presentation space
which must be used for drawing. fsState and fsStateOld are, when the structure
refers to an ownerdraw listbox, BOOLs which are TRUE if the item is selected
and FALSE otherwise (fsStateOld is the selection state of the item the last
time it was drawn). fsAttribute and fsAttributeOld are not used when dealing
with ownerdraw listboxes. rclItem is the bounding rectangle of the item to be
drawn. idItem is the index of the item to be drawn. hItem is the item handle,
if set.
It needs to be noted that, if the listbox is ownerdraw, PM will not do anything
on your behalf except paint the highlight state of the item to be drawn. It
does this using an XOR operation only if fsState and fsStateOld are different.
There is no way to change this unless you know that the OWNERITEM structure is
what the listbox checks upon return from this message when it determines if it
needs to highlight the item or not. So, if you set fsState and fsStateOld to
the same value before returning, PM will not do anything at all.
The nice thing about the first sentence in the last paragraph is that PM
doesn't even look at the item text for you. Thus, you could interpret the text
in a different way that would normally be done - for LaGrep, I changed the
color by putting a tab character in the text followed by a BYTE which was an
index into an array of CLR_* constants. When I painted the control, I did not
draw this special sequence but used it to control the drawing.
The possibilities are endless and are only limited by your imagination.
Introduction to PM Programming - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 6.4. API of the Month Club ΓòÉΓòÉΓòÉ
API of the Month Club
Our API of the month is the one that the listbox uses to XOR the highlight of
an item.
(BOOL)WinInvertRect(HPS hpsWnd,PRECTL prclRect);
hpsWnd is the handle to the HPS to invert within. prclRect points to the
rectangle specifying the area to be inverted. Inversion here refers to the
inversion of the colors within the rectangle. Thus, black becomes white, white
becomes black, etc.
Introduction to PM Programming - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 6.5. Next Month ΓòÉΓòÉΓòÉ
Next Month
I need to get upon my soapbox for a moment.
As I looked through the past issues to see where this column has gone already,
in order to determine what shall be discussed next, I saw that, much to my
embarrassment, the listbox window class has already been discussed. Yet, this
is the third month in my second treatment of the topic and I never would have
known because the silence from my audience is deafening. The embarrassment is
not what I am worried about; I am instead concerned about providing a quality
column, yet no one bothered to tell me that I was simply rehashing a topic that
was discussed just a few months prior.
Please give me feedback! How else can I say it? I need to know what you
think, where we should go next, etc. Since I have always considered the
button, entryfield, and listbox classes to be the "simple" classes, it is more
important now because I need to know what class should be discussed next.
Should it be the menu, or the static? Should it be the scrollbar, or the
titlebar? Please let me know; this humble request alone I make.
Introduction to PM Programming - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 7. Contributors to this Issue ΓòÉΓòÉΓòÉ
Are You a Potential Author?
We are always looking for (new) authors. If you have a topic about which you
would like to write, send a brief description of the topic electronically to
any of the editors, whose addresses are listed below, by the 15th of the month
before the month in which your article will appear. This alerts us that you
will be sending an article so that we can plan the issue layout accordingly.
After you have done this, get the latest copy of the Article Submission
Guidelines from ftp.cdrom.com in the /pub/os2/2_x/program/newsltr directory.
(The file is artsub.zip.) The completed text of your article should be sent to
us no later than five days prior to the last day of the month; any articles
received after that time may be pushed to the next issue.
The editors can be reached at the following email addresses:
Larry Salomon - os2man@panix.com (Internet).
Carsten Whimster - bcrwhims@undergrad.math.uwaterloo.ca (Internet).
The following people contributed to this issue in one form or another (in
alphabetical order):
Larry Salomon, Jr.
Carsten Whimster
Johan Wikman
Gordon Zeglinski
Network distributors
Contributors - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 7.1. Larry Salomon, Jr. ΓòÉΓòÉΓòÉ
Larry Salomon, Jr.
Larry Salomon, Jr. wrote his first Presentation Manager application for OS/2
version 1.1 in 1989. Since that time, he has written numerous VIO and PM
applications, including the Scramble applet included with OS/2 and the
I-Brow/Magnify/Screen Capture trio being distributed by IBM with the
Professional Developers Kit CD-ROM. Currently, he works for Cheyenne Software
in Roslyn, New York and resides in Bellerose, New York with his wife Lisa.
Larry can be reached electronically via the Internet at os2man@panix.com.
Contributors - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 7.2. Carsten Whimster ΓòÉΓòÉΓòÉ
Carsten Whimster
Carsten is an undergraduate Computer Science student at the University of
Waterloo. He is currently in third year, and is enjoying it immensely. He
uses Watcom C/C++ 10.0 and Watcom VX-REXX 2.0b.
Carsten is the author of some commandline utilities and POV-Panel/2, a popular
shareware dashboard-like front-end for the POV-Ray 2.x compilers. POV-Panel/2
can be found on ftp-os2.cdrom.com in pub/os2/32bit/graphics and some of the
other major OS/2 ftp sites. He is also a TEAM-OS/2 member, and has adopted a
little computer store called The Data Store in Waterloo, Ontario.
You may reach Carsten...
...via email:
bcrwhims@undergrad.math.uwaterloo.ca - Internet
...Web homepage (I am just setting it up, so it may or may not be on-line):
http://www.undergrad.math.uwaterloo.ca/~bcrwhims - WWW
...via snail mail (notice the changed address):
Carsten Whimster
318A Spruce Street
Waterloo, Ontario
Canada
N2L 3M7
Contributors - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 7.3. Johan Wikman ΓòÉΓòÉΓòÉ
Johan Wikman
Johan Wikman received his Master's degree in Computer Science with a thesis
"Adding remote execution capability to operating systems". He has been
programming for OS/2, using C++, ever since 1990.
Currently he works for Nokia Telecommunications where he takes part in a
project that developes network management software in a Unix environment. In
his sparetime he continues working on RMX-OS2, a system that provides remote
execution for OS/2.
Johan can be reached electronically via the Internet at
johan.wikman@ntc.nokia.com, or via ordinary mail:
Johan Wikman
Smedjeviksvagen 23 B 22
FI-00200 Helsinki
FINLAND
Contributors - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 7.4. Gordon Zeglinski ΓòÉΓòÉΓòÉ
Gordon Zeglinski
Gordon Zeglinski is a freelance programmer/consultant who received his Master's
degree in Mechanical Engineering with a thesis on C++ sparse matrix objects.
He has been programming in C++ for 6 years and also has a strong background in
FORTRAN. He started developing OS/2 applications with version 2.0 .
His current projects include a client/server communications program that
utilitizes OS/2's features which has entered beta testing. Additionally, he is
involved in the development of a "real-time" automated vehicle based on OS/2
and using C++ in which he does device driver development and designs the
applications that comprise the control logic and user interface.
He can be reached via the Internet at zeglins@cc.umanitoba.ca.
Contributors - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 7.5. Network distributors ΓòÉΓòÉΓòÉ
Network Distributors
These people are part of our distribution system to provide EDM/2 on networks
other than the Internet. Their help to provide access to this magazine for
others is voluntary and we appreciate them a lot!
Paul Hethmon (hethmon@apac.ag.utk.edu) - Compuserve
Gess Shankar (gess@knex.mind.org) - Internet
Jason B. Tiller (PeerGynt@aol.com) - America On-line
David Singer (singer@almaden.ibm.com) - IBM Internal
Andre Asselin (ASSELIN AT RALVM12) - IBM Internal
If you would like to become a "network distributor", be sure to contact the
editors so that we can give you the credit you deserve!
Contributors - EDM/2 - Jan 1995 - Volume 3, Issue 1
ΓòÉΓòÉΓòÉ 8. How Do I Get EDM/2? ΓòÉΓòÉΓòÉ
How Do I Get EDM/2?
EDM/2 can be obtained in any of the following ways:
On the Internet
All back issues are available via anonymous FTP from the following sites:
- ftp.cdrom.com in the /pub/os2/2_x/program/newsltr directory.
- ftp.luth.se in the /pub/os2/programming/newsletter directory.
- generalhq.pc.cc.cmu.edu in the /pub/newsletters/edm2 directory.
The EDM/2 mailing list. Send an empty message to edm2-info@knex.mind.org
to receive a file containing (among other things) instructions for
subscribing to EDM/2. This is a UUCP connection, so be patient please.
IBM's external gopher/WWW server in Almaden. The address is
index.almaden.ibm.com and it is in the "Non-IBM-Originated" submenu of
the "OS/2 Information" menu; the URL is
"gopher://index.almaden.ibm.com/1nonibm/os2nonib.70".
On Compuserve
All back issues are available in the OS/2 Developers Forum 2.
IBM Internal
IBM's internal gopher/WWW server in Almaden. The address is
n6tfx.almaden.ibm.com and it is in the "Non-IBM-Originated Files" menu;
the URL is "gopher://n6tfx.almaden.ibm.com/1!!nonibm/nonibm.70".
IBM's REQUEST command on all internal VM systems. Enter the VM command
REQUEST LIST FROM ASSELIN AT RALVM12 and a list of the requestable
packages will be sent to you; in this list are the names of the packages
containing the EDM/2 issues.
How do I Get EDM/2? - EDM/2 - Jan 1995 - Volume 3, Issue 1