2

プログラムを開発しましたが、このプログラムを他社製の制御可能な光源で動作させようとしています。会社にメールを送信したところ、外部ライブラリを DLL として送信することに同意してくれました。

Qt 4.8.1を使用してすべてのソフトウェアを開発し、MSVC2008を使用してコンパイルしました。

制御可能なライトの DLL は Visual Studio 2008 でコンパイルされ、C++ または C# で記述されています(メーカーは不明です)。私が与えられたのは、DLL と、私がしなければならないことを示すテキスト ファイルだけです。

  1. プロジェクトへの参照として DLL を追加する
  2. using LightName;クラスの先頭に 追加
  3. オブジェクトのインスタンスを次のようにインスタンス化します。LightName *ln = new LightName();
  4. 新しく作成された LightName インスタンスで関数 void turnOn() を呼び出します。

まず、特に単純なハードウェアの場合、外部ライブラリがオブジェクトのインスタンスをインスタンス化する必要があるのは奇妙だと思います。

第二に、他の会社は私にインターフェイス ファイルを提供していません。

私の質問は次のとおり です。Qt 環境でインターフェイス ヘッダー ファイルを使用せずに、C++ DLL にリンクし、このライブラリにネストされた関数を公開するにはどうすればよいですか? 外部ライブラリのインターフェイスを作成する方法はありますか?


私はすでにQLibraryを使用して次のことを試みました。

 QLibrary myLib("mylib");
 typedef void (*MyPrototype)();
 MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
 if (myFunction)
     myFunction();

ただし、与えられたDLLはC DLLではなく、インターフェースがないため、Qtは解決する必要があるシンボルについての手がかりがないため、これは機能しません。


dumpbin /EXPORTS コマンドを使用して、DLL からエクスポートされたすべての定義を表示しようとしました。残念ながら、これは何も生成できませんでした。私は、これから何らかの混乱した C++ を取得し、それを解読して独自のヘッダーを作成できることを望んでいました。


依存関係ウォーカー(非常に便利なツール)を使用しようとしましたが、シンボルを解決して関数定義を提供することができませんでした。


4

2 に答える 2

1

「オブジェクトのインスタンスをインスタンス化する」ように依頼することは絶対に合法です。(プレーンとは対照的に)dllインターフェイスをオブジェクト指向にするのは単に彼らの設計上の決定でしたextern "C"QtCore.dllは他の誰かのDLLでもあり、あなたは常に彼らのオブジェクトをインスタンス化しています。

ただし、DLLを呼び出すのが難しくなることも意味します。シンボルは「C」シンボルではないため(クラスをそのようにエクスポートすることはできません)、QLibrary何もできません。dumpbin /EXPORTSDLLから試してから、面倒な方法でそれらをアンマングルして、クラス宣言を再構築できます。幸いなことに、あなたを助けるためのツールがあります(オンラインでも

しかし、そのようなDLLのヘッダーファイルを提供しないことは、そもそも完全に馬鹿げています。

于 2012-09-20T10:25:02.263 に答える
1

QLibrary は、ライブラリに C シンボルとしてエクスポートされた関数がある場合にのみ役立ちます。それが C++ の場合は、シンボル テーブルをダンプして、それで十分かどうかを調べることができます。名前は復号化する必要があります: dumpbin などを探してみてください。ただし、シンボルがどのように定義されているかによって、これを行うことができない可能性があります。その場合、ヘッダーを要求する必要があります:この を読んでください

于 2012-09-20T06:23:22.377 に答える