問題タブ [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.
c# - c# コードで c++ dll で定義されたクラスを使用する
C++ で記述された dll があります。この dll を C# コードで使用する必要があります。検索した結果、P/Invoke を使用すると必要な関数にアクセスできることがわかりましたが、これらの関数はクラスで定義されており、非静的プライベート メンバー変数を使用しています。したがって、関数を適切に使用するには、このクラスのインスタンスを作成できる必要があります。インスタンスを作成できるように、このクラスにアクセスするにはどうすればよいですか? これを行う方法を見つけることができませんでした。
C++ dll は私のコードではないことに注意してください。
c# - .NETCFの例外「PInvokeDLLが見つかりません」を解決するにはどうすればよいですか。
これは、すべてのC#の達人に当てはまります。私はすでにこれに頭を悩ませてきました、無駄にネット上であらゆる種類のアドバイスを試しました。このアクションは、WindowsMobile5.0で発生しています。
MyDll.dllという名前のDLLがあります。MyDll.hには次のものがあります。
MyDll.cppでのMyDllFunctionの定義は次のとおりです。
C#クラスには、次の宣言が含まれています。
同じクラスで、次の方法でMyDllFunctionを呼び出しています。
そして、これは血なまぐさいものが私に「PInvokeDLL'MyDll.dll'が見つかりません」を与え続けるところです。次のように宣言された「GetAsyncKeyState(1)」などのシステムコールで実際にPInvokeを実行できることを確認しました。
MyDll.dllは実行可能ファイルと同じフォルダーにあり、変更も成功もせずに/Windowsフォルダーに入れてみました。アドバイスや解決策は大歓迎です。
c# - IHTMLDocument2.Script.InvokeMember() によって返された COM オブジェクトを便利なものに変換する
私は、ブラウザーで Javascript を呼び出し、Javascript 呼び出しから戻り値を取得する Internet Explorer 拡張機能の C#.NET でいくつかのコードを使用しています。Javascript がプリミティブ型またはプリミティブ型の配列を返すときは、処理できるものを取得しますが、Javascript がオブジェクトを返すときは、不透明な COM オブジェクトを取得します。
COM オブジェクトの内容を取得するにはどうすればよいですか? または、C#.NET から IE を呼び出すためのより良い方法はありますか?
wpf - サイズ変更可能なウィンドウから最小化ボタンと最大化ボタンを削除するにはどうすればよいですか?
WPFには、サイズ変更を許可するウィンドウはありませんが、最大化または最小化ボタンはありません。サイズ変更可能なダイアログボックスを作成できるように、このようなウィンドウを作成できるようにしたいと思います。
解決策はpinvokeを使用することを意味することは承知していますが、何をどのように呼び出すかはわかりません。pinvoke.netを検索しても、必要なものとして私に飛び出したものは何も見つかりませんでした。主に、WindowsフォームがそのウィンドウCanMinimize
にCanMaximize
プロパティを提供しているためです。
誰かが私にこれを行う方法を教えたり、コード(C#を推奨)を提供したりできますか?
c# - HBITMAP から .NET の Bitmap クラスに変換する方法は?
関数を使用してビットマップを作成し、ハンドルCreateDIBSection
を返すC++ コードを使用しています。HBITMAP
この情報を .NET アセンブリに取り込む最良の方法は何ですか?
.net - .NET CF 2.0 では、グローバル キーボード フックは、キーを押す必要がある P/Invokes に干渉しますか?
詳細: Windows CE 4.2、Compact Framework 2.0 SP1 を実行するカスタム モバイル デバイス。今まで問題なく P/Invokes を適切に使用する C# アプリ。
低レベルのキーボード フック (この CodeProject の投稿と似ていますが、同一ではありません) を作成しましたが、これは 1 つの例外を除いて驚くほど機能します。私たちのソフトウェアが行うことの 1 つは、Windows CE の画面調整機能へのアクセスを許可することです。これは、一連のターゲットをタップする必要がある画面であり、最後に Esc を押してキャンセルするか、Enter を押して受け入れます。この機能は P/Invoke を介して呼び出しますが、この Win32 API 関数内で発生するキー押下は、私のキーボード フックによって妨害されていると思います。
私のキーボード フックは集中的なことは何もせず、実行フローも変更しませんが、この 2 つの使用法は根本的に互換性がない可能性があると思います。この画面を実行した後にデバッガーを終了すると、すべての Enter キーを押して、プログラムを閉じるときに一度にすべての「ヒット」を試みました (このデバイスはカチカチというタイピング音を出します)。これは、フックがキープレスを Win32 API 関数に適切に渡していないことを示しています。何かご意見は?
a) キーボード フックとキーボードを必要とする P/Invokes に互換性がない、
b) キーボード フックの実装に問題がある、
c) ハードウェアの製造元、ドライバーなどにまったく依存していると思いますか?
ご協力いただきありがとうございます!
c# - DMProcessConfigXML を使用して Windows Mobile デバイスをプロビジョニングするにはどうすればよいですか?
Windows Mobile デバイスをプロビジョニングする C# プログラムを作成したいと考えています。DMProcessConfigXMLという関数に関する MSDN ドキュメントを見つけましたが、この関数の使用方法に関する説明はありません。
Windows Mobile アプリでこの機能を使用するにはどうすればよいですか? pinvokeの使用に関係があると思われます。
ありがとう、
ポール
.net - .NET WinForms: ウィンドウ ハンドルを必要とする API 呼び出しを使用する方法は?
短縮版
ウィンドウ ハンドルが有効なままであることを保証できない場合、API 呼び出しを使用するにはどうすればよいですか?
私は自分のフォームへの参照を保持していることを保証できます (そのため、フォームは破棄されません)。これは、フォームのハンドルが常に有効であることを保証するものではありません。
フォームが破棄されていないにもかかわらず、フォームのウィンドウ ハンドルが無効になるのはなぜですか?
フォームの基になる Windows ウィンドウが破棄され、再作成されたためです。
ロングバージョン
hwnd (ウィンドウへのハンドル) を必要とする API を P/Invoke したい。hWnd を必要とする API 呼び出しの例を次に示します。
IVRWindowlessControl::SetVideoClippingWindow
IProgressDialog::StartProgressDialog
注:これらの API 呼び出しの中には、同等のものを管理しているものもあれば、管理していないものもありますが、その事実は私の質問には関係ありません。
説明
これらの API 関数のいずれかを呼び出すことができますが、これには長期的なウィンドウ ハンドルが必要です。
上記の SendMessage の呼び出しは、ウィンドウ ハンドルが管理されていないため、危険であることが示唆されています。彼らは、hwnd を HandleRef オブジェクトにラップすることを提案しています。
こうすることで、ウィンドウ ハンドルは、SendMessage の呼び出し中に有効であることが保証されます。しかし、いつもそのようにうまくいくとは限りません。次の API 呼び出しでは、ウィンドウ ハンドルに長時間アクセスする必要があります。
ハンドルを HandleRef でラップしても、(その後の秒、分、時間、日、週、月、または年で) フォームのウィンドウ ハンドルが無効になる可能性があります。これは、フォームの基になる Windows ウィンドウが破棄され、新しいウィンドウが作成されたときに発生します。これは、HandleRef でフォームのハンドルを保護したにもかかわらずです。
フォームのハンドルが無効になる1 つの方法を挙げることができます。
フォームのウィンドウが再作成され、古い hwnd は無効になります。
問題は、ウィンドウ ハンドルを必要とする API 呼び出しを使用する方法です。
できませんか?
私は答えを期待しています:あなたはこれを行うことはできません. フォームのハンドルを保持する必要がある限り有効であることを保証するために、フォームのハンドルを保護するためにできることは何もありません。
これは、ハンドルがいつ破棄されるかを知る必要があることを意味するため、Windows にそれを手放すように指示できます。
新しいハンドルが作成されると、次のように通知されます。
ただし、そのような祖先メソッドは存在しません。
別の質問:ウィンドウのハンドルがいつ破棄されようとしているのか、いつ作成されたのかを知るためにオーバーライドできるメソッドはありますか?
ハンドルを再作成する .NET WinForms カプセル化を破らなければならないのは醜いですが、それが唯一の方法ですか?
アップデートワン
フォームのClose / OnCloseイベントを処理するだけでは不十分です。
- IDisposable の処理
- フォームを固定する GC
フォームを閉じたり破棄したりせずに、フォームの基になるウィンドウ ハンドルを無効にできるためです。例えば:
注: Windows ウィンドウ ハンドルは破棄しますが、破棄はしません。.NET のオブジェクトは破棄されるものです。Form オブジェクトの場合は、Windows ウィンドウ ハンドルの破棄が必要になる可能性が高くなります。
Windows は Microsoft の製品です。
ウィンドウはメッセージ ループを伴うもので、画面に何かを表示することがあります。
アップデート 2
me.yahoo.com/a/BrYwgは、 NativeWindowオブジェクトを使用して、メッセージをリッスンするために使用される hWnd を必要とするアイテムのリスナーとして機能することについて良い提案をしました。これは、次のようないくつかの問題を解決するために使用できます。
- SetClipboardViewer
- タイマー設定
- IProgressDialgo::StartProgressDialog
- Shell_NotifyIcon
しかし、うまくいきません
- AnimateWindow
- メッセージを送る
- IVRWindowlessControl::SetVideoClippingWindow
c# - win32 DLL を .NET アセンブリに埋め込んで、P/Invoke を使用して呼び出すことはできますか?
DLL として持っているサードパーティのネイティブ ライブラリ用の C# ラッパーを作成しています。新しいアセンブリ用の単一の DLL を配布できるようにしたいと考えています。win32 DLL を .NET DLL に組み込み、P/Invoke を使用して呼び出すことはできますか? もしそうなら、どのように?
windows - P/Invoke で Win32 DLL のバージョンを修正しますか?
DBGHELP.DLL を呼び出す P/Invoke コードがあります。署名は後で pinvoke.net に追加します。
Windows 2003 に同梱されている DBGHELP.DLL のバージョンは古すぎます。私のコードには、「Debugging Tools for Windows」バージョン 6.9 に同梱されている DBGHELP.DLL のバージョンが必要です。
次のいずれかを行うにはどうすればよいですか?
- DllImport に最小バージョンが必要であることを確認してください。
- 読み込まれる DLL を見つけて、そのバージョン番号を取得します。FileVersionInfo を使用する必要がありますが、P/Invoke が使用する検索順序を確認するにはどうすればよいですか?
つまり、FileVersionInfo を使用して最小バージョン情報をチェックする堅牢なコードを持っている人はいますか?