Delphi中的C联合

Delphi中的C联合,delphi,delphi-xe7,Delphi,Delphi Xe7,我想翻译winnt.h中的一些类型定义,其中包含一些带位字段的联合。然而,这是正确的做法吗?我对\u TP\u CALLBACK\u environment\u V3中的联盟尤其不确定 typedef结构系统线程信息{ 乌龙乌姆斯维森; 联合{ 结构{ ULONG IsUmsSchedulerThread:1; ULONG IsUmsWorkerThread:1; }DUMMYSTRUCTNAME; ULONG ThreadUmsFlags; }Dummy名称; }UMS系统线程信息,*PUMS

我想翻译
winnt.h
中的一些类型定义,其中包含一些带位字段的联合。然而,这是正确的做法吗?我对
\u TP\u CALLBACK\u environment\u V3
中的联盟尤其不确定

typedef结构系统线程信息{
乌龙乌姆斯维森;
联合{
结构{
ULONG IsUmsSchedulerThread:1;
ULONG IsUmsWorkerThread:1;
}DUMMYSTRUCTNAME;
ULONG ThreadUmsFlags;
}Dummy名称;
}UMS系统线程信息,*PUMS系统线程信息;
类型定义结构\u TP\u回调\u环境\u V3{
TP_版本;
PTP_池;
PTP_清理组清理组;
PTP_CLEANUP_GROUP_CANCEL_CALLBACK cleanupgroup cancelcallback;
PVOID;
结构\激活\上下文*激活上下文;
PTP_简单_回调终结回调;
联合{
德沃德旗;
结构{
德沃德函数:1;
德沃德:1;
德沃德·普列维:30;
}s;
}u;
TP_CALLBACK_PRIORITY CallbackPriority;
德沃德尺寸;
}TP_回调_环境_V3;

类型
UMS\u系统\u线程\u信息=记录
UMS版本:乌龙;
线纹:乌龙;
大小写整数
0:(IsUmsSchedulerThread:ULONG);
1:(IsUmsWorkerThread:ULONG);
结束;
PUMS系统线程信息=^UMS系统线程信息;
TP\u CALLBACK\u ENVIRON\u V3=记录
版本:TP_版本;
池:PTP_池;
清理组:PTP_清理组;
CleanupGroupCancelCallback:PTP_CLEANUP_GROUP_CANCEL_CALLBACK;
总状花序:PVOID;
ActivationContext:PACTIVATION\u CONTEXT;//指针
FinalizationCallback:PTP_SIMPLE_回调;
案例标志:德沃德
1:(长函数:DWORD)
1:(持久性:德沃德)
30:(二等兵:德沃德)
结束;
CallbackPriority:TP_CALLBACK_PRIORITY;
尺寸:德沃德;
结束;
PTP_CALLBACK_ENVIRON=^TP_CALLBACK_ENVIRON_V3;

那些
:一些
符号是位字段。没有直接的帕斯卡等价物

但是,由于合并的三个位字段是一个完整的dword,因此等效项的一般轮廓如下:

type
  _TP_CALLBACK_ENVIRON_V3 = record
  ...
    FinalizationCallback: PTP_SIMPLE_CALLBACK;
    case Integer of
    1: (Flags: DWord);
    2: (LongFunctionPersistentPrivate: DWord)
  end;

如前所述,“:”符号是位字段。没有直接的解决办法,但有一种简单的方法来翻译它们,使它们再次有用。请参阅我描述这一点的文章。它使用一组简单的函数来获取或设置一些位,并将它们转移到适当的位置,还有一种聪明的方法(顺便说一句,这不是我发明的)来声明它们,使用了相当未知的属性索引

请看这里:

这个想法来自于一个家庭


FWIW,本文也在这些翻译中进行了描述。

在现代Delphi版本中,记录可以有方法和属性,因此您可以通过适当的位移位相当轻松地模拟各个位字段。John,您不需要关心
TP\u CALLBACK\u environment
结构位字段的直译,因为回调环境结构仅由线程池API在内部使用。您不应该访问这些字段中的任何一个。因此,将这些位字段合并到一个
DWORD
就可以了。你建议的翻译是错误的
1:(LongFunction:DWORD)
代表
DWORD
的第一位,
1:(Persistent:DWORD)
第二位
DWORD
30:(Private:DWORD)
DWORD
的剩余30位。您已经为那些错误的字段声明了3
DWORD
s。按这里的建议去做。@TLama谢谢!由于它仅在
kernel32.dll中内部使用,因此我可以使用一个指向该结构的不透明指针。:)约翰,这次不是。它在内部使用,但不能将其(整个
TP\u CALLBACK\u ENVIRON
结构)定义为不透明指针。该类型必须完整,因为是您的应用程序分配该类型。
InitializeThreadpoolEnvironment
函数作为内联函数实现,其唯一业务是返回此类型的初始化结构(因此必须知道)。FWIW,本文暂时处于脱机状态。与我的提供商合作,使其再次联机。