問題タブ [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# - Web サービスは asp.net では機能しますが、IIS では機能しません
DLLImport を使用してアンマネージ コードにアクセスする Web サービスを構築しました。このサービスは ASP.NET サーバーで正常に動作しますが、IIS から実行するとアプリケーションでエラーが発生します。アクセス許可を確認し、DLL を system32 フォルダーに移動しました。他に何をすべきかわかりません。サービスは IIS で実行する必要があります。私は何をすべきか?
c# - ポインターが関係しているときに P/Invoke する方法
C# で PInvoke を使用する方法を学習しようとして、単純な値の型を含むポインターを使用するさまざまなケースを処理する方法が少しわかりません。
アンマネージ DLL から次の 2 つの関数をインポートしています。
最初の関数はポインターを入力として使用し、2 番目の関数は出力として使用します。それらの使用法は、C++ ではかなり単純です。
C# での最初の試行では、次の P/Invokes が発生します。
これらの関数を上記の C++ コードと同じ方法で C# で使用するにはどうすればよいですか? おそらく を使用して、これらの型を宣言するより良い方法はありMarshalAs
ますか?
c# - C# 初心者: DNS ルックアップを実行するようにこのコードを修正するにはどうすればよいですか?
C# を使用するのはこれが初めてなので、私は自分の要素から非常に外れています。しかし、ここ Stack Overflow の素晴らしい人々が私を助けてくれると信じています。インターネット上で見つけた他のコードに基づいて、次のコード (以下) を思いつきました。私がやろうとしているのは、特定のドメインのすべての「テキスト」DNS レコード (TXT) を検索することです。Visual C# 2008 Express のコンソール アプリケーションで google.com のレコードを検索するという単純な作業から始めました。コマンド ライン パラメータに基づいてドメインをカスタマイズすることについては後で考えます。今のところ、これを機能させたいだけです。どの DNS ルックアップ ツールでも、google.com の DNS にこの DNS テキスト レコードがあることがわかります
v=spf1 include:_netblocks.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all
。これが私のコードです:
このコードを実行すると、Value: ?
. これが実際に DNS クエリを実行し、期待どおりの結果を得たことを意味することを願っていますが、IntPtr を文字列の配列に変換しようとする部分で何かを台無しにしてしまいました (難しいと推測しているため)。前者をデバッグします)。とにかく、提案はありますか?私がどこで失敗したか、誰にもわかりますか?前もって感謝します。
c++ - Dllimportは古いBorlanddllをインポートできません
私は現在、Borland C++3.0の時代遅れのインストールを使用してコンパイルしている多くのレガシーコードを持っています。
このコードには、C#.NETアプリケーションで抽出して使用したいルールエンジンがあります。
ルールエンジンを独自のDLLに抽出する場合、移植する時間がない既存のレガシーコードとC#.NETアプリの両方からこのDLLを呼び出せるようにする必要があります。
古いBorlandコンパイラを使用してDLLをビルドすると、C#.NetプロジェクトからDLLを参照する方法がわかりません。DllImportはBadImageFormatExceptionで失敗します。この例外をグーグルで検索すると、64ビット対応のプログラムをコンパイルして32ビットをロードするときに、ほとんどの人がこの問題に遭遇することがわかります。つまり、16ビットDLLを生成していると合理的に確信しており、これに対する回避策はないようです。
32ビットコンパイラとリンカを備えた新しいBorland5コンパイラをダウンロードできますが、それでも同じ問題が発生するため、おそらくそこにも問題があります。
これは私のC#呼び出しコードです
これは私のDLLコードです
私のコンパイラフラグとリンカフラグはすべて完全な当て推量です-これが私の主な問題であることを願っています
DLLコードが__stdcall、extern"C"などで装飾されていないことに気づきました。Borland C ++ 3.0が、必要な種類の呼び出し規約を強制するために理解している正しい記号のセットを見つけることができないようです。
だから、質問:
1)DllImportはBorland C ++ 3.0から生成されたコードを処理できますか?1b)そうでない場合、Borland C + 5.5.1コンパイラで動作するようにコードを移植し、DllImportを動作させることができますか?
2)問題を解決できますか?DLLコードを.NETに移植した場合、古いBorlandコードを取得して呼び出すことができるでしょうか。
3)この古いBorlandプロジェクトから必要なコードを簡単に抽出できる革新的なソリューションは他にありますか?
c# - String Marshaling を使用した LogonUser の DLLImport の何が問題になっていますか? [C#]
奇妙な理由で、LogonUser DLLImport
パラメーターをマーシャリングすると、ログオン タイプを使用しているときに正常にログインできなくなりましたが、INTERACTIVE
ログオン タイプで機能しNETWORK
ます。
これは私のコードです:
現在、LogonUser への呼び出しは失敗しています ( ) ですが、から sLogon Exception: Logon failure: unknown user name or bad password
を削除すると正常に動作し、切り替えても正常に動作するのはなぜですか?[MarshalAs(UnmanagedType.LPStr)]
DLLImport
LogonType.NETWORK
INTERACTIVE
悲しいことに、これをマーシャリングする必要があるなどの他の機能で使用するため、それを保持する必要がありLoadUserProfile
ます(それを機能させ、不明なウィンドウ文字[四角]を表示しない唯一の方法)。正しく検証するには、文字列のファンキーなマーシャリングなどを行う必要がありますか?
どんな助けでも大歓迎です。ありがとう、
c# - 空きメモリはメモリ ブロックをクリアしません
DllImport を使用して、自分の .net クラスから C ラッパー ライブラリのメソッドを呼び出しています。c dll のこのメソッドは、文字列変数を作成し、文字列のポインターを返します。
このようなもの;
次に、Marshall.PtrToStringAnsi(ptr) を使用して文字列を読み取ります。文字列のコピーを取得したら、free(ptr) を呼び出す C ラッパー ライブラリにある別の C メソッド HeapDestroy を呼び出すだけです。
これが質問です。最近、魔法のように機能しているときに、「保護されたメモリ領域の読み取りまたは書き込みを試みました」という例外が発生し始めました。より深い分析の後、私は、このポインターに対して無料のメソッドを呼び出しても、ポインターの値がクリアされず、ヒープが無人でいっぱいになり、iis ワーカー プロセスがこの例外をスローするようになると信じています。ちなみに、このメソッドをcライブラリで呼び出しているのはWebサイトプロジェクトです。
この問題について助けていただけませんか?
もちろん、これは C# コードです。
c# - p/invoke で使用できるように C++ 関数を設定する方法は?
これが脳みそで簡単な質問であることを願っていますが、これは私の C++ に関する専門知識の欠如を示しています。私は C# プログラマーであり、過去に他の人の C++/C dll を使用して P/Invoke で広範な作業を行ってきました。ただし、今回はラッパー C++ dll (アンマネージ) を自分で作成することにし、C# からラッパー dll を呼び出しています。
私がすぐに直面している問題は、p/invoke で見つけられる C++ 関数を定義できないことです。これの構文が何であるかはわかりませんが、これまでに試したことは次のとおりです。
もともと私はこれを持っていましたが、どちらも機能しませんでした:
そして、C# 側では、次のようにしています。
すべてがコンパイルされますが、この C# p/invoke 呼び出しを実行すると、System.EntryPointNotFoundException: Unable to find an entry point named 'TestFunc' in DLL 'Plugins\TestDLL.dll' が発生します。
確かに、これは構文を知らない C++ 側では信じられないほど単純なものに違いありません。
c++ - Windows Dll を C++ Visual Studio 2008 の .lib に変換する
Dll to lib というツールがあることは知っていますが、開発者は $1000 を要求しています。変換する必要があるライブラリは 1 回だけなので、その価格を正当化するのは簡単ではありません。
IMPLIB32.EXE を試しましたが、空の .lib ファイルしか取得できません。どうすればこれを達成できますか? おそらく私は簡単な変換アプリを書くことができますか?
追加1:
Dll は通常、cdecl ではなく stdcall であり、C#、.NET、C++ ではなく、古い C のような言語で記述されています。C++ アプリからそれらを呼び出す必要があります。例としては、SQLite.dll または zlib.dll があります。これらの dll の .lib ファイルにアクセスできません。
追加2:
VS2008 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/用にこのコードを書き直し 、ここからダウンロード可能なサンプル Dll などを含めました: http://www.transferbigfiles.com/Get .aspx?id=7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a これにより、DLL を作成するプロジェクトが作成されます。Dll をコンパイルしようとすると、リンカ エラーが発生します: AddShow.dll : 致命的なエラー LNK1107: 無効または破損したファイル: 0x300 で読み取れません /2006-March/000664.html 進め方 がわからない。これまでのところ、とても近い
次はこの方法に移ります
http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/
引数 /exports C:\path\to\AddShow.dll を指定して dumpbin を実行すると、まったく何も実行されません いくつかの調査の後
http://msdn.microsoft.com/en-us/library/aa446532.aspx common/ide フォルダから mspdb71.dll (現在は mspdb80.dll) が必要なようです。
致命的なエラー LNK1106: 無効なファイルまたはディスクがいっぱいです: 0x6179A をシークできません これらのスレッドは、dumpbin.exe のバージョンが問題である可能性があることを示唆しています
Microsoft (R) COFF/PE Dumper バージョン 9.00.30729.01 を持っています
そこで、Microsoft (R) COFF Binary File Dumper Version 5.12.8078 を試しましたが、成功しませんでした。多くの読書の後、私は近くにいません
http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal -error-lnk1106-invalid-file-disk-full.html
ProcMon を実行すると、svchost.exe がそれを開こうとして、エラー PATH NOT FOUND で失敗したときに、queryopen と sqlite3.dll の最初の出現が表示されます。パスは C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\SQLITE3.DLL であり、正しいものです。C ドライブのルートに置くと、NAME NOT FOUND エラーが発生します。
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe.Local
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\dumpbin.exe.Local
それぞれlink.exeとdumpbin.exeから。私は Vista ではなく XPSP3 を使用していますが、これが sysinternals に関する私の知識の限界です。これらの .local ファイルは何ですか?
(csrss.exe もいくつかのマニフェスト ファイルを見つけることができません。)
まだ成功していないので、謎が増えるだけです
追加 3:
インストールされた場所 \Program Files\Microsoft Visual Studio 8\VC\bin から dumpbin.exe を実行しようとしましたが、OS は mspdb80.dll が見つからないと言いました。\Program Files\Microsoft Visual Studio 8\Common7\IDE から mspdb80.dll をコピーして、dumpbin.exe を実行しようとしました。
「c1902 プログラム データベース マネージャーが一致しません。インストールを確認してください」というエラーが表示されるようになりました。
\Program Files\Microsoft Visual Studio 8\VC\bin から mspdb80.dll を削除すると、エラーはなくなります。しかし、dumpbin.exe を実行できません。
追加された 4:
次のファイルをフォルダーにコピーすることで、最終的に dumpbin を実行することができました。
dumpbin.exe link.exe lib.exe mspdb80.dll
エラーが発生しました:
致命的なエラー LNK1248: 画像サイズ (FFFFFXXX) が最大許容サイズ (80000000) を超えています
一度ですが、dllを置き換えると修正されました。ひょっとして腐敗したのでは?
次に、手順の次のステップに進みました: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/ http://support .microsoft.com/kb/131313 で、次のエラーが表示されました: ターゲット プラットフォームでサポートされていない警告 lnk4017 ステートメントは無視されました これは、.def ファイルではなく .dll を指定したことが原因であることが判明しました。
結果の .Lib および .exp ファイルは、VS2008 プロジェクトに追加され、コンパイルおよび実行されます。デバッガーはエラーを報告しました: 実行時チェックの失敗 #0 - ESP の値は、関数呼び出し全体で適切に保存されませんでした...
ここで述べたよう に、GameSpy lib の C++ コードからの C# コールバックが成功した後、「Run-Time Check Failure #0 - ESP の値が関数呼び出し全体で適切に保存されませんでした」 は、dll で stdcall を使用し、__cdecl を宣言したためです。アプリ。
したがって、これを __stdcall に変更すると、修正されるはずですが、残念ながらそうではありません。
リンク エラーが表示されるようになりました: error LNK2001: unresolved external symbol _AddTwoNum@12
これは何らかの理由で装飾された関数名です。なんで?
追加された n:
これは、STDCALL 関数を持つ dll を使用して .lib ファイルが作成されたためであることが判明しました。STDCALL は、呼び出し元がスタックをクリーンアップすることを要求するため、引数のバイト数が @ 記号で関数名に追加されます。この場合、合計 12 バイトの 3 つの 4Byte iinteger がありました。
CDECL 呼び出し規約で作成された dll から .lib ファイルを作り直したら、すべて問題ありませんでした。
dll - ネイティブ DLL エクスポート関数ビューアーはありますか?
関数名とそのパラメーターのリストを表示する無料のネイティブ Windows DLL エクスポート関数ビューアーはありますか?