【问题标题】:How to convert from C #define with functions如何使用函数从 C#define 转换
【发布时间】:2013-11-01 17:30:15
【问题描述】:

我有 C 头文件,定义如下

#define tds_accept      accept
#define tds_getpeername getpeername
#define tds_getsockopt  getsockopt
#define tds_getsockname getsockname
#define tds_recvfrom    recvfrom

我应该将定义转换为 Delphi 并分配函数(来自 Winsock2)。我尝试了consttype

type
  tds_accept      = accept;
  tds_getpeername = getpeername;
  tds_getsockopt  = getsockopt;
  tds_getsockname = getsockname;
  tds_recvfrom    = recvfrom;

并且有错误E2007 Constant or type identifier expectedE2035 Not enough actual parameters
Delphi可以做到吗?

【问题讨论】:

标签: delphi


【解决方案1】:

改用类型变量,例如:

var
  tds_accept      : function(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
  tds_getpeername : function(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
  tds_getsockopt  : function(s: TSocket; level, optname: Integer; optval: PAnsiChar; var optlen: Integer): Integer; stdcall;
  tds_getsockname : function(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
  tds_recvfrom    : function(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall;

initialization
  tds_accept      := accept;
  tds_getpeername := getpeername;
  tds_getsockopt  := getsockopt;
  tds_getsockname := getsockname;
  tds_recvfrom    := recvfrom;

或者:

type
  lpfn_accept      = function(s: TSocket; addr: PSockAddr; addrlen: PInteger): TSocket; stdcall;
  lpfn_getpeername = function(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
  lpfn_getsockopt  = function(s: TSocket; level, optname: Integer; optval: PAnsiChar; var optlen: Integer): Integer; stdcall;
  lpfn_getsockname = function(s: TSocket; var name: TSockAddr; var namelen: Integer): Integer; stdcall;
  lpfn_recvfrom    = function(s: TSocket; var Buf; len, flags: Integer; var from: TSockAddr; var fromlen: Integer): Integer; stdcall;

var
  tds_accept      : lpfn_accept       = accept;
  tds_getpeername : lpfn_getpeername  = getpeername;
  tds_getsockopt  : lpfn_getsockopt   = getsockopt;
  tds_getsockname : lpfn_getsockname  = getsockname;
  tds_recvfrom    : lpfn_recvfrom     = recvfrom;

【讨论】:

    【解决方案2】:

    Delphi 没有预处理器。因此,您通常会找到不同的方法来解决在 C/C++ 中使用预处理器处理的问题。就个人而言,我认为我会像这样使用加载时间链接:

    function tds_accept(...): TSocket; external dllname name 'accept';
    

    等等。

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2011-12-07
      相关资源
      最近更新 更多