Delphi 中的 C 工会
C Unions in Delphi
我想翻译 winnt.h
中的一些类型定义,其中包含一些与位域的联合。然而,这是正确的做法吗?我特别不确定 _TP_CALLBACK_ENVIRON_V3
.
中的联合
typedef struct _UMS_SYSTEM_THREAD_INFORMATION {
ULONG UmsVersion;
union {
struct {
ULONG IsUmsSchedulerThread : 1;
ULONG IsUmsWorkerThread : 1;
} DUMMYSTRUCTNAME;
ULONG ThreadUmsFlags;
} DUMMYUNIONNAME;
} UMS_SYSTEM_THREAD_INFORMATION, *PUMS_SYSTEM_THREAD_INFORMATION;
typedef struct _TP_CALLBACK_ENVIRON_V3 {
TP_VERSION Version;
PTP_POOL Pool;
PTP_CLEANUP_GROUP CleanupGroup;
PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
PVOID RaceDll;
struct _ACTIVATION_CONTEXT *ActivationContext;
PTP_SIMPLE_CALLBACK FinalizationCallback;
union {
DWORD Flags;
struct {
DWORD LongFunction : 1;
DWORD Persistent : 1;
DWORD Private : 30;
} s;
} u;
TP_CALLBACK_PRIORITY CallbackPriority;
DWORD Size;
} TP_CALLBACK_ENVIRON_V3;
type
UMS_SYSTEM_THREAD_INFORMATION = record
UmsVersion: ULONG;
ThreadUmsFlags: ULONG;
case Integer of
0:(IsUmsSchedulerThread : ULONG);
1:(IsUmsWorkerThread : ULONG);
end;
PUMS_SYSTEM_THREAD_INFORMATION = ^UMS_SYSTEM_THREAD_INFORMATION;
TP_CALLBACK_ENVIRON_V3 = record
Version: TP_VERSION;
Pool: PTP_POOL;
CleanupGroup: PTP_CLEANUP_GROUP;
CleanupGroupCancelCallback: PTP_CLEANUP_GROUP_CANCEL_CALLBACK;
RaceDll: PVOID;
ActivationContext: PACTIVATION_CONTEXT; // Pointer
FinalizationCallback: PTP_SIMPLE_CALLBACK;
case Flags: DWORD of
1: (LongFunction: DWORD)
1: (Persistent: DWORD)
30: (Private: DWORD)
end;
CallbackPriority: TP_CALLBACK_PRIORITY;
Size: DWORD;
end;
PTP_CALLBACK_ENVIRON = ^TP_CALLBACK_ENVIRON_V3;
那些: something
符号是位域。没有直接的 Pascal 等价物。
但是,由于三个位域组合起来是一个完整的双字,因此等效项的一般轮廓如下所示:
type
_TP_CALLBACK_ENVIRON_V3 = record
...
FinalizationCallback: PTP_SIMPLE_CALLBACK;
case Integer of
1: (Flags: DWord);
2: (LongFunctionPersistentPrivate: DWord)
end;
如前所述,“:”符号是位域。没有直接的解决方案,但有一种简单的方法来翻译它们,使它们再次有用。请参阅描述此内容的文章。它使用一组简单的函数来获取或设置多个位并将它们移动到位,并使用一种巧妙的方式(我没有发明它,顺便说一句)使用相当未知的 属性 索引来声明它们。
这个想法来自Stack Overflow answer。
FWIW,该文章还描述了 how to handle unions 此类翻译。
我想翻译 winnt.h
中的一些类型定义,其中包含一些与位域的联合。然而,这是正确的做法吗?我特别不确定 _TP_CALLBACK_ENVIRON_V3
.
typedef struct _UMS_SYSTEM_THREAD_INFORMATION {
ULONG UmsVersion;
union {
struct {
ULONG IsUmsSchedulerThread : 1;
ULONG IsUmsWorkerThread : 1;
} DUMMYSTRUCTNAME;
ULONG ThreadUmsFlags;
} DUMMYUNIONNAME;
} UMS_SYSTEM_THREAD_INFORMATION, *PUMS_SYSTEM_THREAD_INFORMATION;
typedef struct _TP_CALLBACK_ENVIRON_V3 {
TP_VERSION Version;
PTP_POOL Pool;
PTP_CLEANUP_GROUP CleanupGroup;
PTP_CLEANUP_GROUP_CANCEL_CALLBACK CleanupGroupCancelCallback;
PVOID RaceDll;
struct _ACTIVATION_CONTEXT *ActivationContext;
PTP_SIMPLE_CALLBACK FinalizationCallback;
union {
DWORD Flags;
struct {
DWORD LongFunction : 1;
DWORD Persistent : 1;
DWORD Private : 30;
} s;
} u;
TP_CALLBACK_PRIORITY CallbackPriority;
DWORD Size;
} TP_CALLBACK_ENVIRON_V3;
type
UMS_SYSTEM_THREAD_INFORMATION = record
UmsVersion: ULONG;
ThreadUmsFlags: ULONG;
case Integer of
0:(IsUmsSchedulerThread : ULONG);
1:(IsUmsWorkerThread : ULONG);
end;
PUMS_SYSTEM_THREAD_INFORMATION = ^UMS_SYSTEM_THREAD_INFORMATION;
TP_CALLBACK_ENVIRON_V3 = record
Version: TP_VERSION;
Pool: PTP_POOL;
CleanupGroup: PTP_CLEANUP_GROUP;
CleanupGroupCancelCallback: PTP_CLEANUP_GROUP_CANCEL_CALLBACK;
RaceDll: PVOID;
ActivationContext: PACTIVATION_CONTEXT; // Pointer
FinalizationCallback: PTP_SIMPLE_CALLBACK;
case Flags: DWORD of
1: (LongFunction: DWORD)
1: (Persistent: DWORD)
30: (Private: DWORD)
end;
CallbackPriority: TP_CALLBACK_PRIORITY;
Size: DWORD;
end;
PTP_CALLBACK_ENVIRON = ^TP_CALLBACK_ENVIRON_V3;
那些: something
符号是位域。没有直接的 Pascal 等价物。
但是,由于三个位域组合起来是一个完整的双字,因此等效项的一般轮廓如下所示:
type
_TP_CALLBACK_ENVIRON_V3 = record
...
FinalizationCallback: PTP_SIMPLE_CALLBACK;
case Integer of
1: (Flags: DWord);
2: (LongFunctionPersistentPrivate: DWord)
end;
如前所述,“:”符号是位域。没有直接的解决方案,但有一种简单的方法来翻译它们,使它们再次有用。请参阅描述此内容的文章。它使用一组简单的函数来获取或设置多个位并将它们移动到位,并使用一种巧妙的方式(我没有发明它,顺便说一句)使用相当未知的 属性 索引来声明它们。
这个想法来自Stack Overflow answer。
FWIW,该文章还描述了 how to handle unions 此类翻译。