一般的に、VB と VC 間で一緒にプログラムするには 3 つの方法があります。1 つは VC で DLL を生成し、その DLL を VB で呼び出す方法です。1 つは、VC で ActiveX コントロール (.ocx) を生成し、それを VB に挿入する方法です。もう 1 つは、VC で DLL を作成し、VB で ActiveX オートメーション サーバーを生成し、それを VB で呼び出すことです。比較的に、最初の方法は VC プログラマーにとって最も要件が低いですが、パートナーの協力が必要です。私はこの方法をお勧めします。
まず VC++ プログラミングについて話しましょう。まず、VC++ で Win32 DLL プロジェクトを生成します。 VB ユーザーが呼び出せるように、このプロジェクトにいくつかの関数を追加します。 DLL 内の関数を VB で呼び出すには、2 つの条件を満たす必要があります。1 つは呼び出しメソッドが stdcall であること、もう 1 つはエクスポートされる必要があることです。最初の操作を実行するには、関数宣言の前に __stdcall キーワードを追加するだけです。のように:
short __stdcall サンプル(short nLen, short *buffer)
2 番目の行を実行するには、*.def ファイルに次の行を追加する必要があります。
輸出
サンプル@1
ここのサンプルはVBで呼び出したい関数名、@1はDLL内の関数番号を表しており、関数ごとに異なります。ここでの関数名では大文字と小文字が区別されることに注意してください。大量のデータを転送する必要がある場合は、配列を使用して VB にデータを保存し、その配列のサイズとアドレスを VC に渡すことができます (VB でのプログラミング方法については、後で説明します)。以下で紹介します)。上記の例と同様に、nLen は配列サイズ、buffer は配列アドレスです。この 2 つの項目を使用すると、VC 配列のように処理できます。出力グラフィックスについては、WMF または BMP 形式を生成し、VB で呼び出すことができます。ただし、VB が VC にウィンドウハンドル hWnd と hDC とウィンドウの描画位置 (VB と VC で使用する座標系が一致している必要がある) を渡せば、ウィンドウに直接出力することもできると思います。 VB の AutoRedraw プロパティは False である必要があり、VC 描画プログラムは Paint イベントで呼び出されます。
もう一度 VB プログラミングについて話しましょう。 VB が DLL を呼び出す方法は、一般的に VB 書籍で紹介されている Windows API を呼び出す方法と同じです。上の例では、まず VC 関数を宣言します。
関数サンプル Lib "mydll.dll" (ByVal nLen As Integer、buffer As Integer) As Integer を宣言
ここで、mydll.dll は DLL の名前です。お気づきかもしれませんが、最初のパラメータに ByVal が追加され、2 つのパラメータが異なる方法で宣言されています。ルールは次のとおりです。パラメータが VC でポインタまたは配列として宣言されている場合、ByVal は追加されません。それ以外の場合は、ByVal が追加されます。 VB でこの関数を呼び出すには、次の構文を使用します。
サンプル 10、a(0)
ここでの a() 配列はデータの格納に使用され、10 は配列の長さです。ここでの 2 番目のパラメーターは a() にすることはできませんが、渡されるデータの最初のパラメーターである必要があります。これが VB プログラミングの鍵です。
以下に、発生する可能性のある問題をいくつか示します。 1 つの問題は、VB が DLL が見つからないと報告する場合があることです。DLL をシステム ディレクトリに配置して、VB の Declare ステートメントが正しいことを確認できます。もう 1 つの問題は、VB が必要な関数が見つからないと報告することです。これは通常、*.def ファイルが VC に設定されていないことが原因です。 3 番目の状況は、VB が変換を実行できないことを通知することです。これは、__stdcall キーワードが VC に追加されていないか、VB と VC のパラメーターの型が一致していないことが考えられます。VC の int は 4 であることに注意してください。バイト (VB Long に相当) ですが、VB の Integer はわずか 2 バイトです。 VB と VC のパラメータの数が同じであり、それらが占めるバイト数も同じであることを確認する必要があります。最後に注意すべきことは、配列が VC の境界を超えてはいけないということです。超えないと、VB プログラムがクラッシュします。
1. DLLを呼び出すメリット
Windows オペレーティング システムの基盤として、ダイナミック リンク ライブラリ (DLL) は優れたアプリケーション パフォーマンスを備えています。
DLL はアプリケーションの機能を拡張します。 DLL はプロセスのアドレス空間に動的にロードされるため、アプリケーションは実行時にどの操作を実行する必要があるかを判断し、必要に応じてそれらの操作を実行するための適切なコードをロードできます。
DLL はさまざまな言語で作成できます。たとえば、VB はアプリケーション プログラムのインターフェイスを作成するために使用され、C++ はアルゴリズムや通信などの基礎となる操作を作成するために使用されます。
DLL を使用すると、ソフトウェア プロジェクトの管理が簡素化されます。ソフトウェア開発中に異なる作業グループが異なるモジュールに取り組むと、プロジェクトの管理が容易になります。
DLL はメモリの節約に役立ちます。 2 つ以上のアプリケーションが同じ DLL を使用する場合、DLL のページを RAM に一度入れるだけで済み、すべてのアプリケーションが個々のページを共有できます。
DLL を使用すると、リソースの共有が容易になります。 DLL には、ダイアログ テンプレート、文字列、アイコン、ビットマップなどのリソースを含めることができ、複数のアプリケーションが DLL を使用してこれらのリソースを共有できます。
DLL はアプリケーションのローカライズに役立ちます。たとえば、コードのみが含まれ、ユーザー インターフェイス コンポーネントが含まれていないアプリケーションは、ローカライズされたユーザー インターフェイス コンポーネントを含む DLL をロードできます。
DLL は、プラットフォームの違いを解決するのに役立ちます。 Windows のバージョンが異なれば搭載される機能も異なり、開発者は新しい機能を呼び出したい場合がよくあります。ただし、ソース コードに新しい関数の呼び出しが含まれており、その関数を提供しないバージョンの Windows でアプリケーションを実行する場合、オペレーティング システムのローダーはプロセスの実行を拒否します。これらの新しい関数が DLL に保存されている場合、アプリケーションはそれらを古いバージョンの Windows にロードして、関数を正常に呼び出すことができます。
2. DLL のエントリ ポイントを見つける
初めて DLL に触れるユーザーは、よく問題に遭遇します。VC 環境で作成された DLL は VC では正常に動作しますが、VB アプリケーションで呼び出すと、常に「呼び出し規則エラー」または「エントリが見つかりません」と表示されます。ポイント」エラー。これは主に以下の欠落が原因です。
まず、DLL での関数宣言と VB での関数宣言は、名前、戻り値の型、パラメーターの型、パラメーターの数などの点でまったく同じである必要があることに注意してください。特に注意してください。大文字化。
次に、エントリ関数を DLL の .def ファイルに追加する必要があります。
最後に、extern "c" キーワードと _stdcall キーワードを関数定義の前に追加する必要があります。
具体的なフォーマットについては応用例を参照してください。
3. DLLで配列パラメータを渡す
DLL は低レベルの操作を実行するためによく使用されるため、アプリケーションは多くの場合、大量のデータを DLL に渡す必要があります。 C++ では、配列操作にはポインターが最適ですが、VB にはポインターの概念がありません。通常、これは 2 つの方法で解決できます。
まず、VB で DLL を宣言するときは、byval の代わりに byref を使用して配列ポインタを DLL に渡します。
さらに、配列をバリアントとして宣言することで、配列を DLL に直接渡すことができます。
4.応用例
以下では、特定の例を使用して、VC 環境で作成された DLL を VB で呼び出すプロセスを説明します。
フーリエ計算用の関数「Fourier」を含む信号処理用 DLL「SigPro.dll」を作成します。
VC でのステートメント:
次のコードを「SigPro.h」に追加します。
次のようにコードをコピーします。
外部「C」
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
次のコードを「SigPro.cpp」に追加します。
外部「C」
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
int i;
倍の結果 = 0.0;
if(SinOrCos==true)
{
for(i=0;i<NumSam;i++)
{
result=結果+*(サンプル+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
それ以外
{
for(i=0;i<NumSam;i++)
{
result=結果+*(サンプル+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
結果 =結果*2/NumSam;
結果を返します。
}
次のコードを「SigPro.def」に追加します。
輸出
フーリエ
VB での呼び出しステートメント:
関数 Fourier Lib "SigPro" (ByRef Sample() As Long、ByVal NumSam As Integer、ByVal OvertoneOrder As Integer、ByVal SinOrCos As Boolean) を Double としてパブリックに宣言