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 |