1

Ø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 でこのコードをコンパイル/実行するために借用できるライセンスを取得した人はいますか? :-)

4

3 に答える 3

2

プロシージャを宣言するときに、PERSISTENTキーワードがありません。

次のコードを試してください。

zmq.p

&SCOPED DLLNAME 'libzmq.so'
PROCEDURE zmq_init EXTERNAL {&DLLNAME} CDECL PERSISTENT:
    DEF INPUT  PARAMETER NumThreads AS LONG.
    DEF RETURN PARAMETER Context AS MEMPTR.
END PROCEDURE.

PROCEDURE zmq_term EXTERNAL {&DLLNAME} CDECL PERSISTENT:
    DEF INPUT  PARAMETER Context  AS MEMPTR.
    DEF RETURN PARAMETER ResultStatus AS LONG.
END PROCEDURE.

PROCEDURE zmq_version EXTERNAL {&DLLNAME} CDECL PERSISTENT:
    DEF OUTPUT PARAMETER major AS LONG.
    DEF OUTPUT PARAMETER minor AS LONG.
    DEF OUTPUT PARAMETER patch AS LONG.
END PROCEDURE.

check_zmq.p

DEF VAR Zmq AS HANDLE NO-UNDO.
DEF VAR MajorVersion AS INT NO-UNDO.
DEF VAR MinorVersion AS INT NO-UNDO.
DEF VAR PatchVersion AS INT NO-UNDO.

DEF VAR CallStatus AS INT NO-UNDO.

DEF VAR ZmqContext AS MEMPTR NO-UNDO.

RUN zmq.p PERSISTENT SET Zmq.

RUN zmq_version IN Zmq ( OUTPUT MajorVersion, OUTPUT MinorVersion, OUTPUT PatchVersion ).
MESSAGE MajorVersion MinorVersion PatchVersion.

RUN zmq_init IN Zmq ( 1, OUTPUT ZmqContext ).
RUN zmq_term IN Zmq ( ZmqContext, OUTPUT CallStatus ).
MESSAGE CallStatus.

FINALLY:
    IF VALID-HANDLE(Zmq) THEN
         DELETE PROCEDURE Zmq.
END FINALLY.
于 2013-04-22T06:43:05.040 に答える
1

githubからコードを取得し、MEMPTR変数をINT64に変更しました。これにより、クラッシュすることなく実行できました(64ビットWindows7では10.2b0532ビット)。メモリはzeromqによって処理されているので、これは問題を処理するための安全な方法だと思います。

于 2012-05-02T18:23:50.200 に答える
1

外部ライブラリを呼び出して、プールに 0 スレッドを割り当てるように要求しているにもかかわらず、エラーは OpenEdge の非スレッド化の性質に関連している可能性がありますか?

スレッドを使用するいくつかの c# メソッド (clr ブリッジ経由で呼び出される) に取り組んでいるときに、同じ問題に何度か遭遇しました (Progress Client が動作を停止しました)。いくつかの c# ライブラリ クラス (AsyncOperation、AsyncCallback) を使用して進行状況からスレッドを非表示にすることで問題は解決しましたが、ほとんどの試行で進行状況のランタイムが停止しました。

.net に関連する進行状況のヘルプには、「System.Threading.Thread または派生クラスは使用できません — ABL はシングルスレッドです。」と記載されています。

clr ブリッジを介して c# メソッドを呼び出すことは、c ライブラリを呼び出すこととはまったく異なることを知っていますが、問題は OpenEdge のシングル スレッドの性質が原因である可能性があります。

于 2012-04-29T18:40:31.437 に答える