What's new?

www.thomas.goering.com

Sitemap
Eiffel Starter Pages

[ Tools ] [ OOSC | Eiffel | COM | Projects ] [ Personal ]

Download PGP

Druckfehler in 'COM' von Don Box

COM
Box, Don
'COM'
Addison-Wesley
ISBN 3-8273-1385-6

Das hervorragende Buch 'Essential COM' von Don Box liegt seit 1998 in einer deutschen Übersetzung vor. Don Box pflegt auf seiner Homepage eine Liste von Druckfehlern in der englischen Originalausgabe. Auch in der deutschen Ausgabe finden sich Druckfehler, die einerseits von der Originalausgabe 'übernommen' wurden, andererseits auch durch die Übersetzung entstanden sind. Um jedem Leser diese Druckfehler offenzulegen, habe ich diese Seite erstellt. Sie enthält alle bekannten Druckfehler in der deutschen Ausgabe des Buches 'COM' von Don Box, Addison-Wesley, 1. Auflage 1998.

Essential COM
Box, Don

'Essential COM'
Addison-Wesley
ISBN 0-201-63446-5

Die folgende Liste ist mittlerweile (fast) vollständig übersetzt und gegengeprüft. Falls Ihnen weitere Fehler bekannt sind, melden Sie sie mir bitte. Sie können mir dazu eine eMail schicken oder mein Feedback Formular benutzen. Falls der gemeldete Fehler auch die englische Originalausgabe betrifft, werde ich die Fehlermeldung an Don Box weiterleiten.

Auch Menschen machen Fehler! Die meisten der folgenden Fehler sind unbedeutende Tipp- oder Formatierungsfehler und sollten keinen Leser beim Verständnis des Buches behindern. Die Fehler auf Seite 238, 266, 291 und 303 sind da schwerwiegender und sollten beachtet werden.

Seite Kommentar / Fehler Gemeldet von
XIV Der Nachname von Craig Wittenberg schreibt sich nicht "W-h-i-t-t-e-n-b-e-r-g". Don Box
XXII Der Nachname von Craig Wittenberg schreibt sich nicht "W-h-i-t-t-e-n-b-e-r-g". George Reilly
XXIII Der Vorname von Henk de Koning schreibt sich nicht "K-e-n-k". Thomas Göring
13 Die 11. nicht-leere Zeile des ersten Code-Fragments lautet:
int FastStringItf::LengthItf(void) const

Es muß heißen:

