1

How can I correctly typecast to a structure in Delphi? This does not work exactly like in C++ where one would just pass a &Data according to the MSDN documentation.

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.
4

1 回答 1

4

我猜你已经翻译了 MSDN 文档中的函数,内容如下:

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

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

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

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 没有在翻译中犯错,这有时确实会发生。

最后,如果我不责备你,至少温和地责备你忽略函数调用的返回值,那将是我的失职。

于 2015-05-12T15:47:32.450 回答