本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[VB2] CDK:Visual Basic の配列を DLL でアクセスするサンプル

文書番号: 402577

最終更新日: 1999/03/21


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP402577

概要

この資料は、Visual Basic 側で確保した配列を C で作成する DLL 内で
アクセスするの一つの方法を紹介したものです。
この方法を実現するには、Visual Basic for Windows 2.0 Pro に添付の Control
Development Kit (以下 CDK) が必要です。

詳細

Visual Basic for Windows 2.0 からサポートしている以下の関数を使った
サンプルです。CDK (VBAPI.H, VBAPI.LIB) が必要です。
    VBArrayBounds       配列の上限と下限を取得します。
    VBArrayElement      配列の要素へのポインタを取得します。
    VBArrayElemSize     配列の要素のサイズを取得します。
    VBArrayFirstElem    配列の最初の要素へのポインタを取得します。
    VBArrayIndexCount    配列の要素数を取得します。
  /**** サンプルコード ***********************************
  #include <windows.h>
  #include "vbapi.h"
    void LongArray (HAD hadArray)
    Visual Basic 専用 DLL 関数
    機能:
     VB から配列を受け取り、配列の次元数、1要素のサイズを表示。
     配列が LONG 型 の2次元配列の場合は、その全要素に値を代入する。
    注意: 特にエラーチェックを行っていないので、VB 側で正しく配列を
          渡さないと正常に動作しない。
          VB 2.0 用の配列関数を使用しているため、
          VB 2.0 以降のバージョンでのみ実行可能
    モジュール定義ファイル LARRAY.DEF
      LIBRARY   LARRAY
      EXETYPE   WINDOWS
      CODE      PRELOAD MOVEABLE DISCARDABLE
      DATA      PRELOAD MOVEABLE SINGLE
      HEAPSIZE  1024
      EXPORTS
      WEP PRIVATE
      LONGARRAY
    C コンパイルオプション    (Visual C++ 1.0 用)
     CL /ALw /GD
    リンクオプション        (Version 5.61 用)
     /LIB:"vbapi" /LIB:"libw" /LIB:"ldllcew" /NOD /NOE /PACKC:61440 /ALIGN:16
    VB DECLARE 文
     Declare Sub LONGARRAY Lib "LARRAY.DLL" (Ar() As Long)
    VB 配列定義
     Global Ar(64, 10) As Long
    VB 側 呼び出し方法
     LONGARRAY Ar()
  *****************************************************************/
  void __export _far pascal LongArray (HAD hadArray)
  {
      LONG   arBounds;   // 配列上限下限値取得のための作業用変数
                         // 配列上限下限 保存用変数
      UINT   arBounds1Min, arBounds1Max, arBounds2Min, arBounds2Max;
      SHORT  arIdxCount; // 配列の次元数保存用変数
      LPVOID arFirstEl;  // 配列の最初の要素を示すポインタ保存用変数
      USHORT arElemSize; // 配列の要素のサイズ保存用変数
  static char str [120]; // メッセージ出力用バッファ
      long item=0l;      // 各要素に代入する値
      UINT i, ii;        // カウンタ
      int idxes[2];      // インデックス配列
      long far *lplong;  // 各要素を指すポインタ
    // 配列の次元数の取得
      arIdxCount = VBArrayIndexCount (hadArray);
    // 配列の要素のサイズ取得
      arElemSize = VBArrayElemSize (hadArray);
      wsprintf (str, "配列の次元数\t%d\n 配列の要素のサイズ\t%u",
                                   arIdxCount,             arElemSize);
    // 配列の次元数、要素サイズの表示
      MessageBox (NULL, str, "ARRAY", 0);
      if (arIdxCount!=2) return;
      // 配列が2次元の場合のみ以下の作業を行う
      if (arElemSize!=4) return;
      // 要素サイズが4バイトの場合のみ以下の作業を行う
  // これ以降の処理は、引数 hadArray に LONG 型の2次元配列が渡されている
  // 場合にのみ有効です。
    // 配列上限下限 の取得
      arBounds  = VBArrayBounds (hadArray, 1);
      arBounds1Min = LOWORD (arBounds);
      arBounds1Max = HIWORD (arBounds);
      arBounds  = VBArrayBounds (hadArray, 2);
      arBounds2Min = LOWORD (arBounds);
      arBounds2Max = HIWORD (arBounds);
    // 先頭要素を指すポインタの取得 (使用していません)
      arFirstEl  = VBArrayFirstElem (hadArray);
    // 全ての要素に値を代入
      for (i=arBounds2Min; i<=arBounds2Max;i++)
      {
          for (ii=arBounds1Min; ii<=arBounds1Max; ii++)
          {
              idxes[0] = i;
              idxes[1] = ii;
              // 要素を指すポインタを取得
              // 配列の次元の順番が Basic と逆になっていることに注意
              lplong = VBArrayElement (hadArray, 2, idxes);
              // 要素に値を代入
              *lplong = ++item;
          }
      }
      return;
  }

Keywords: KBHOWTO KB402577
Technology: kbAudDeveloper kbVBSearch kbZNotKeyword2 kbZNotKeyword6

inserted by FC2 system