問題タブ [ffi]

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.

0 投票する
2 に答える
3220 参照

dll - DLL関数のHaskell外部インポートstdcall

これはおそらく答えるのが本当に簡単な質問ですが、何らかの理由で私は本当にそれに苦労しています。

プロトコルレベルでハードウェアにアクセスするためにCで記述されたDLLがあり、それらのC関数のいくつかを呼び出すHaskellプログラムを記述したいと思います。関連するCヘッダーのスニペットを次に示します(著作権の問題が発生する可能性があるため、名前が少しわかりにくくなっています)。

これはVisualStudio2003でDLLとしてコンパイルされており、CとC#の両方からDLLを正常にロードしたので、DLLは正常に機能すると確信しています。DLLの名前は「hw-driver.dll」です。

次に、DLLを適切にロードして、その中で最も単純な関数を呼び出すことができるかどうかをテストするためのHaskellソースコードを次に示します。

困っているのは海外輸入ラインです。私が理解しているように、構文は外部(インポート/エクスポート)(ccall / stdcall)ライブラリ名 C-function-name haskell-function-name :: Haskell型宣言です。したがって、私のものは外部インポートstdcallである必要があります(Win32でDLLをロードするときにstdcallを使用するため) "hw-driver"(ファイルの名前は "hw-driver.dll"であり、dlltest.hsと同じディレクトリにあるため) "HW_Init"(Cでの関数の名前)hwInit :: IO(Cint)(引数を無効にし、intを返します)。

ただし、実行しようとするとghci dlltest.hs、次の出力が得られます。

8行43列は、HW_Initの最初の引用符です。さて、多分私はライブラリ名と関数名の両方を1つの文字列に入れなければならないかもしれません、私はそれをいくつかの場所で見ました。それを実行しようとすると、次のようになります。

8:23は、新しい文字列「hw-driverHW_Init」の最初の引用符です。

ghciでRealWorldHaskellからコピーして貼り付けた次のコードを実行できるため、ghcセットアップ(6.10.3)に問題はないと思います。

非常に長い質問ですが、Win32 DLLで外部インポートを適切に宣言するにはどうすればよいですか?Googleで何も見つかりませんでした。

そして、その質問に沿ってタグを付けるために、c2hsやhsc2hsなどのプログラムを使用してヘッダーファイルを解析できるhw-driver.hので、そのDLLに含まれるすべての20〜25の関数の外部インポート呼び出しを手動で記述する必要はありません?私もそのまともな例を見つけることができませんでした。


編集:ephemientは、外部インポート行の正しい構文は次のとおりであると指摘しています。

これによりghci dlltest.hs -lhw-driver、正常なリターンコードでmain関数を呼び出して適切に呼び出すことができます。ただし、コマンドghc --make dlltest.hs -lhw-driverはリンカエラーで失敗します。したがって、そのコマンドの詳細な出力は次のとおりです(作業ディレクトリにすべてのhw-driver。{dll、h、lib}があることに注意してください)。


結局のところ、実際のリンクは、私が思っていたほど難しくはありませんでした。foreign import stdcallVisual Studio 2003に組み込まれているDLLで正しいと思われるものを使用していpexportsました。DLLからエクスポートされた関数を一覧表示する、MinGW用のツールをダウンロードする必要がありました。リンカはずっとHWInit@0を探していましたがpexports、DLLはHWInitだけをエクスポートしていると言いました。

行を代わりに変更しましたが、.libファイルと.dllファイルの両方が作業ディレクトリで使用可能であるため、またはそのforeign import ccallいずれかを使用してプログラムを正常にリンクできました。ghc --make dlltest.hs hw-driver.libghc --make dlltest.hs -L. -lhw-driver

0 投票する
2 に答える
955 参照

haskell - Haskell: #define-d 定数の値を取得するにはどうすればよいですか?

Haskell プログラムで、C ヘッダーで定義された定数を使用する最良の方法は何ですか?

0 投票する
2 に答える
2045 参照

c - 外部関数インターフェースを実装するためのガイド

現在、私はまだ FFI を持たないスクリプト言語に取り組んでいます。クールなオタクのように書きたいと仮定して、FFI をスクリプト言語自体で書きたいと思います。

インターフェイスに必要なプログラミング言語は C です。したがって、基本的には、libdl.so が私の親友であることを知っています。明らかに、私が必要とするのはそれだけではありませんが、それらの中で最も重要です.

