Delphi中的指针类型转换

时间:2015-05-12 14:25:32

标签: delphi delphi-xe8

如何正确地对Delphi中的结构进行类型转换?这与C++完全不同,根据MSDN文档,只会传递&Data

program Project1;

uses
  System.SysUtils,
  Winapi.Windows,
  Winapi.Winsock2;

function WSAStartup(wVersionRequired: WORD; out lpWSAData: LPWSADATA): Integer; WINAPI; external 'ws2_32.dll';

var
  Data: WSADATA;
begin
  WSAStartup(WINSOCK_VERSION, LPWSADATA(@Data)); // E2197 Constant object cannot be passed as var parameter
  ReadLn;
end.

1 个答案:

答案 0 :(得分:4)

我想您已经从MSDN文档中翻译了该函数,其中包含:

int WSAStartup(
  _In_  WORD      wVersionRequested,
  _Out_ LPWSADATA lpWSAData
);

混淆源于使用_Out_注释。这是一个扩展到零的宏。它用于向工具传达意图,例如,将头文件声明转换为不同的语言。更多信息可以在这里找到:

您错误地将_Out_翻译为Delphi out关键字。您可以简单地删除该关键字,并且您的声明是正确的:

function WSAStartup(wVersionRequired: WORD; lpWSAData: LPWSADATA): Integer; 
  WINAPI; external 'ws2_32.dll';

然后你的电话会是:

WSAStartup(WINSOCK_VERSION, @Data);

或者,由于此参数不是可选的,您可以像这样翻译它:

function WSAStartup(wVersionRequired: WORD; out lpWSAData: WSADATA): Integer; 
  WINAPI; external 'ws2_32.dll';

然后你会这样打电话:

WSAStartup(WINSOCK_VERSION, Data);

但是,您应该使用Winapi.Winsock2中可以找到的函数声明,这样可以避免冒这样的错误。也就是说,假设Embarcadero没有在翻译中犯错,有时会发生错误。

最后,如果忽略函数调用的返回值,我不会责备你,至少是温和的,这将是我的疏忽。