1

VC2008 から C++ Builder XE2 に移植した DLL があります。DLL は LabVIEW の TestStand で使用されます。

TestStand は、VC2008 DLL をインポートするときに、関数名とその引数を確認できます。C++ Builder DLL を使用する場合、その参照はすべて関数名であり、引数ではありません。すべてのエクスポートは C 関数であり、extern "C" declspec( dllexport ).

エクスポートを正しくする方法はありますか?

TLB ファイルを追加すればうまくいくと読んだことがありますが、これが本当なら、C 関数だけをエクスポートする TLB を作成するにはどうすればよいですか?

4

5 に答える 5

2

TestStand は、.c/.cpp ファイルを読み取り、そのファイルからパラメータを取得できます。引き続き DLL をロードし、呼び出す関数を選択します。次に、パラメーターを「確認」し、ダイアログで .c/.cpp ファイルを選択します。TestStand は同じ名前の関数を見つけて、パラメータ自体を挿入します。

関数は非常に具体的でなければなりません。TestStand は dllexport と dllimport の #defines を処理できなかったため、プロトタイプを含むダミーの .c ファイルを作成する必要がありました。非常に特殊な形式が好きです。関数の場合:

TESTAPI bool StartTest( long inNumber ) {}

どこにTESTAPIあるか、extern "C" __declspec( dllexport )またはextern "C" __declspec( dllimportダミーファイルに以下の行を書く必要がありました:

bool __declspec( dllexport ) StartTest( long inNumber ) {}

それはそれを行います。

于 2011-12-15T21:50:17.937 に答える
1

DLL 関数のパラメーターは、呼び出し規約によって装飾されていない限り (DLL で行うのは珍しいことです)、エクスポートだけでは判断できません。TLB (別名タイプ ライブラリ) が問題を解決する場合、VC2008 DLL はフラットな C DLL ではなく、インプロセス ActiveX/COM オブジェクトである可能性があります。その場合、C+Builder では、[ファイル | 新規] メニューの IDE ウィザードを使用して、[ActiveX ライブラリ] プロジェクトを作成し、次に [COM オブジェクト] をライブラリに追加できます。次に、オブジェクトを定義できる TLB を用意し、IDE は、オブジェクトの実装を入力できるスタブ コードを生成します。

それが LabViews が期待するものでない場合は、LabViews に連絡して質問することをお勧めします。フラットな C 関数を含む TLB だけが必要な場合 (TLB はオブジェクト指向であるため、これは非常に珍しいことです)、「COM オブジェクト」部分を省略して、「ActiveX ライブラリ」プロジェクトを作成するだけで必要最低限​​の機能を取得できます。 TLB を作成し、必要に応じて定義を追加してから、エクスポートをプロジェクトに追加します。

于 2011-12-14T03:09:41.840 に答える
0

ゲームには少し遅れていますが、問題は、C++ Builder がエクスポートされた関数の先頭にアンダースコアを付けていることかもしれません。コマンド ライン ユーティリティは、これを証明するのTLIBに役立ちます (tlib がまだ C++Builder に同梱されていると仮定します)。

TLIB mydll.lib, mydll.lst

結果の lst ファイルを見て、StartTestまたはが含まれているかどうかを確認します_StartTest。LabView はおそらくアンダースコアのない関数を見つけることを期待しています。

先頭のアンダースコアを抑制する DEF ファイルを C++Builder プロジェクトに追加できます。これを試して:

  1. __stdcall の代わりに __cdecl 呼び出し規約を使用します。

  2. プレーンな「C」関数をエクスポートします。C++ クラスまたはメンバー関数はありません。

  3. 関数プロトタイプの周りに extern "C" {} があることを確認してください。
  4. エクスポートされた関数を Microsoft 互換の名前にエイリアスする DEF ファイルを作成します。先頭のアンダースコアが含まれないように、名前に別名を付けます。DEF ファイルは次のようになります。

    輸出; MSVC 名 = C++Builder 名 StartTest = _StartTest Foo = _Foo Bar = _Bar

5- DEF ファイルを BCB DLL プロジェクトに追加し、再構築します。

詳細については、これらの古い記事を参照してください: http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm

逆の記事 (VC++ で作成されたアプリケーションから呼び出される C++Builder DLL の作成) は、このアーカイブに埋もれています。

http://www.frasersoft.net/program/bcbdev.zip : /articles/bcbdll.htm。DEF ファイルのトリックの詳細と、その他のオプションについて説明します。

私の答えは、1998 年ごろの状況に基づいていることに注意してください。それ以来、それらは変更されている可能性があります。ある場合、C++Builder コマンド ライン ツールの impdef、tlib、tdump、およびこれらのツールに相当する Microsoft は、DLL と MSVC の内容を正確に表示できるはずです。

H^2

于 2018-01-03T19:43:35.240 に答える