Delphi 移植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重

我正在尝试移植一个内部有一个并集的C结构。
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;