問題タブ [pinvoke]
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.
air - C プログラムからインプロセス共有ライブラリとして AIR ランタイムをロードする方法
java.exe の行に沿って、C で特別な AIR ランチャー プログラムを作成したいと考えています。
プロセス ビューアーを使用して AIR プログラムの実行を調べたところ、使用されている AIR ランタイム DLL を見つけることができました。AIR プログラムは、起動後に AIR ランタイムをインプロセス共有ライブラリとしてバインドするプラットフォーム固有の実行可能ファイルとしてインストールされるという点で Java とは異なります (ユーザーがアイコンをダブルクリックします)。
さて、代わりに java.exe のような AIR ランチャーを作りたいと思います。
java.exe は、インプロセス共有ライブラリとして Java JVM ランタイム (JRE) にバインドするプラットフォーム OS プロセスとして起動されます。実行する Java アプリケーションは、java.exe のコマンドライン引数として指定されます。java.exe が実行され、JVM が完全に機能するようになると、指定された Java アプリケーション クラスが実行のために JVM クラス ローダーによってロードされます。その指定された Java アプリケーションは、ある意味で java.exe のプロセスを「ハイジャック」します。もちろん、指定された Java アプリケーションは、それをホストする java.exe プログラムとしてすべてのプロセス リストに表示されます。
AIR アプリの起動をこのように動作させたいと考えています。なんで?そのため、AIR をハッキングする方法を探り、多くの欠点を克服することができます。たとえば、まず、実行中の AIR アプリケーションで使用できるようになるいくつかの新しい API を使用して、AIR ランタイム エクスペリエンスを拡張したいと考えています。
私の最初の注文は次のとおりです。
- .NET PInvoke に匹敵する ActionScript3 のバインディング インターフェイスを C に実装する
- これを行うための Java SE にある API (Runtime.exec、ProcessBuilder、Process) に匹敵するプロセス起動用の API を追加します。
- AIR アプリケーションのサポートを追加して、stdin、stdout、stderr と対話できるようにします。奇妙なことに、Adobe は AIR でのローカル ファイル アクセスのサポートを追加しましたが、これらの標準ファイル パイプとのやり取りを省略しました (ただし、AIR がサポートするすべての OS プラットフォームで検出されます)。
- stdin、stdout、stderr を介した AMF のサポートを実装します。これにより、AIR (または Java または任意の AMF 対応言語) アプリは、AMF オブジェクトの交換を介して通信を相互処理できます。これにより、Microsoft の PowerShell のタッチが AIR に追加されます。
現在、Merapi は Java との AMF ブリッジを提供しているため、これの有効性が実証されています。悲しいかな、Merapi はプロセス間通信を行うためにローカルホスト ポートとソケットを使用する必要があります。
.net - Windowsのシリアル番号を取得するための呼び出しをピンボークしますか?
Windows のシリアル番号を取得する通常の方法は WMI です。
コンパクトなフレームワークが WMI をサポートしていないため、WMI を使用したくありません。アセンブリはデスクトップとコンパクト フレームワーク側で動作する必要があるため、参照を追加できません。
pinvoke 呼び出しを使用して同じ結果を得るにはどうすればよいですか?
c# - pinvoke: dllimport とインポートされたライブラリの操作方法が不明
C++ dll で dllImport を実行しており、次の署名があります。これまでのところ StackOverflow は非常に役に立ちました。
心配すべき落とし穴はありますか? dllimport を使用するのはこれが初めてです。
以下を C# にインポートする必要があります。
HANDLE FooInit(char* name); //name は "COM1" のような文字列のようです
int Foo1(HANDLE ハンドル, const char** センテンス); //文は "Hello World" のような文字列のように見えます
int Foo2(HANDLE ハンドル、DWORD* val);
どうもありがとう!
c# - アンマネージ Unicode 文字列から SecureString を作成する
CryptUnprotectData Windows API 関数と .net SecureString を可能な限り最善の方法で結び付けたいと考えています。CryptUnprotectData は、バイト配列とバイト長で構成される DATA_BLOB 構造を返します。私のプログラムでは、これは Unicode UTF-16 文字列になります。SecureString には、char* と長さのパラメーターを受け取るコンストラクターがあるため、次のようなことができるようにしたいと考えています。
これは機能しますが、UTF-16 が可変長であることを除けば、長さの引数として何を使用すればよいかわかりません。上記の例では 2 バイト文字 (BMP) を想定していますが、他のプレーンでは最大 4 バイトになる可能性があります。バイト配列内の UTF-16 文字の数を知る必要があります。値をメモリ内にコピーせずにこれを行う最善の方法は何ですか (それによってセキュリティが損なわれます)。できるだけ早くバイト配列をゼロにして解放する予定です。
c# - P/CryptImportKeyの呼び出しと構造体のマーシャリング
ある時点でC++Win32サービスで復号化されるデータを暗号化する前に、C#からCryptImportKeyをP / Invokeして、既知のキーを設定しようとしています。P / Invokeのメソッドシグネチャがあり、すべて正常に機能しますが、キーBLOBを受け入れることができません。C ++構造体は以下のコメントにあり、マーシャリング用のC#構造体はその下にあります。
次に、以下を使用します。
バイト配列にアクセスしてCryptImportKeyに渡すために、キーを取得することはないようです。それを使用して暗号化すると、キーを使用していないことを示す異なる暗号文時間が表示されます。
編集:
重要なblobのものは、データを正常に暗号化および復号化できるC++コードからのものです。ヘッダーが2回含まれているという点があると思いますが、私が抱えている主な問題は、Byte[]rgbKeyDataの値がバイト配列arrに入力されていないことです。
c# - void * C API を C# にインポートする方法は?
この C API 宣言が与えられた場合、どのように C# にインポートされるでしょうか?
私はこれまでに得ることができました:
当然、C# では "void *" はコンパイルされません。
一部のグーグルは、「オブジェクト」として翻訳する必要があることを示しています。それはうまくいくようです。しかし、他の人は、「Void * は、C/C++ 用語では関数ポインターと呼ばれ、C# 用語ではデリゲートである」と示しています。ここではあまり意味がありません。何に委任するのでしょうか? Google で見つけた他の API の同様の呼び出しでは、それぞれの API で他の関数を使用しています。しかし、この API では、他の呼び出しは意味がありません。
呼び出しのドキュメントには、次の例が示されています。
これは、静的な値でも渡すことができることを示しているようです。
void * の代わりに object でコンパイルされます。これが正しいかどうかはわかりませんし、テストする機会もありません (ライセンスの問題)。
c# - const int * const buffer[] を C# にインポートする方法は?
これは私にとってトリッキーです。
現在、以下のように翻訳しています。
問題は、DLL が上記のパラメーターを使用して関数を呼び出しているときに、AccessViolation 例外が発生することです。
手伝ってくれてありがとう。
c# - P/Invoke、Pinning、KeepAlive のベスト プラクティス
職場では、専用のフラット ファイル データベースの読み取りと書き込みを担当するネイティブ C コードがあります。P/Invoke 呼び出しを OO モデルにカプセル化する C# で記述されたラッパーがあります。P/Invoke 呼び出しのマネージ ラッパーは、プロジェクトが開始されてからかなり複雑になりました。逸話的には、現在のラッパーは問題なく動作していますが、正しい動作を確保するには、実際にはさらに多くのことを行う必要があると考えています。
回答によってもたらされたいくつかのメモ:
- おそらくキープアライブは必要ありません
- おそらくGCHandleのピン留めは必要ありません
- GCHandle を使用する場合は、試してみてください...最終的にそのビジネス (ただし、CER の質問は解決されていません)
修正されたコードの例を次に示します。
私の(修正された)質問は次のとおりです。
- データ、詳細、ステータスは自動固定/キープアライブされますか?
- これが正しく動作するために必要なものが他にありませんか?
編集: 最近、私の好奇心をかき立てた図を見つけました。基本的には、P/Invoke メソッドを呼び出すと、 GC がネイティブ コードをプリエンプトできると述べています。そのため、ネイティブ呼び出しは同期的に行われる可能性がありますが、GCはメモリを実行して移動/削除することを選択できます。私は今、自動ピン留めで十分かどうか(またはそれが実行されるかどうか)疑問に思っていると思います。
.net - .NET PInvoke は、ユーザーが指定したディレクトリからネイティブ dll を動的にロードできますか?
.NET アプリケーションがあり、ユーザーが場所を指定したネイティブ ライブラリをロードする必要があります。PInvoke は、グローバル検索パス (またはコンパイル時に指定されたパス?) からのみ読み込まれるように見えます。実行時に LoadLibrary を呼び出す C++/CLI アセンブリを作成するのが最善の方法でしょうか?
C++/CLI は C# PInvoking LoadLibrary よりも簡単ですか?