問題タブ [rubydl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Ruby/DL をどのように使用しますか? これは正しいですか?
RSPEC (Ruby フレーバーの BDD) と Windows アプリケーションの間のインターフェイスを作成しようとしています。アプリケーション自体はあいまいな言語で書かれていますが、アクセスを提供する C API があります。私は Ruby/DL を使用しましたが、DLL メソッドへの最も基本的な呼び出しでさえ機能させるのに苦労しています。gt4r.rb と呼ばれるファイルで、これまでに持っているものを次に示します。
これまでの私の読書は、これが必要なすべてであることを示唆しているので、RSPEC の例を書き上げました。
そして走ると…
戻り値 (13) は実際の戻りコードであり、エラーを意味しますが、gTD_get_error_message 呼び出しを RSPEC に追加しようとすると、パラメーターが機能しません。
私は正しい方向に進んでいますか?次に試すことができることを誰かが指摘できますか?
ありがとう、ブレット
この質問のフォローアップで、ターゲット ライブラリからエラー メッセージを取得しようとすると失敗する部分を示します。
@msg でエラー メッセージが返されることを期待していますが、実行すると次のようになります。
代わりにシンボル (:msg) を使用すると、次のようになります。
明らかに、Ruby と C の間でパラメーターを渡すことについて何かが欠けていますが、何ですか?
c - C -> Rubyインターフェースで変数を返すにはどうすればよいですか?
以前の質問のフォローアップで、ターゲット ライブラリからエラー メッセージを取得しようとしたときに失敗する部分を示しています。
@msg でエラー メッセージが返されることを期待していますが、実行すると次のようになります。
代わりにシンボル (:msg) を使用すると、次のようになります。
明らかに、Ruby と C の間でパラメーターを渡すことについて何かが欠けています。値を返すには、どのような Ruby 変数が必要ですか?
c - Win32関数を呼び出すための汎用C関数を作成するにはどうすればよいですか?
スクリプト言語(Cで記述)からWin32 APIにアクセスできるようにするために、次のような関数を記述したいと思います。
これは、一般的に、任意のWin32API関数を呼び出します。
(LPSTRパラメーターは基本的にバイト配列として使用されています-関数の外部で正しいデータ型を取得するために正しいサイズになっていると仮定します。また、ポインター引数と非ポインター引数を区別するには、さらに複雑さが必要だと思いますが、この質問の目的のためにそれを無視しています)。
私が抱えている問題は、Win32API関数に引数を渡すことです。これらはstdcallであるため、varargsを使用できないため、「Call」の実装は引数の数を事前に知っている必要があり、したがってジェネリックにすることはできません...
アセンブリコードでこれを行うことができると思います(引数をループし、それぞれをスタックにプッシュすることによって)が、これは純粋なCで可能ですか?
更新:今のところ、「いいえ、できません」という回答にマークを付けました。もちろん、Cベースのソリューションが明らかになった場合は、これを変更します。
更新: ruby / dlは、適切なメカニズムを使用して実装されているようです。これに関する詳細をいただければ幸いです。
ruby - Ruby/DL 経由で OpenProcessToken を呼び出すときの Segfault
以下のアップデートをご覧ください
UAC コンテキストを介して別のプログラムと通信する Ruby ライブラリの機能を修正しようとしており、現在のユーザーと同じセキュリティ属性を持つ共有ファイル マップを作成する必要があります。私は Ruby/dl を使用していますが、これを Ruby 1.9.3 で動作させようとしていることが問題の原因です。
advapi31 でOpenProcessToken関数を呼び出すと、セグメンテーション違反が発生します。以下に最小限の例を示します。これにより、私のマシンでセグメンテーション エラーが発生しました。受け取ったエラーのテキストはこちらです。エラー テキストがコマンド ラインに出力された後に表示されるエラー ボックスのスクリーンショットもここにあります。
アップデート
(RubyInstaller を使用して) Ruby を 1.9.3p545 に更新すると、上記の例を実行できましたが、引き続き問題が発生します。ここで、1.9.3p545 で実行するとセグメンテーション エラーが発生するファイルを含むGist を作成しました(ただし、今回はインタプリタが応答しなくなり、上記のダイアログ ボックスが表示されることはありません)。同じバージョンの Ruby がインストールされた別のマシンと同様に、同じ結果が得られます。以前は言及しなかったので、私は Windows 7 Pro 64 ビットを実行しています。同じことが、テストした他のコンピューターにも当てはまります。
必ずしも OpenProcessToken に関連しているとは限らない、より深い問題を暗示している可能性があるいくつかのことに気付きました。次のいずれかによって、個別にセグメンテーション違反を防ぐことができます。
- 行 3 を runner.rb から mwe.rb の下部にコピーし、mwe.rb を直接実行します。
- mwe.rb の 5 行目をコメント アウトするか、errors.rb のいくつかの大きなサブセットをコメント アウトします (たとえば、37 行目から 99 行目をコメント アウトすると、segfault は発生しません)。
- runner.rb の 3 行目をコメントアウトして、実際には他のファイルのみを要求して終了します。
- Pageant::Win 内から次の組み合わせをコメントアウトすると、segfault は発生しません。
- への呼び出し
extern
- への呼び出し
struct
- 定数
- クラス メソッド
- への呼び出し
最後のケースでは、特定のカテゴリのすべての項目をコメント化する必要はありません。たとえば、 と をコメントアウトするTOKEN_USER
と、セグメンテーション違反が回避されSECURITY_ATTRIBUTES
ます。また、コメント アウトTOKEN_USER
と にextern
関連付けられたステートメントによってセグメンテーション違反を防ぐこともできIsValidSecurityDescriptor
ます。同じ動作になる他のいくつかの組み合わせを試しました。
どんな助けでも大歓迎です。