用Delphi调用VC的动态链接库,在VC中的函数定义是这样:ZMQ_EXPORT int zmq_poll (zmq_pollitem_t *items, int nitems, long timeout);我在Delphi中是这样翻译的:
type
 function zmq_poll(items:zmq_pollitem_tp;nitems:Integer;timeout:longint):Integer;cdecl;
implementation
function zmq_poll;external'libzmq.dll'name'zmq_poll';是这样调用的:
zmq_poll(items,2,-1);结果报错:
[Pascal Error] Project1.dpr(39): E2066 Missing operator or semicolon
请问这大概是什么问题啊?我看着程序好像没有问题

解决方案 »

  1.   

    Project1.dpr中39行的代码贴出来看看。
      

  2.   

    39行的代码就是调用语句:
    zmq_poll(items,2,-1);
      

  3.   

    我查了一下对应表,vc 的 long 型对应的是Delphi的longint类型。错误提示的光标是在“(”号和“items"之间
      

  4.   

    或者看下zmq_pollitem_tp你是怎么定义的?
      

  5.   

    应该是将DLL的语法"标准化"才行
      

  6.   

    VC 本身对zmq_pollitm_t的定义是:
    typedef struct
    {
        void *socket;
    #if defined _WIN32
        SOCKET fd;
    #else
        int fd;
    #endif
        short events;
        short revents;
    } zmq_pollitem_t;其中:它对socket的定义是:
     typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
    typedef UINT_PTR        SOCKET;我把它化简了,
    我的Delphi封装是:
    zmq_pollitem_t=packed record
      socket:pointer;
      fd:cardinal;
      events:smallint;
      revents:smallint;
    end;
    zmq_pollitem_tp=^zmq_pollitem_t;
    这样有没有问题啊?如果有问题,请教正确的封装是怎样的
      

  7.   

    第一:
    结构体不要加packed,你先看看.h文件中设置的对齐是多少.如果没设,你也不用加.VC和Delphi不设默认对齐一样.
    如果他设置了对齐,你就用{$A4 +}(4是对齐的数字)指令对齐.
    第二:
    zmq_poll函数的调用约定,VC中调用约定可以再函数前加,也可以不加,在.DEF文件中定义.
    你看它的宏ZMQ_EXPORT中如果没有调用约定定义,不存在.DEF文件,或者.DEF文件中没定义zmq_poll的约定,那么你定义的cdcel就没错.否则根据它的定义改一下.
      

  8.   

    ZMQ_EXPORT的定义是这样的:
    #if defined _WIN32
    #   if defined DLL_EXPORT
    #       define ZMQ_EXPORT __declspec(dllexport)
    #   else
    #       define ZMQ_EXPORT __declspec(dllimport)
    #   endif
    #else
    #   if defined __SUNPRO_C  || defined __SUNPRO_CC
    #       define ZMQ_EXPORT __global
    #   elif (defined __GNUC__ && __GNUC__ >= 4) || defined __INTEL_COMPILER
    #       define ZMQ_EXPORT __attribute__ ((visibility("default")))
    #   else
    #       define ZMQ_EXPORT
    #   endif
    #endif