問題タブ [dllimport]
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++ から DLL 内の関数を呼び出す
VS 2008 に 2 つのプロジェクトを含むソリューションがあります。1 つは C++ で記述された DLL で、もう 1 つは空のプロジェクトから作成された単純な C++ コンソール アプリケーションです。アプリケーションから DLL 内の関数を呼び出す方法を教えてください。
空の C++ プロジェクトから始めて、という関数を呼び出したいとします。int IsolatedFunction(int someParam)
どうやって呼ぶの?
c# - DllImport と LoadLibrary のどちらが良いですか?
私は通常、c#.NET で Win32 API を使用しています。ただし、1 つのアプリケーションですべてを宣言しないでください。通常はuser32を使用することもあれば、gdi32を使用することもあります...すべてのAPI関数を宣言すると、それらは大量のメモリを使用すると思います。.NET で API を使用する最良の方法は何ですか?
c# - Visual C++ への C# クラス ライブラリのインポート
外部アプリケーションで使用する必要があるメソッドを含む C# クラス ライブラリがあります。残念ながら、この外部アプリケーションは C/C++ の外部 API のみをサポートしています。
この C# ライブラリに、整数を取り double の配列を返す takeIntReturnDoubleArray メソッドがあるとします。必要なのは、整数を受け取り、C# ライブラリを呼び出し、呼び出し元のアプリケーションに double の配列を返す C++ メソッドを用意することだけです。
したがって、本質的に C++ ライブラリは、C# ラッパーと外部アプリケーションの間の仲介者として機能しているだけです。
これを行う簡単な方法はありますか?C++ に簡単にインポートできるようにするために、C# 側で何か特別なことをする必要がありますか? #import ステートメントを使用するという話を見たことがありますが、C++ に関しては自分が何をしているのか本当にわかりません。
ここで取るべきアプローチは何ですか?
c# - C ++ dllからC#P/Invokeへの関数のエクスポート
C#コードから呼び出したいC++dllを作成しました。1つの関数を呼び出すことはできますが、C#コードがdllを読み込もうとすると、もう1つの関数が例外をスローします。
ヘッダーは次のようになります。
これにより、エクスポートテーブルが少しわかりにくいdllが生成されます(名前フィールドでfoo = fooはどういう意味ですか?):
私のP/Invoke宣言は次のようになります。
Installの呼び出しは例外なく返されますが、PPPConnectを呼び出すと、MissingMethodExceptionが発生します-「PInvokeDLL'PPPManager.dll'にエントリポイント'PPPConnect'が見つかりません。」
Install関数宣言からexternおよびdeclspecディレクティブを削除しようとしました。これにより、エクスポートされる関数はPPPConnectだけになりますが、それでもPPPConnectを呼び出すことはできません。
また、序数でDllImportを実行してみました。これにより、名前で呼び出すのと同じ結果が得られます。Installは戻りますが、PPPConnectは「エントリポイント'#2'が見つかりません...」という例外をスローします。
相互運用ログは次のようになります。
これは私の専門分野から大きく外れているので、どんな提案や考えも歓迎します。
ありがとう、ポール
編集:このコードは機能することがわかりました。問題は、最新のdllがデバイスに伝播されないことでした。D'oh!
c++ - 実行可能ファイルからdllへのクラスのエクスポート
実行可能ファイルで定義されたクラスを使用するには、DLLが必要です(DLLと実行可能ファイルは同じコンパイラでコンパイルされます)。しかし、このクラス定義のソースコードをDLLで使用できるようにしたくはなく、宣言のみを使用します。
これを行うための1つの可能な方法は、必要なすべてのクラスメソッドを作成することですvirtual(DLLリンカーがこれらのメソッドの定義を必要としないようにするため)。このアプローチの欠点:
- を使用して、エクスポートされたクラスのオブジェクトをDLLコードで作成できません
new(実行可能ファイルのコードで追加の関数を作成する必要があります)。 virtual必要がない場合でも、これらすべてのメソッドを作成する必要がありますvirtual。
__declspec(dllexport)Microsoftのstorage-class拡張属性を使用して、DLLから実行可能ファイルにクラスをエクスポートする方法があります。同じ手法を使用して、実行可能ファイルからDLLにクラスをエクスポートする方法はありますか?
私の古いBorlandC6コンパイラでは、実行可能プロジェクトのビルド中にインポートライブラリを作成できません。(したがって、DLLをコンパイルするときに、リンカーは、インポートされたすべての非仮想クラスメソッドに対して未解決の外部エラーメッセージを表示します。)これは、まさにこのコンパイラの制限ですか、それとも重要な何かが欠けているのでしょうか。
c# - C# プログラム (プロセス) がアンロードされない
別のアセンブリのクラスを使用する C# プログラムがあり、このクラスはアンマネージ DLL を呼び出して何らかの処理を行います。ここにスニペットがあります:
私が抱えている問題は、「Func」を呼び出すと、メインの C# プログラムがアンロードされないことです。メイン フォーム内で Close() を呼び出すと、タスク マネージャーを見るとプロセスが残っています。「Func」への呼び出しを削除すると、プログラムは正常にアンロードされます。私はいくつかのテストを行いましたが、プログラムの Main 関数は確実に返されるので、ここで何が起こっているのかわかりません。
asp.net - P/ASP.NET で [DllImport] を呼び出す
DLLImport を使用するときに同時実行性に問題があります。Web 経由で送信する必要があるレポートを提供する Dll があるので、次のようにします。
Dll 側には、レポートと共にパスを返す多くの変数とインスタンスがあります。
私が今持っているコードは PrintRep の呼び出しをロックしていますが、これは機能しますが、明らかに保留中の要求を待機させます。これをロックなしで機能させる方法はありますか? ロックを解除すると、「保護されたメモリに書き込もうとしています」というエラーがいくつか発生し、Dll が最終的にハングするためです。
c# - 「dll で [関数] という名前のエントリ ポイントが見つかりません」(c++ から c# への型変換)
C++ で書かれたサードパーティ製の dll があります。dll のドキュメントからの情報を次に示します。
説明: 関数の結果を受け取るためのデータ構造。すべての関数の結果は Unicode (UTF-8) として保存されます。
方法:
入力:
この関数が認識する画像の場所のフルパス
関数の結果を受け取るためのデータ オブジェクト。関数の戻り値: 成功した場合は true、それ以外の場合は false が返されます。
C# アプリケーションから recoCHN_P_Name を呼び出そうとしています。この目的のために、私はこのコードを思いつきました:
dll をインポートするコード:
関数を呼び出すコード:
そして、私が得ているエラーは、「DLL 'cnOCRsdk.dll' で 'recoCHN_P_Name' という名前のエントリ ポイントが見つかりません。」C++ から C# への型の変換でエラーが発生したのではないかと疑っています。正確にはどこで ... ?
.net - 異なるエントリ ポイントを持つ DllImport (異なるプロジェクトの同じインポートに対して異なる DLL)
.NET Compact Framework のデバッグに関する最近の質問の補足として、私は現在、.NET Compact Framework と .NET Framework アプリケーションの両方から OpenGL ES を使用しようとしています。OpenGL ES 用に作成され、libGLES_CM.dll からインポートされるこのラッパーを使用します。
デバッグを容易にするために、.NET Framework アプリケーションを作成し、OpenGL ES と EGL のインポート プロジェクトを同じファイル (デスクトップ フレームワーク用にビルドしただけ) で再作成し、DLL 名の定数を作成して、libGLESv2.dll からインポートするようにしました。 Windows では libEGL.dll、CF では libGLES_CM.dll から。DLL は PowerVR OpenGL ES エミュレーション SDK (ターゲット デバイスには PowerVR SGX があります) からのものであり、実際の OpenGL 実装の単なる OpenGL ES ラッパーです。そして、ここに問題があります:
ラッパー ライブラリでは、OpenGL 関数は 2 つの静的クラス (gl と egl) にあり、通常の名前を持ちますが、gl/egl プレフィックスがないためegl.GetDisplay()、egl.eglGetDisplay(). それらは次のようにインポートされます。
これは、Compact Framework で問題なく動作します。デスクトッププロジェクトでは、 EntryPointNotFoundException がスローされます-関数の名前が次のようになっているためです_eglGetDisplay@4 (補足:WMDはブロッククォートのAlt-Gr + Qをキャッチします。これはドイツ語のキーボードレイアウトのアットマークです。これを貼り付ける必要がありました。)ディペンデンシー ウォーカーへ。
条件付きで文字列定数を空の文字列または「_」に設定し、それとエントリポイント名を連結することにより、デスクトッププロジェクトの関数名にアンダースコアを追加できましたが、CF のものには追加できませんでした。これ:
ここでは問題ありません。しかし、@4 (正確には何ですか?) がないため、関数はまだ見つかりません。@4 を追加するとうまくいきますが、ここではすべての関数の値が異なるため、これを手動で行う必要があり、CF バージョンでは数値が正しくない可能性があります。ここに奇妙な部分があります:
エントリ ポイントを指定せず、代わりに関数に名前を付ける必要がある場合、インポートは正常に機能します。これは二重の接頭辞 (静的クラス名と関数名) のために醜いですが、これにラッパーを追加するだけでこれを回避できます。私はこれらの関数に大きく依存しないので (かなり単純な 2D エンジンのみが必要です)、これは問題にはなりませんが、正しくないと感じます。
エントリ ポイントを指定すると機能しないのはなぜですか? 本来のように機能させるにはどうすればよいですか?
c# - アンマネージド dll をマネージド C# dll に埋め込む
DLLImport を使用してアンマネージド C++ dll を使用するマネージド C# dll があります。すべてがうまくいっています。ただし、Microsoft が説明しているように、マネージド DLL 内にそのアンマネージド DLL を埋め込みたい:
そこで、アンマネージド dll ファイルをマネージド dll プロジェクトに追加し、プロパティを「埋め込みリソース」に設定し、DLLImport を次のように変更しました。
ここで、「Wrapper Engine」はマネージド DLL のアセンブリ名です。「Unmanaged Driver.dll」はアンマネージド DLL です。
実行すると、次のようになります。
アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
私は MSDN とhttp://blogs.msdn.com/suzcook/からそれが可能であると見ました...