Delphi 移植C联合体
我正在尝试移植一个内部有一个并集的C结构。Delphi 移植C联合体,delphi,delphi-xe8,Delphi,Delphi Xe8,我正在尝试移植一个内部有一个并集的C结构。Winapi.Winsock2.pas中的默认结构在记录中缺少一些字段。 但这是正确的方法吗?谢谢 typedef结构\u wsa完成{ WSA完成类型; 联合{ 结构{ HWND-HWND; UINT uMsg; WPARAM上下文; }窗口消息; 结构{ LPWSA重叠LPWSA重叠; }事件; 结构{ LPWSA重叠LPWSA重叠; LPWSA重叠_完成_例行程序lpfnCompletionProc; }Apc; 结构{ LPWSA重叠LPWSA重
Winapi.Winsock2.pas
中的默认结构在记录中缺少一些字段。
但这是正确的方法吗?谢谢
typedef结构\u wsa完成{
WSA完成类型;
联合{
结构{
HWND-HWND;
UINT uMsg;
WPARAM上下文;
}窗口消息;
结构{
LPWSA重叠LPWSA重叠;
}事件;
结构{
LPWSA重叠LPWSA重叠;
LPWSA重叠_完成_例行程序lpfnCompletionProc;
}Apc;
结构{
LPWSA重叠LPWSA重叠;
处理hPort;
ULONG_PTR钥匙;
}港口;
}参数;
}WSA完成;
编译器抱怨出现
错误:E2004标识符重新声明:“lpOverlapped”
更新2:
经过一番思考,我终于想到了这个
_WSACOMPLETION = record
&Type: WSACOMPLETIONTYPE;
case Parameters: Integer of
0: (WindowMessage: record
hWnd: HWND;
uMsg: UINT;
context: WPARAM;
end);
1: (Event: record
lpOverlapped: LPWSAOVERLAPPED;
end);
2: (Apc: record
lpOverlapped: LPWSAOVERLAPPED;
lpfnCompletionProc: LPWSAOVERLAPPED_COMPLETION_ROUTINE
end);
3: (Port: record
lpOverlapped: LPWSAOVERLAPPED;
hPort: HANDLE;
Key: ULONG_PTR;
end)
end;
您的翻译很好,模块化的事实是,您必须为记录的每个成员使用单独的名称
但就我个人而言,我会为工会的每个分支定义一个记录。这将允许您为工会的每个分支指定一个名称,就像C代码中的情况一样。您必须为每个lpOverlapped字段指定不同的标识符,如lpOverlapped1、lpOverlapped2、@DalijaPrasnikar,但大小是否等于C?不要编辑您的问题以包含答案。在下面的空白处贴一个真实的答案,我发现了一个不同的方法。奇怪的是,这次它编译得很好。
_WSACOMPLETION = record
&Type: WSACOMPLETIONTYPE;
case Parameters: Integer of
0: (WindowMessage: record
hWnd: HWND;
uMsg: UINT;
context: WPARAM;
end);
1: (Event: record
lpOverlapped: LPWSAOVERLAPPED;
end);
2: (Apc: record
lpOverlapped: LPWSAOVERLAPPED;
lpfnCompletionProc: LPWSAOVERLAPPED_COMPLETION_ROUTINE
end);
3: (Port: record
lpOverlapped: LPWSAOVERLAPPED;
hPort: HANDLE;
Key: ULONG_PTR;
end)
end;