Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Handle Access Rights - Verständnisfrage (https://www.delphipraxis.net/157355-handle-access-rights-verstaendnisfrage.html)

Delphi-Laie 9. Jan 2011 11:04

Handle Access Rights - Verständnisfrage
 
Hallo Delphifreunde!

Mal wieder stelle ich eine entscheidende Oberflächlichkeit im mikroweichen Entwicklernetzwerk (MSDN) fest, und zwar geht es um die SetThreadAffinityMask Function. Dort steht

„This handle must have the THREAD_SET_INFORMATION or THREAD_SET_LIMITED_INFORMATION access right and the THREAD_QUERY_INFORMATION or THREAD_QUERY_LIMITED_INFORMATION access right. For more information, see Thread Security and Access Rights.

Windows Server 2003 and Windows XP/2000: The handle must have the THREAD_SET_INFORMATION and THREAD_QUERY_INFORMATION access rights.“

Wie löst man die "and"s and "or"s logisch auf? Ab Windows Vista wäre die 1:1-Umsetzung so:

Code:
SetThreadAffinityMask(OpenThread((THREAD_SET_INFORMATION or Thread_Query_Information) and (THREAD_QUERY_INFORMATION or THREAD_QUERY_LIMITED_INFORMATION),
                                  true,
                                  ThreadID),
                      ThreadAffinityMask)
Doch das funktioniert nicht, der Rückgabewert zeigt das an. Außerdem stellte ich fest, daß für „Windows davor“ die Erläuterung „The handle must have the THREAD_SET_INFORMATION and THREAD_QUERY_INFORMATION access rights“ auch nicht 1:1 umsetzbar ist, denn:

Code:
SetThreadAffinityMask(OpenThread(THREAD_SET_INFORMATION and Thread_Query_Information,true,ThreadID),ThreadAffinityMask)
funktioniert nämlich nach meiner Beobachtung nicht, sondern nur:

Code:
SetThreadAffinityMask(OpenThread(THREAD_SET_INFORMATION or Thread_Query_Information,true,ThreadID),ThreadAffinityMask)
Weiß jemand, was genau gemeint ist?

Im voraus vielen Dank!

Mit Gruß

Delphi-Laie

Dezipaitor 9. Jan 2011 12:11

AW: Handle Access Rights - Verständnisfrage
 
Die "oder" und "und" Wörter im MSDN Text sind eine Wortart (Konjunktion) und haben nicht unbedingt dieselbe logische Aussagekraft, wie die Bitoperatoren in Delphi. Besonders aber hier ist, dass du nicht alle Bestandteile nutzen musst.
Mit
Zitat:

This handle must have the THREAD_SET_INFORMATION or THREAD_SET_LIMITED_INFORMATION access right and the THREAD_QUERY_INFORMATION or THREAD_QUERY_LIMITED_INFORMATION access right.
ist gemeint, dass du
entweder THREAD_SET_INFORMATION oder THREAD_SET_LIMITED_INFORMATION mit entweder THREAD_QUERY_INFORMATION oder THREAD_QUERY_LIMITED_INFORMATION mit Delphi-"or" verknüpfen sollst.
z.B.
"THREAD_SET_INFORMATION or THREAD_QUERY_INFORMATION"

Man benutzt dabei den Oder-Bitoperator "or", da er in der Bitmaske alle gesetzten Bits ("1") in das Ergebnis übernimmt, da 1 or 0 = 1, 0 or 1 = 1, 1 or 1 = 1. Mit "and" werden nur alle, bei beiden Konstanten gesetzten Bits übernommen, daher ist die Zugriffsmaske mehr einschränkend.

DeddyH 9. Jan 2011 13:25

AW: Handle Access Rights - Verständnisfrage
 
Zum besseren Verständnis: Effizientes Arbeiten mit Bitmasken

Assarbad 9. Jan 2011 13:36

AW: Handle Access Rights - Verständnisfrage
 
Zitat:

Zitat von Dezipaitor (Beitrag 1073404)
Die "oder" und "und" Wörter im MSDN Text sind eine Wortart (Konjunktion) und haben nicht unbedingt dieselbe logische Aussagekraft, wie die Bitoperatoren in Delphi.

Zumal hier eine entscheidende Unterscheidung in Delphi nicht vorhanden ist. In C/C++ und anderen Sprachen unterscheidet man zwichen bitweisen und logischen Operatoren. Die Entsprechung für "or" aus Delphi wäre dann im Kontext einer Abfrage üblicherweise (logischer Operator):

Code:
if (ausdruck || ausdruck2) { ... }
... wohingegen beim Kombinieren von Bits der bitweise Operator benutzt würde (ja, es geht auch kürzer, aber hier geht's um Verständnis):

Code:
ausdruck = ausdruck | ausdruck2;
Man kann zwar prinzipiell auch den bitweisen Operator für Abfragen mißbrauchen:

Code:
if (ausdruck | ausdruck2) { ... }
... darf sich dann aber je nach Kontext nicht über geändertes Laufzeitverhalten oder gar geänderte Logik wundern. Denn bei:

Code:
if (foo || bar || baz) ...
... werden die Checks schon abgebrochen wenn "foo" oder "foo || bar" wahr sind, wohingegen bei:

Code:
if (foo | bar | baz) ...
... alle Werte kombiniert werden und dann geguckt wird, ob sie Null oder nicht Null sind.

Delphi-Laie 9. Jan 2011 17:26

AW: Handle Access Rights - Verständnisfrage
 
Dank Euch dreien!

Nun, daß die Wortart „Konjunktion“ in der natürlichen Sprache dahintersteckt, war mir durchaus klar, und auch bekannt, welche Ergebnisse die gleichnamigen Logikoperatoren auf verschiedene Bitpaare haben.

Meinen Zweifel, daß man mikroweichs natürlichsprachliche (-sprachige?) Formulierung 1:1 in Programmierlogik übersetzen kann, sehe ich bestätigt, zumal es ja so auch nicht funktionierte.

Dezipaitor, Deinen Beitrag verstand ich beim ersten Lesen nicht, beim zweiten Lesen schon, danke!

Offensichtlich sind die „neueren“ Atrribute überhaupt nicht nötig, so daß ich mich frage, warum Mikroweich sie einführte.

Operatoren für Bitverknüpfungen kenne ich leider nicht, bin zu sehr dem Pascal verhaftet. Die Binärwerde der Zugriffsrechte legen allerdings nahe, daß sie intern jeweils ein eigenes Bit belegen.

Assarbad 9. Jan 2011 17:30

AW: Handle Access Rights - Verständnisfrage
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1073500)
Mikroweich

Sag doch konsequenterweise Winzigweich, dann ist's ganz eingedeutscht :zwinker:

Zitat:

Zitat von Delphi-Laie (Beitrag 1073500)
Operatoren für Bitverknüpfungen kenne ich leider nicht, bin zu sehr dem Pascal verhaftet. Die Binärwerde der Zugriffsrechte legen allerdings nahe, daß sie intern jeweils ein eigenes Bit belegen.

In Delphi wird dieser Unterschied ja auch nicht gemacht. Wenn man sich aber klarmacht, daß er existiert ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz