用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
请问这大概是什么问题啊?我看着程序好像没有问题
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
请问这大概是什么问题啊?我看着程序好像没有问题
zmq_poll(items,2,-1);
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;
这样有没有问题啊?如果有问题,请教正确的封装是怎样的
结构体不要加packed,你先看看.h文件中设置的对齐是多少.如果没设,你也不用加.VC和Delphi不设默认对齐一样.
如果他设置了对齐,你就用{$A4 +}(4是对齐的数字)指令对齐.
第二:
zmq_poll函数的调用约定,VC中调用约定可以再函数前加,也可以不加,在.DEF文件中定义.
你看它的宏ZMQ_EXPORT中如果没有调用约定定义,不存在.DEF文件,或者.DEF文件中没定义zmq_poll的约定,那么你定义的cdcel就没错.否则根据它的定义改一下.
#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