ØMQ C ライブラリの 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 の「プログレス クライアントが動作を停止しました」というエラーでクラッシュしますException code: C0000005 ACCESS_VIOLATION
(ここでは完全なスタック トレースですが、情報を含むスタック トレースを常に取得できるとは限りません)。
私は Windows C プログラミングを行ったことはありませんが、gcc を使用して (保護されたメモリにアクセスする) Unix を使用している場合、セグメンテーション フォールトと呼ばれるもののように見えます。そういえば、実際にはこのコードを Unix マシンで実行したいのですが、どうやら Progress は Windows 用の評価開発者 OE 環境しか提供していないようです :(.
DEP を無効にしましたが成功しませんでした。ABL は、ライブラリなどから返されたときにポインターを逆参照しようとしていますか? 確かに、ライブラリ呼び出しで malloc される void* の戻り値を持つ署名を処理する方法が必要です。
OpenEdge Development: Programming Interfaces、Tom Bascom のUNIX Shared Libraries PowerPoint、およびLDAP World の OpenEdgeと呼ばれるその他の PowerPoint をページングしましたが、いくつかのコード サンプルがありますが、私が見逃していることは明らかではありません。
私は OpenEdge 10.2B、Windows 7 64 ビットを使用していますが、32 ビット バージョンの OpenEdge を使用しているのは、それが評価ソフトウェアの唯一のオプションだからです。CentOS でこのコードをコンパイル/実行するために借用できるライセンスを取得した人はいますか? :-)