他に何が必要かについては、ほんの少しのアイデアしかありません。Python ctypes と同様の動作を FFI から取得したいと思います。

ここまでたどり着くには、何を知る必要がありますか? 私が対処しなければならないデータ構造には、いくつかの深刻な魔法があることを知っています。スクリプト言語自体でその深刻な魔法のほとんどを実行できるようにするには、どうすればそれを管理できますか? このような魔法は、外部関数インターフェイス以外にも使用できます。たとえば、C ライクなバイナリ データをファイルに渡したい場合があります。

0 投票する
1 に答える
334 参照

c - 大きなグラフを保存する場合、SBCL はどのくらい効率的ですか?

ガベージ コレクターは、メモリ内の多数のオブジェクトを操作するときにパフォーマンスにどの程度影響しますか?メモリの割り当てと割り当て解除のオーバーヘッドはどの程度ですか? これを行うには SBCL を使用するのが賢明ですか、それとも小さな C ライブラリを構築して FFI 経由で接続する方がよいでしょうか?

0 投票する
4 に答える
3532 参照

.net - .NET で Haskell 関数を呼び出す

string -> stringC# プログラムから、次の型 :: で Haskell 関数を使用したいと考えています 。

hs-dotnetを使用して両方の世界を橋渡ししたいと考えています。著者はそれが可能であると主張していますが、このケースのサンプルは提供していません。提供されているサンプルは、Haskell の .NET を使用するサンプルのみです。

この使用例、または使用方法はありますか? (ブリッジ アセンブリで.NET Reflectorを使用しましたが、何もわかりませんでした。)

0 投票する
1 に答える
21385 参照

python - Python ctypesからメモリの場所を逆参照する方法は?

Python ctypes で次の c コードを複製したい:

このメモリ位置を関数ポインタとして呼び出す方法を理解できますが、通常の逆参照を行うだけではありません。

このメモリ位置を指している命令ポインタにセグメンテーション違反があるため、正常に呼び出しています。ただし、メモリの場所を読み取るだけでは取得できません。

0 投票する
1 に答える
294 参照

haskell - peekCStringとpeekCStringLenは怠惰ですか?

nullで終了する文字列を作成し、その文字列へのポインタを返すC関数があります。また、対応する割り当て解除関数もあります。

返されたCStringからHaskell文字列を作成し、できるだけ早くCStringを解放したいと思います。

strを使用する前にcStrを解放しても安全ですか?言い換えれば、peekCStringはHaskell Stringを一度に作成しますか、それとも怠惰に作成されますか?

0 投票する
1 に答える
242 参照

ruby-on-rails - ruby 1.9 で sqlite3 を実行中にエラーが発生しました: 未定義のメソッド 'changes'

これが私が得ているエラーです。それは突然始まったばかりです

Ruby 1.9.1p243 gem 1.3.5 rails 2.3.5 ffi 0.5.4 sqlite3 0.0.3 を使用しています。

ubuntu 9.10 デスクトップでは、同じ問題が発生しました 9.04

このエラーの原因を知っている人はいますか?

0 投票する
1 に答える
1298 参照

c++ - c++ データ型を ffi で haskell にインポートする

私は C++ ライブラリの Haskell ラッパーを作成しています。ライブラリから Haskell プログラムに関数をインポートできる限り、C++ データ型をインポートする方法がわかりません。たとえば、 some.h ファイルで定義された video::E_DRIVER_TYPE EDT_OPENGL タイプをパラメーターとして受け取る関数があり、前に述べたように、 ffi を使用して関数をインポートする方法を知っています

海外輸入コール ...

適切なコンパイラマングル関数名を持つ

しかし、この特定のビデオ ドライバーのデータ型をインポート/使用する方法がわからないため、haskell から関数を呼び出すことができません。

さて、Haskell で型を作成できることはわかっていますが、C++ 表現が何であれ、その型を何から定義するかについての出発点が必要です。(この時点で迷っています)

どんな種類の助けにも感謝します!ありがとう

0 投票する
1 に答える
209 参照

scheme - PltScheme FFI からの _bitmask の使用

これは plt-scheme ラッパー ライブラリの一部です。

問題は、ビットマスク (または列挙型) のフィールドにアクセスする方法がわかりません。たとえば、KeyPressMask 値を取得するにはどうすればよいですか?