int FastStringItf::Length(void) const {
Chris Hyams, Stephan Sas
44 Das erste Code-Fragment lautet:
virtual HRESULT __stdcall Method2(short arg1,
                                  short *p) = 0;

Es muß heißen:

virtual HRESULT __stdcall Method2(short arg1,
                                  short *parg2) = 0;

Diese Form ist nicht so verwirrend, weil der Parametername dem in der IDL-Definition entspricht.

Peter Zaborski
61 Der folgende Auszug ist aus dem fünften Textabsatz:

Bei der Klasse PugCat bedeutet dies, daß alle PugCat-Objekte einen vptr enthalten, der auf eine IPug-kompatible vtbl zeigt. PugCat-Objekte enthalten dagegen einen vptr, der auf eine zweite ICat-kompatible vtbl zeigt.

Es muß heißen:

Bei der Klasse PugCat bedeutet dies, daß alle PugCat-Objekte einen vptr enthalten, der auf eine IPug-kompatible vtbl zeigt. PugCat-Objekte enthalten auch einen vptr, der auf eine zweite ICat-kompatible vtbl zeigt.

Thomas Göring
68 In der Fußnote steht: "Neuere Ausgaben von C++-Report sind unter den Adressen...". Es muß heißen: "Diese C++-Report Artikel sind unter den Adressen...". George Reilly
84 Die 5. nicht-leere Zeile des dritten Code-Fragments lautet:
HRESULT pItf->UseIt(var);  // Variant-Wert verwenden

Es muß heißen:

HRESULT hr = pItf->UseIt(var); // Variant-Wert verwenden
Jonathan Pryor
87 Die 5. und 6. nicht-leeren Zeilen des ersten Code-Fragments lauten:
HRESULT GetErrorInfo([in] ULONG reserved, // kann null sein
                     [in] IErrorInfo **ppei);

Es muß heißen:

HRESULT GetErrorInfo([in] ULONG reserved, // kann null sein
                     [out] IErrorInfo **ppei);
Steve DeLassus
115 Die 1. nicht-leere Zeile des zweiten Code-Fragments lautet:
// Auszug aus unkwn.idl

Es muß heißen:

// Auszug aus unknwn.idl
Allan Drummond
132 Die 3. nicht-leere Zeile des ersten Code-Fragments lautet:
              IMoniker *pmkToLeft, IBindCtx *pbc,

Es muß heißen:

              IBindCtx *pbc, IMoniker *pmkToLeft,
Allan Drummond
132 Die 11. nicht-leere Zeile des ersten Code-Fragments lautet:
  HRESULT hr = pmkToLeft->BindToObject(0, pbc,

Es muß heißen:

  HRESULT hr = pmkToLeft->BindToObject(pbc, 0,
Timo Kettunen
139 Der folgende Auszug ist aus dem zweiten Absatz:

COM wartet dann eine Weile, bevor es diese nicht mehr verwendeten Server-DLLs aus dem Speicher entfernt, damit sichergestellt ist, daß ...

Es muß heißen:

COM wartet dann eine Weile, bevor es erlaubt, daß diese nicht mehr verwendeten Server-DLLs aus dem Speicher entfernt werden, um durch einen folgenden Aufruf von CoFreeUnusedLibraries sicherzustellen, daß ...

Der Originaltext war etwas vieldeutig.

AtulX Mohidekar
151 Die 5. nicht-leere Zeile des ersten Code-Fragments lautet:
T * dynamic_cast(const type_info& t = type_info(T) )

Auch wenn es nicht beabsichtigt ist, daß es gültiges C++ sein soll, ist folgendes semantisch klarer:

T * dynamic_cast(const type_info& t = typeid(T) )
Chris Hyams
166 Im Rechteck mit der Bezeichnung IXPlate-vptr in Abbildung 4-6 muß es IXPlane-vptr heißen. Joe Kidd
166 Abbildung 4-6 benutzt die Namen XICar, XIBoat und XIPlane. Der Code benutzt die Namen IXCar, IXBoat und IXPlane. Die Abbildung sollte die IX Form der Namen sowohl auf der linken Seite (wo die Interfacenamen dem Wort "vptr" vorangehen), als auch auf der rechten Seite (wo jeder Name "::GetMaxSpeed" vorangeht) verwenden, um dem Code zu entsprechen. Ted Neff
169 Die 1. nicht-leere Zeile des zweiten Code-Fragments lautet:
inline CarPlane::XCar::This(void) {

Es muß heißen:

inline CarPlane CarPlane::XCar::This(void) {
M. Rauchman
169 Die 1. nicht-leere Zeile des zweiten Code-Fragments lautet:
inline CarPlane::XPlane::This(void) {

Es muß heißen:

inline CarPlane CarPlane::XPlane::This(void) {
M. Rauchman
170 Die 6. nicht-leere Zeile des ersten Code-Fragments lautet:
    *ppv = static_cast<IBoat>(this);

Es muß heißen:

    *ppv = static_cast<IBoat*>(this);
Steve DaLassus
171 Die 3. nicht-leere Zeile des zweiten Code-Fragments lautet:
  if (m_res == 1) { // erstes AddRef

Es muß heißen:

  if (res == 1) { // erstes AddRef
Max Rubinstein
175 Die 18. nicht-leere Zeile des ersten Code-Fragments lautet:
    inline CarBoatPlane* This() { return m_pThis; }

Es muß heißen:

    inline CarBoat* This() { return m_pThis; }
Nariman Batlivala
175 Die 2. nicht-leere Zeile des zweiten Code-Fragments lautet:
                                  Void **ppv) {

Es muß heißen:

                                  void **ppv) {
Mirza Kanlic
176 Die 2. nicht-leere Zeile des zweiten Code-Fragments lautet:
  : m_cBoatRef(0), m_pThis(this) {

Es muß heißen:

  : m_cBoatRef(0), m_pThis(pThis) {
Bradey Honsinger
176 Die 2. nicht-leere Zeile des vierten Code-Fragments lautet:
  return InterlockedIncrement(&m_cRef);

Es muß heißen:

  return InterlockedIncrement(&m_cBoatRef);
Wei-Shen Yang
177 Die 2. nicht-leere Zeile des ersten Code-Fragments lautet:
  ULONG res = InterlockedDecrement(&m_cRef);

Es muß heißen:

  ULONG res = InterlockedDecrement(&m_cBoatRef);
Wei-Shen Yang
183 Die 3. nicht-leere Zeile des ersten Code-Fragments lautet:
class Bicycle: IBicycle

Es muß heißen:

class Bicycle: IBicycle {

Die geschweifte { fehlt.

Richard Grimes
186 Die drei Bezeichnungen in Abbildungen 4-8, die mit Car::XDUnknown:: beginnen, müssen mit Car::XNDUnknown:: beginnen, um dem Code zu entsprechen. Ted Neff
195 Es ist ungewiß, wie und wann Rentalthreading implementiert wird. Einen neuen Appartmenttyp einzuführen ist nicht die einzige Möglichkeit, aber als dieses Kapitel geschrieben wurde, schien es die wahrscheinlichste Lösung zu sein. Don Box
203 Die 13. nicht-leere Zeile des zweiten Code-Fragments lautet:
    printf((const char *)GlobalLock(hr));

Es muß heißen:

    printf((const char *)GlobalLock(hglobal));
Ted Neff
205 Die 8. nicht-leere Zeile des zweiten Code-Fragments lautet:
        IID_IRacer, (void**)&rpRacer,

Es muß heißen:

        IID_IRacer, (void**)&rpRacer);
Sunny Thomas
208 Die 3. nicht-leere Zeile des vierten Code-Fragments lautet:
  IStream *pStm REFIID riid, void **ppv) {

Es muß heißen:

  IStream *pStm, REFIID riid, void **ppv) {

Das Komma ist zwischen Los Angeles und 'Reading MA' verlorengegangen.

Vladan Vidakovic
210 Die ersten beiden Parameter von RegisterInterfaceInGlobal sind vertauscht. Die 5. und 6. nicht-leeren Zeilen lauten:
[in] REFIID riid,
[in, iid_is(riid)] IUnknown *pItf,

Es muß heißen:

[in, iid_is(riid)] IUnknown *pItf,
[in] REFIID riid,
Don Box
211 Die 8. nicht-leere Zeile des dritten Code-Fragments lautet:
                   IID_IRacer, pRacer, &g_dwCookie);

Es muß heißen:

                   pRacer, IID_IRacer, &g_dwCookie);
Todd Abel
214 Der unterste Schnittstellen-Stub in Abbildung 5-3 ist mit IVegetarian InterFace Stub falsch bezeichnet. Es muß IHairyObject Interface Stub heißen. Gardner von Holt
215 In Abbildung 5-4 müssen die drei untersten Channel-Objekte (auf der rechten Seite) mit IUnknown als ihrem implementierten, nicht-delegierenden (vertikalen) Interface bezeichnet werden und nicht mit IRpcProxyBuffer, wie in der Abbildung gezeigt. Anonymous
230 Der folgende Auszug ist aus dem dritten Textabsatz:

Wenn dies passiert, entdeckt der lokale OR schließlich den verstorbenen Prozeß und gibt all seine importierten Referenzen frei, wenn er die nächste Ping-Meldung an den OR des exportierenden Rechner schickt.

Es muß heißen:

Wenn dies passiert, entdeckt der lokale OR im Laufe der Zeit den verstorbenen Prozeß und entfernt seine importierten Referenzen von den folgenden Ping-Meldungen, was wiederum den OR des exportierenden Rechners dazu veranlaßt, die bestehenden Referenzen im Laufe der Zeit freizugeben.

Der Originaltext war etwas vieldeutig.

Anonymous
238 In Abbildung 5-7 fehlt zwischen CLSID und cb ein Feld, das die Größe der benutzerdefinierten Daten angibt. Siehe DCOM wire-Spezifikation für weitere Details. Don Box
239 Delegating to the standard marshaler from a subset of marshal contexts requires fairly esoteric backflips if you need to maintain identity. This should have been mentioned (at least) as a footnote. Anonymous
239 Ein Fehler in COM führt dazu, daß die IMarshal-Methoden fälschlicherweise mit MSHCTX_DIFFERENTMACHINE aufgerufen werden, auch wenn der Bestimmungskontext lokal ist. Es sollte eine Fußnote geben, die dies verdeutlicht. Ted Neff
240 Die 5. nicht-leere Zeile des ersten Code-Fragments lautet:
IMPLMENTS_UNKNOWN(Point)

Es muß heißen:

IMPLMENT_UNKNOWN(Point)
Ted Neff
243 Die 1. nicht-leere Zeile des dritten Code-Fragments lautet:
STDMETHODIMP Point::QueryInterface(REFIID riid, void **pp) {

Es muß heißen:

STDMETHODIMP Point::QueryInterface(REFIID riid, void **ppv) {
Ted Neff
244 Die 5. nicht-leere Zeile des ersten Code-Fragments lautet:
  Virtual ~LazyPoint(void)

Es muß heißen:

  virtual ~LazyPoint(void)
Ted Neff
247 Die 2. und 11. nicht-leeren Zeilen des ersten Code-Fragments benutzen die Methode:
RegisterObjectInGlobal

Die Methode heißt:

RegisterInterfaceInGlobal
Peter Liao
249 Die 21. nicht-leere Zeile des ersten Code-Fragments lautet:
#define GIP(Itf) GlobalInterfaceTable<Itf, &IID_##Itf>

Es muß heißen:

#define GIP(Itf) GlobalInterfacePointer<Itf, &IID_##Itf>
Peter Liao
251 Die 1. nicht-leere Zeile des zweiten Code-Fragments lautet:
STDMETHODIMP SafeRect::get_Volume(long *pn) {

Es muß heißen:

STDMETHODIMP SafeRect::get_Area(long *pn) {
George Reilly
266-
270
Alle Zeilen, die mit:
[HCKR\

beginnen, müssen mit:

[HKCR\

beginnen.

Christopher L. Akerley
266 Der folgende Auszug ist aus dem vierten Textabsatz:

Da Server, die mit älteren COM-Versionen als der von Windows NT 4.0 implementiert wurden, ihre AppIDs nicht explizit registrieren, erstellt COM automatisch eine neue AppID für diese alten Server. COM generiert AppIDs für diese alten Server, indem es automatisch den Eintrag AppID zu sämtlichen CLSIDs hinzufügt, die von einem bestimmten lokalen Server exportiert werden. COM verwendet dazu einfach die erste CLSID, die es bei einem bestimmten Server findet, als AppID.

Es muß heißen:

Da Server, die mit älteren COM-Versionen als der von Windows NT 4.0 implementiert wurden, ihre AppIDs nicht explizit registrieren, erstellen COM Konfigurationstools (z. B. DCOMCNFG.EXE, OLEVIEW.EXE) automatisch eine neue AppID für diese alten Server. Diese Tools generieren AppIDs für diese alten Server, indem sie automatisch den Eintrag AppID zu sämtlichen CLSIDs hinzufügen, die von einem bestimmten lokalen Server exportiert werden. DCOMCNFG und OLEVIEW verwenden dazu einfach die erste CLSID, die sie bei einem bestimmten Server finden, als AppID.

Der Originaltext erweckte den Eindruck, daß dies COM intern gemacht wurde.

Anonymous
269 Der folgende Auszug ist aus dem ersten Textabsatz:

Ungeachtet dessen, welcher Typ zur Erstellung eines Server-Prozesses verwendet wird, muß der Server-Prozeß innerhalb von 30 Sekunden das angeforderte Klassenobjekt mit Hilfe von CoRegisterClassObject registrieren.

Es muß heißen:

Ungeachtet dessen, welcher Typ zur Erstellung eines Server-Prozesses verwendet wird, muß der Server-Prozeß innerhalb von 120 Sekunden (oder 30 Sekunden unter Windows NT Service Pack 2 oder früher) das angeforderte Klassenobjekt mit Hilfe von CoRegisterClassObject registrieren.

Der Originaltext basierte auf der Service Pack 2 Implementierung.

Anonymous
272 Die 7. und 8. nicht-leeren Zeilen des ersten Code-Fragments lautet:
  RPC_C_AUTHN_GSS_KERBEROS
  RPC_C_AUTHN_MQ = 100          // MS Message Queue

Es muß heißen:

  RPC_C_AUTHN_GSS_KERBEROS,
  RPC_C_AUTHN_MQ = 100,         // MS Message Queue
Craig Randall
273 Die 9. nicht-leere Zeile des ersten Code-Fragments lautet:
  RPC_C_AUTHN_LEVEL_PRIVACY,      // Parameterstatus verschlüsseln

Es muß heißen:

  RPC_C_AUTHN_LEVEL_PKT_PRIVACY  // Parameterstatus verschlüsseln

Das PKT_ hat gefehlt, und das Komma war ohne Einfluß (aber legal).

George Reilly
276 Die 8. nicht-leere Zeile des ersten Code-Fragments lautet:
  RPC_C_IMP_LEVEL_IMPERSONATE = 2,

Es muß heißen:

  RPC_C_IMP_LEVEL_IMPERSONATE = 3,
George Reilly
278 Alle Zeilen, die mit:
[HCKR\

beginnen, müssen mit:

[HKCR\

beginnen.

Christopher L. Akerley
280 Der erste Satz des ersten Textabsatzes lautet: "Die ersten drei Parameter von ...". Es muß heißen: "Der zweite, dritte und vierte Parameter von ...". Steve DaLassus
282, 283 RPC_C_AUTHZ_NONE ist falsch geschrieben (dort steht: RPC_C_AUTHNZ_NONE). Jeff Prosise
282 Die 2. nicht-leere Zeile des zweiten Code-Fragments lautet:
  *rpSecretApe = 0;

Es muß heißen:

  rpSecretApe = 0;

Da die Variable schon eine C++ Referenz ist, ist eine Dereferenzierung nicht mehr nötig.

Don Box
282 Die 9. nicht-leere Zeile des zweiten Code-Fragments lautet:
    if (SUCCEEDED)

Es muß heißen:

    if (SUCCEEDED(hr))
George Reilly
283 Die 2. nicht-leere Zeile des zweiten Code-Fragments lautet:
  *rpSecretApe = 0;

Es muß heißen:

  rpSecretApe = 0;

Da die Variable schon eine C++ Referenz ist, ist eine Dereferenzierung nicht mehr nötig.

Don Box
283 Die 4. nicht-leere Zeile des zweiten Code-Fragments lautet:
    if (SUCCEEDED)

Es muß heißen:

    if (SUCCEEDED(hr)
George Reilly
290-
291
Alle Zeilen, die mit:
[HCKR\

beginnen, müssen mit:

[HKCR\

beginnen.

Christopher L. Akerley
290 Der folgende Auszug ist aus dem vierten Textabsatz:

Falls diese Registrierungseinträge nicht vorhanden sind, erstellt COM einen Sicherheitsbezeichner, der der Gruppe Administrators und den vordefinierten Benutzerkonten SYSTEM und INTERACTIVE Startberechtigungen einräumt.

Es muß heißen:

Falls diese Registrierungseinträge nicht vorhanden sind, verweigert COM für jeden die Startberechtigungen.

Der Originaltext war schlicht und einfach falsch.

Anonymous
291 Der folgende Auszug ist aus dem vierten Textabsatz:

Falls der Aufrufer für diesen Parameter einen Nullzeiger übergibt, läßt COM Aufrufe mit beliebigen Benutzerkennungen zu.

Es muß heißen:

Falls der Aufrufer für diesen Parameter einen Nullzeiger übergibt, führt COM bei eingehenden Aufrufen keinerlei Zugriffkontrollen durch. Dies läßt Aufrufe mit jeder berechtigten Benutzerkennung zu. Falls sowohl der Client, als auch der Server RPC_C_AUTHN_LEVEL_NONE angeben, erlaubt COM - unabhänigig von der Berechtigung - Aufrufe jeder Herkunft.

Der Originaltext war etwas vieldeutig.

Anonymous
294 Die 2. nicht-leere Zeile des zweiten Code-Fragments lautet:
  *rpac = 0;

Es muß heißen:

  rpac = 0;

Da die Variable schon eine C++ Referenz ist, ist eine Dereferenzierung nicht mehr nötig.

Steve DaLassus
294 Die 19. nicht-leere Zeile des zweiten Code-Fragments lautet:
TRUSTEE_IS_USER, L"System" },

Es muß heißen:

TRUSTEE_IS_USER, L"NT AUTHORITY\\SYSTEM" },
Don Box
298 Die 1. nicht-leere Zeile des zweiten Code-Fragments lautet:
HRESULT CoImpersonateClient(void); BOOL CoIsImpersonating(void);

Es muß heißen:

HRESULT CoImpersonateClient(void);

Es gibt keine CoIsImpersonating API-Funktion. Dies war ein Fehler beim 'Abschreiben'.

Steve DaLassus
301-
302
Alle Zeilen, die mit:
[HCKR\

beginnen, müssen mit:

[HKCR\

beginnen.

Christopher L. Akerley
303 Der folgende Auszug ist aus dem zweiten Textabsatz:

COM verwendet jedoch nach wie vor den Eintrag RunAs, um sicherzustellen, daß Prozesse keine CoRegisterClassObject-Aufrufe verfremden. Falls der NT-Dienst für die Ausführung mit dem vordefinierten Benutzerkonto SYSTEM konfiguriert ist, dann darf gemäß COM der Schlüssel AppId keinen RunAs-Wert aufweisen. Abhängig von der Konfiguration des NT-Dienstes, wird der Server-Prozeß entweder innerhalb der interaktiven Window-Station oder einer vordefinierten Window-Station ausgeführt, die von allen unter dem Benutzerkonto SYSTEM aufgeführten NT-Diensten gemeinsam genutzt wird. Ist der NT-Dienst dagegen für die Ausführung mit einem bestimmten Benutzerkonto konfiguriert, dann muß der Schlüssel AppId gemäß COM einen RunAs-Wert mit dem Namen des Benutzerkontos enthalten (zudem muß das korrekte Kennwort unter dem Schlüssel LSA gespeichert sein). Der NT-Dienstkontroll-Mananger startet diese Art von Diensten immer in einer neuen Window-Station, die diesem Server-Prozeß eigen ist.

Es muß heißen:

In diesem Fall ignoriert COM jedoch den Eintrag RunAs, um sicherzustellen, daß Prozesse keine CoRegisterClassObject-Aufrufe verfremden. Das Vorhandensein des Eintrags LocalService erfordert, daß der Aufrufer als NT-Dienst läuft. Falls der Dienst selbst so konfiguriert ist, daß er unter dem vordefinierten Benutzerkonto SYSTEM gestartet wird, läuft der Server-Prozeß entweder innerhalb der interaktiven Window-Station oder einer vordefinierten Window-Station, die von allen unter dem Benutzerkonto SYSTEM aufgeführten NT-Diensten gemeinsam genutzt wird (abhängig davon, wie der NT-Dienst konfiguriert ist). Ist der NT-Dienst dagegen für die Ausführung mit einem bestimmten Benutzerkonto konfiguriert, startet der NT-Dienstkontroll-Mananger den Dienst in einer neuen Window-Station, die diesem Server-Prozeß eigen ist.

Kurz gesagt: Gibt es einen LocalService Eintrag, ignoriert COM den RunAs Eintrag, schützt aber dennoch vor dem Verfremden (der CoRegisterClassObject-Aufrufe), nur anders, als es im Buch stand.

Anonymous
329 Die 3. nicht-leere Zeile des ersten Code-Fragments lautet:
  wcscpy(wcs, OLESTR("Hello"));

Es muß heißen:

  wcscpy(wsz, OLESTR("Hello"));
Steve DaLassus
341 Die 21. nicht-leere Zeile des einzigen Code-Fragments lautet:
[in, size_is(cNames)] LPOLESTR * rgszNames, method+params

Es muß heißen:

[in, size_is(cNames)] LPOLESTR * rgszNames, // method+params
Craig Randall
343 Die 1. nicht-leere Zeile des zweiten Code-Fragments lautet:
class PrimeManager: IPrimeManager {

Es muß heißen:

class PrimeManager: DIPrimeManager {

Damit der Name der vorangegangenen IDL-Definition entspricht.

Peter Liao
345 Die 1. nicht-leere Zeile des einzigen Code-Fragments lautet:
  void *pvThis = static_cast<IPrimeManager*>(this);

Es muß heißen:

  void *pvThis = static_cast<DIPrimeManager*>(this);

Damit der Name der vorangegangenen IDL-Definition entspricht.

Durgaprasad Gorti
357 Die 6. nicht-leere Zeile des dritten Code-Fragments lautet:
    hr = ptl->GetTypeInfoOfGuid(CLSID_Surfboard);

Es muß heißen:

    hr = ptl->GetTypeInfoOfGuid(CLSID_Surfboard, ppti);
Barry Klawans
373 Die 3. und 4. nicht-leeren Zeilen des ersten Absatzes verweisen auf die folgende URL:
http://www.develop.com/dbox/combook/sources

Es muß heißen:

http://www.develop.com/essentialcom
Don Box
407 Die 6. nicht-leere Zeile des einzigen Code-Fragments lautet:
                               CLSCTX_LOCAL_SERVER

Es muß heißen:

                               CLSCTX_LOCAL_SERVER,

Don hat das Komma 'verloren', als er den Text für das Buch formatiert hat.

Tony Vervilos


[Counting since 04-Feb-99]

KISSed Site - KISSfp FrontPage Add-On Last update: 25-Feb-99 - thomas@goering.commail-to

© Copyright 1998-1999 - Thomas Goering (Feedback)

We rated with RSACi!
Microsoft FrontPage Get Microsoft Internet Explorer