12

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 を宣言したためです。アプリ。

extern "C" { // put Dll C function prototypes here
 int __cdecl AddTwoNum(int n, double f); // __stdcall
}

したがって、これを __stdcall に変更すると、修正されるはずですが、残念ながらそうではありません。

リンク エラーが表示されるようになりました: error LNK2001: unresolved external symbol _AddTwoNum@12

これは何らかの理由で装飾された関数名です。なんで?

追加された n:

これは、STDCALL 関数を持つ dll を使用して .lib ファイルが作成されたためであることが判明しました。STDCALL は、呼び出し元がスタックをクリーンアップすることを要求するため、引数のバイト数が @ 記号で関数名に追加されます。この場合、合計 12 バイトの 3 つの 4Byte iinteger がありました。

CDECL 呼び出し規約で作成された dll から .lib ファイルを作り直したら、すべて問題ありませんでした。

4

9 に答える 9

6

私は彼の答えにコメントすることはできません (もっと評判が必要ですか?) 。

于 2009-10-08T20:14:17.977 に答える
5

リンクするlibファイルにアクセスせずに、C/C++のdllでいくつかの関数/メソッドを呼び出したいと想定しています。

必要な関数のシグネチャがわかっている場合は、次のことができます。

  • dll の独自のスタブ バージョンを作成する
  • 使用するdllと同じ名前でdllプロジェクトを作成します
  • 呼び出したい関数のスタブ実装を追加する
  • 署名は非常に重要です。depends.exe または dumpbin.exe を使用して一致を確認してください。
  • 次に、プログラムを作成/ビルドして、スタブ dll にリンクします。
  • プログラムを実行するには、スタブ dll を実際のものに置き換えます
于 2009-10-08T15:31:43.943 に答える
4

LoadLibrary()GetProcAddress( )を使用して、動的な方法を使用することもできます。

(例については、2 番目のリンクを参照してください)。

于 2009-10-08T19:52:03.683 に答える
1

この例はすぐに見つかりました: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/

于 2009-10-08T20:47:35.447 に答える
1

zlib や sqlite などの場合、ソースを直接ダウンロードして独自の lib ファイルをコンパイルできます。実際、私は先日zlibのためにこれを行いました.www.zlib.netからソースをダウンロードし(直接zlib 1.2.3ダウンロード)、提供されたビジュアルスタジオプロジェクトファイルを開き、libのデバッグバージョンとリリースバージョンの両方をコンパイルしました。私は sqlite を試したことはありませんが、ソースがあるので難しくはないはずです。

それが独自の dll である場合は、元の開発者または会社に lib ファイルを依頼するか、提案された独自のスタブ dll を作成するか、RaphaelSP の動的ルートを使用することができます。

それらが C でエクスポートされている場合 (C++ 名マングリングなし)、私は自分で動的ルートに進みます。

于 2009-10-08T20:08:36.973 に答える
0

これはおそらく変換を行う無料のツールです。「限定試用版」のように「無料」なのかどうかはわかりませんが、情報はあまり明確ではありません。すでにこれをテストしている場合は、質問を編集してください。この回答を削除します。

于 2009-10-08T09:02:46.223 に答える
0

オープンソースのedllには、独自の内部 COFF ローダーがあります。edll はまったく異なる目的で作成されていますが、内部に独立した COFF ローダーがあるため、おそらく .dll を .exe 内のバイナリ ストリームまたはリソースに組み込み、実行時に edll の COFF ローダーを使用して組み込みの dll をロードすることが可能です。 .

于 2013-01-05T22:49:51.693 に答える
0

Dll to lib ツールの開発者に連絡すると、割引を提供してくれる可能性があります。

私は以前にこのような状況に陥ったことがあり (高価なツールが必要だったのは 1 回だけでした)、時には大幅な値引きに成功したこともあります。

試してみることは決して悪いことではありません。

幸運を。

于 2009-10-08T19:56:34.067 に答える
0

http://wyw.dcweb.cn/dllfaq.htmの詳細を使用して、DLL からライブラリを取得することに成功しました。走行距離は異なる場合があります。これを使用して、Python DLL から lib を取得し、'C' で記述されたいくつかの Python 拡張機能を構築しました。

于 2009-10-14T11:22:11.647 に答える