我正在尝试为ØMQ C library编写 ABL 绑定,但是我的zmq_init函数绑定的过程编辑器崩溃了。我为 zmq_version 编写了一个绑定没有问题,所以我认为这不是 .dll 文件问题。无论如何,C 函数原型如下所示:
void *zmq_init (int io_threads);
我写的ABL代码如下:
PROCEDURE zmq_init EXTERNAL "libzmq.dll" CDECL:
DEFINE INPUT PARAMETER num_threads AS LONG.
DEFINE RETURN PARAMETER context_ptr AS MEMPTR.
END PROCEDURE.
DEF VAR mContext AS MEMPTR NO-UNDO.
RUN zmq_init(INPUT 0, OUTPUT mContext).
这个特定的函数初始化一个“0mq 上下文”(潜在问题:它是一个线程池)并返回一个指向它的指针。即使我正在调用外部库并请求在池中分配 0 个线程,该错误是否与 OpenEdge 的非线程性质有关?
在过程编辑器中运行代码会使其崩溃,并出现 Windows“Progress Client 已停止工作”错误Exception code: C0000005 ACCESS_VIOLATION
(此处为完整堆栈跟踪,尽管我并不总是得到包含信息的堆栈跟踪)。
我从来没有做过 Windows C 编程,但如果我在 Unix 上使用 gcc(访问受保护的内存),它看起来就像我所说的分段错误。说到这一点,我实际上宁愿在 Unix 机器上运行这段代码,但显然 Progress 只为 Windows 提供评估开发人员 OE 环境:(。
我已经禁用了 DEP,但没有成功。当指针从库返回时,ABL 是否试图取消引用它?当然,必须有一种方法来处理返回值为 void* 的签名,这些签名在库调用中得到 malloc'ed。
我翻阅了OpenEdge Development: Programming Interfaces、Tom Bascom 的UNIX Shared Libraries PowerPoint 以及LDAP World 中的其他一些称为 OpenEdge 的PowerPoint,其中包含一些代码示例,但看不到任何明显我遗漏的内容。
我使用的是 OpenEdge 10.2B,Windows 7 64 位,但是使用 32 位版本的 OpenEdge 作为评估软件的唯一选择。任何人都有我可以借来在 CentOS 上编译/运行此代码的许可证吗?:-)