如何正确地对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.
答案 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没有在翻译中犯错,有时会发生错误。
最后,如果忽略函数调用的返回值,我不会责备你,至少是温和的,这将是我的疏忽。