• 検索結果がありません。

Microsoft Visual Studio .NET移行ガイド

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft Visual Studio .NET移行ガイド"

Copied!
128
0
0

読み込み中.... (全文を見る)

全文

(1)

TUT-0014

Ver. 3.3

(2)

改訂履歴

Ver. 年 月 改 訂 内 容

1.0 2002年12月 新規作成

2.0 2003年 3月 Visual Basic .NETでの移行チュートリアルを追加以下のカテゴ

リに対応 ・ デジタル入出力(GPC-2000) ・ アナログ入力(GPC-3100) ・ アナログ出力(GPC-3300) 2.1 2003年5月 ・ 誤記修正 (誤) hDeviceHandle = DioOpen(lpszName, FBIDIO_FLAG_SHARE) (正) hDeviceHandle = IFCDio.DioOpen(lpszName, FBIDIO_FLAG_SHARE)

3.0 2003年7月 ・ GPIB(GPC-4301)のVisual Basic .NET移行チュートリアルを

追加 ・ 以下のカテゴリのVisual C# .NET移行チュートリアルを追 加 デジタル入出力(GPC-2000) アナログ入力(GPC-3100) アナログ出力(GPC-3300)G PIB(GPC-4301) ・その他技術情報を追加 3.1 2004年1月 ・誤記修正 3.2 2004年8月 ・ 誤記修正 ・ 技術資料一覧更新 3.3 2005年9月 ・ 誤記修正 ・ 技術資料一覧更新 本チュートリアルをご使用の際は、必ず各製品型式の最新のドキュメント(ユーザ ーズマニュアル,オンラインヘルプ)をあわせて参照してください。また、最新のド ライバソフトウェアをご使用ください。ユーザーズマニュアル, ドライバソフト ウェアは弊社Web siteからダウンロードできます。(オンラインヘルプはドライバ ソフトウェアに含まれています)

(3)

商標/登録商標 本チュートリアルに掲載されている会社名、製品名は、それぞれ各社の商標また は登録商標です。 保障の内容と制限 株式会社インタフェースはドキュメント内の情報の正確さに万全を期しています。 万一、誤記または誤植などがあった場合、株式会社インタフェースは予告無く改 訂する場合があります。ドキュメントまたはドキュメント内の情報に起因するい かなる損害に対しても株式会社インタフェースは責任を負いません。 ドキュメント内の図や表は説明のためであり、ユーザ個別の応用事例により変化 する場合があります。 著作権、知的所有権 株式会社インタフェースは本製品に含まれるおよび本製品に対する権利や知的所 有権を保持しています。 本製品はコンピュータ ソフトウェア(プログラム)、 図、 文章、 写真などを 含んでいます。 複製の禁止 株式会社インタフェースの許可なく、本製品(ドキュメント含む)の全て、または一 部に関わらず、複製、改変などを行うことはできません。 責任の制限 株式会社インタフェースは、株式会社インタフェース または再販売者の予見の有 無にかかわらず発生したいかなる特別損害、偶発的損害、間接的な損害、重大な 損害について、責任を負いません。

(4)

−目 次−

はじめに

5

第 1 章 Visual Studio .NET とは?

7

第 2 章 Visual Basic .NET への移行

8

2.1 関数定義ファイルのインポート ...9 2.1.1 デジタル入出力ボード(GPC-2000)...11 2.1.2 アナログ入力ボード (GPC-3100) ...14 2.1.3 アナログ出力ボード (GPC-3300) ...21 2.1.4 GPIB ボード (GPC-4301 標準版 DLL) ...27 2.1.5 GPIB ボード (GPC-4301 高機能版 DLL) ...34 2.2 サンプルプログラム ...43 2.2.1 デジタル入出力 (1点入力、1 点出力) ...43 2.2.2 アナログ入力 (AD ボードによるサンプリング)...46 2.2.3 アナログ出力 (DA ボードによる出力更新)...48 2.2.4 GPIB 機器制御 (標準版 DLL を使用した制御)...50 2.2.5 GPIB 機器制御 (高機能版 DLL を使用した制御)...55 2.3 アップグレードウィザード ...61 2.3.1 アップグレード手順...61 2.3.2 アップグレードウィザードのエラー ...64

第 3 章 Visual C# .NET への移行

66

3.1 クラスライブラリ ...66 3.2 クラスライブラリの参照設定 ...67 3.3 クラスライブラリの関数を呼び出す ...70 3.4 クラスライブラリのソースファイル ...77 3.5 カテゴリ別プログラム作成方法 ...77 3.5.1 GPC-2000 ...78 3.5.2 GPC-3100 ...79 3.5.3 GPC-3300 ...82 3.5.4 GPC-4301 標準版 DLL...85 3.5.5 GPC-4301 高機能版 DLL ...88 3.6 サンプルプログラム一覧 ...92

(5)

第 4 章 .NET 技術情報

93

4.1 DLL 呼び出しの概要...93 4.1.1 マネージコードとアンマネージコード ...93 4.1.2 プラットフォーム呼び出し...94 4.2 DLL 関数呼び出し方法...95 4.2.1 DLL およびその DLL が提供する関数を識別するための情報...95 4.2.2 DLL 関数を保持するクラスを作成します。 ...96 4.2.3 マネージコードでのプロトタイプ宣言の記述 ...96 4.2.4 DLL 関数の呼び出し ...99 4.3 その他の注意事項と追加情報 ...100 4.3.1 Declare ステートメントは As Any 型のパラメータをサポートしな い ...100 4.3.2 明示的なマーシャリングが必要となる場合 ...100 4.3.3 構造体を使用する場合の注意点...101 4.3.4 構造体の中の構造体配列 (GPC-3100 の例) ...104 4.3.5 固定長文字列...107 4.3.6 文字エンコード...108 4.3.7 デリゲート オブジェクトを使用したコールバック処理 ...110 4.3.8 イベントオブジェクト...113 4.3.9 関数のオーバーロード...116 4.3.10 クラスライブラリの参照先が未解決になった場合 ...117 4.3.11 Visual C++ .NET の補足情報 ...119

用語集

122

技術資料紹介

124

参考文献

125

(6)

はじめに

平素は格別のご高配を賜り、厚くお礼申し上げます。

■本書の目的と内容

本書の目的は、Visual Studio 6.0からVisual Studio .NETへ開発環境を移行されるお客 様へ、弊社の既存のソフトウェアライブラリを継続して利用していただくための情 報を提供することです。

弊社Windows用ソフトウェアライブラリ(GPCシリーズ)が提供する既存の関数群 をVisual Studio .NET開発環境(Visual Basic .NET,Visual C# .NET,Visual C++.NET) から利用するために必要な情報を記載しています。本書では各カテゴリ別にVisual Studio .NET用のサンプルプログラムを提供すると共に、Visual Studio 6.0からVisual Studio .NETへ移行した場合の変更点や注意点を解説しています。

■対象とする読者

本書は、Microsoft Visual Studio 6.0およびMicrosoft Visual Studio .NETに含まれる言語 処理系の知識と、開発統合環境の使用方法を習得しているソフトウェア技術者を対 象としています。

Visual Basic .NET,Visual C# .NET ,Visual C++ .NETの新機能や強化された機能、 および変更された言語仕様についての詳細説明はいたしません。 それらの内容につきましては、Microsoft社が提供するドキュメント(MSDN ライブ ラリなど)をご参照ください。 尚、本書は、弊社PCI/CompactPCI/CardBus対応Windows用ソフトウェアライブラリ GPCシリーズ が提供する各関数、およびサービスの詳細は記載しておりません。 弊社PCI/CompactPCI/CardBus対応Windows用ソフトウェアライブラリ GPCシリー ズ が提供する各関数の仕様と使用方法の詳細は、各ソフトウェアに添付のオンラ インヘルプ、または各カテゴリ毎に具体的なプログラム例を記したチュートリアル をご参照ください。 ■ご意見・ご要望 弊社へのご意見,ご要望がございましたら、下記までお問い合わせください。 www.interface.co.jp E-mail:support@interface.co.jp

(7)

■Visual Studioのエディションについて

本書の内容は、次のVisual Studio .NET各エディション及びコンパイラ単体製品を対 象としています。

・Visual Studio .NET Enterprise Architect ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

・Visual Studio .NET Academic ・Visual Basic .NET Standard ・Visual C# .NET Standard ・Visual C++ .NET Standard

本書のコード例は、Windows XP Professional上のVisual Studio .NET Professionalで確 認しています。 ■対象ソフトウェア 弊社PCI/CompactPCI/CardBus対応Windows用ソフトウェアライブラリ(GPCシリー ズ) ■サンプルプログラムについて 本チュートリアル記載のサンプルプログラムのソース(BPC-0818)は、 弊社 Web site(www.interface.co.jp)から無料でダウンロードできます。 ■PDFファイル 本チュートリアルのPDFファイルを、弊社 Web site(www.interface.co.jp)から無料 でダウンロードできます。

■Visual Basic, Visual C++チュートリアル

弊社では、Visual Basicチュートリアル, Visual C++チュートリアルとして、カテゴリ 別に接続方法を詳細に説明した入門書を無料でWeb siteより提供しています。(サ ンプルプログラム付き)是非、本書と合わせてご利用ください。

(8)

1章 Visual Studio .NETとは?

Visual Studio .NETとはMicrosoft社がXML Web サービスおよびアプリケーション を迅速に構築し統合するための包括的ツールとして、操作性の向上と共に、開発 者の生産性を大幅に向上させることを目的として発表されました。そのため、 Visual Basic 6.0 に対して単なる機能追加が行なわれただけでなく、製品の再設計 が行なわれ、利用できるアーキテクチャ、文法、オブジェクトなど多くの点が変 更されています。

開発言語はVisual Basic 6.0の後継であるVisual Basic .NETやVisual C++ 6.0の後継で あるVisual C++ .NET、そしてこの度、新たに導入されたC++ 言語を進化させた、 C/C ++ 系言語初のコンポーネント指向言語であるVisual C# .NETが採用されてい ます。

本書では、弊社Windows用ソフトウェアライブラリ(GPCシリーズ)が提供する 既存の関数群をVisual Studio .NET開発環境(Visual Basic .NET,Visual C# .NET, Visual C++ .NET)から利用するために必要な情報を記載しています。その為、弊 社ソフトウェアライブラリを使用する上で、注意すべき主な変更点のみを示して います。

その他の点のVisual Studio .NETへの移行に関しては、Microsoft社が提供するドキ ュメント(MSDNライブラリなど)をご参照ください。

それでは、次節よりVisual Studio 6.0からVisual Studio .NETへの移行の説明に入り ます。

各言語の説明に入る前に各製品のユーザーズマニュアルに従って、ボードの設置、 ドライバのインストール,ドライバソフトウェアのインストールを行ってくださ い。

(9)

2章 Visual Basic .NETへの移行

本節では、Visual Basic .NETを弊社ソフトウェアライブラリ(GPCシリーズ)で使用 するために必要な情報を掲載します。

まず、弊社ソフトウェアライブラリで使用するためのVisual Basic .NET用の関数定 義ファイルについて変更点を説明します。

次に、各カテゴリ毎のソフトウェアライブラリに付属しているサンプルプログラ ムを用いてVisual Basic .NETでの変更点を示します。

なお、本書では、Visual Basic 6.0からVisual Basic .NETへ移行する際に、弊社ソフ トウェアライブラリに関連する部分に関しての説明となりますので、あらかじめ ご了承ください。

Visual Basic .NETへの移行に関する一般的な情報は、Microsoft社が提供するドキュ メント(MSDNライブラリなど)をご参照ください。

それでは、各カテゴリの説明に入る前に、各カテゴリで共通となる手順について 説明します。

(10)

2.1 関数定義ファイルのインポート

ここでは、弊社ソフトウェアライブラリをVisual Basic .NETでご使用いただくため の関数定義ファイルをプロジェクトにインポートする方法について説明します。

1. Visual Studio .NETを起動します。

2. ファイル-新規作成-プロジェクトを選択し、新規にプロジェクトを作成します。 Visual Basicプロジェクトが選択されていることを確認し、プロジェクト名を入 力し、「OK」をクリックします。 図 2-1 新規プロジェクト作成 3. 次に、プロジェクトに関数定義ファイルの追加を行います。ソリューション エクスプローラを開き、プロジェクト名上で右クリックします。 「追加」-「既存項目の追加」を選択します。 図 2-2 関数定義ファイルの追加

(11)

4. 次に、関数定義ファイルの場所を選択します。

BPC-0818には、Visual Basic .NET用の関数定義ファイルを用意しています。

表 2-1 Visual Basic .NET用関数定義ファイル格納先

ソフトウェア Visual Basic.NET用関数定義ファイル格納先 GPC-2000 <インストールフォルダ >¥Interface¥BPC0818¥GPC2000¥include¥FbiDio.vb GPC-3100 <インストールフォルダ >¥Interface¥BPC0818¥GPC3100¥include¥FbiAd.vb GPC-3300 <インストールフォルダ >¥Interface¥BPC0818¥GPC3300¥include¥FbiDa.vb GPC-4301 標準版DLL用 <インストールフォルダ >¥Interface¥BPC0818¥GPC4301¥include¥GPC4301Std.vb GPC-4301 高機能版DLL用 <インストールフォルダ >¥Interface¥BPC0818¥GPC4301¥include¥GPC4301Ex.vb 各カテゴリ毎に必要な関数定義ファイルを選択してください。 図 2-3 関数定義ファイル選択

これで、Visual Basic .NET用の関数定義ファイルが読み込まれました。

それでは次より、各カテゴリ毎の関数定義ファイルについてVisual Basic 6.0と Visual Basic .NETについての変更点を説明していきます。

(12)

2.1.1 デジタル入出力ボード(GPC-2000)

弊社デジタル入出力ボードソフトウェアライブラリ用の関数定義ファイルの変更 点を示します。

Visual Basic .NETとVisual Basic 6.0の関数定義ファイルは以下のフォルダに納めら れています。 Visual Basic 6.0 ソフトウェア GPC-2000 関数定義ファイル名 FbiDio.bas 格納先フォルダ <インストール先 >¥Interface¥GPC2000¥include¥FbiDio.bas Visual Basic .NET

ソフトウェア BPC-0818

関数定義ファイル名 FbiDio.vb

格納先フォルダ <インストール先

>¥Interface¥BPC0818¥GPC2000¥include¥FbiDio.vb

Visual Basic 6.0用の関数定義ファイルと、Visual Basic .NET用の関数定義ファイル を比較します。

弊社デジタル入出力ボードのVisual Basic .NETの関数定義ファイルは、以下の定数 と関数が変更になっています。 これらの定数、関数を使用する場合は注意してください。 表 2-2 関数定義ファイルの変更点(デジタル入出力) 定数名 変更理由 詳細情報 FBIDIO_RSTIN_MASKなど データ型の指定が必要 なし 関数名 変更理由 詳細情報 DioInputHandShake Anyキーワードが使用できない DioInputHandShakeEx Anyキーワードが使用できない DioOutputHandShake Anyキーワードが使用できない DioOutputHandShakeEx Anyキーワードが使用できない 『Declare ステート メントはAs Any 型 のパラメータをサ ポートしない』

(13)

◆定数について

List2-1,List2-2にVisual Basic 6.0とVisual Basic .NETのFBIDIO_RSTIN_MASK定数宣 言部を示します。太字で記載している部分がVisual Basic .NETでの変更点です。

List2-1 Visual Basic 6.0のFBIDIO_RSTIN_MASK定数 Public Const FBIDIO_RSTIN_MASK = 1

List2-2Visual Basic .NETのFBIDIO_RSTIN_MASK定数 Public Const FBIDIO_RSTIN_MASK As Integer = 1

Visual Basic 6.0 で は定数の宣言 時に型を必要としませんでし たが、Visual Basic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。 その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認 してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言える ことですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を 必要とするように変更されています。また、以前のバージョンでは可能であった、 変数宣言なしでいきなり変数を使用する処理もできなくなっています。 曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には 注意が必要になります。 ◆関数について 表2-2の変更理由「Anyキーワードが使用できない」についての修正点を以下に示 します。 DioInputHandShake関数は、複数のデータ型に対応するため、複数の関数定義を行 います。

Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことが できる、関数のオーバーロードをサポートしています。

関数のオーバーロードについての詳細情報は『関数のオーバーロード』を参考に してください。

(14)

List2-3,List2-4にVisual Basic 6.0とVisual Basic .NETのDioInputHandShake関数定義 を示します。太字で記載した部分が変更点です。

List2-3Visual Basic 6.0のDioInputHandShake関数定義

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Long, ByRef lpBuffer As Any, ByVal nNumOfBytesToRead As Long, ByRef lpNumOfBytesRead As Long, ByRef lpOverlapped As OVERLAPPED) As Long

List2-4Visual Basic .NETのDioInputHandShake関数定義

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer, ByRef lpBuffer As Byte, ByVal nNumOfBytesToRead As Integer, ByRef lpNumOfBytesRead As

Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer, ByRef lpBuffer As Short, ByVal nNumOfBytesToRead As Integer, ByRef lpNumOfBytesRead As

Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer, ByRef lpBuffer As Integer, ByVal nNumOfBytesToRead As Integer, ByRef lpNumOfBytesRead As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer,

ByVal lpBuffer() As Byte, ByVal nNumOfBytesToRead As Integer, ByRef lpNumOfBytesRead

As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer, ByVal

lpBuffer() As Short, ByVal nNumOfBytesToRead As Integer, ByRef lpNumOfBytesRead As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

Declare Function DioInputHandShake Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer, ByVal

lpBuffer() As Integer, ByVal nNumOfBytesToRead As Integer, ByRef lpNumOfBytesRead As Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

同様の変更理由により、修正が必要な関数も同様の変更方法で修正してください。 また、「Anyキーワードが使用できない」についての詳細情報は、『Declare ステ ートメントはAs Any 型のパラメータをサポートしない』を参考にしてください。 ここで説明した以外のAPI関数については、Visual Basic 6.0以前と同様の方法で使 用することが可能です。 また、各API関数の使用方法についてはGPC-2000のHelpをご参照ください。

(15)

2.1.2 アナログ入力ボード (GPC-3100)

弊社アナログ入力ボードソフトウェアライブラリ用の関数定義ファイルの変更点 を示します。

Visual Basic .NETとVisual Basic 6.0の関数定義ファイルは以下のフォルダに納めら れています。

Visual Basic 6.0

ソフトウェア GPC-3100

関数定義ファイル名 FbiAd.bas

格納先フォルダ <インストール先>¥Interface¥GPC3100¥include¥FbiAd.bas Visual Basic .NET

ソフトウェア BPC-0818

関数定義ファイル名 FbiAd.vb

格納先フォルダ <インストール先>¥Interface¥BPC0818¥GPC3100¥include¥FbiAd.vb

Visual Basic 6.0用の関数定義ファイルと、Visual Basic .NET用の関数定義ファイル を比較します。

弊社アナログ入力ボード用のVisual Basic .NETの関数定義ファイルは、以下の定数 と関数と構造体が変更になっています。 これらの定数、関数、構造体を使用される場合は注意してください。 表 2-3 関数定義ファイルの変更点 (アナログ入力) 定数名 変更理由 詳細情報 FLAG_SYNCなど データ型の指定が必要 なし 関数名 変更理由 詳細情報 AdInputAD Anyキーワードが使用できない AdGetSamplingData Anyキーワードが使用できない AdDataConv Anyキーワードが使用できない AdReadFile Anyキーワードが使用できない AdBmGetSamplingData Anyキーワードが使用できない AdLvGetSamplingData Anyキーワードが使用できない 『Declare ス テートメント はAs Any 型 のパラメータ をサポートし ない』

(16)

構造体名 変更理由 詳細情報 ADSMPLCHREQ 構造体定義の変更 『構造体を使 用する場合の 注意点』 ADTRIGCHREQ 構造体定義の変更 『構造体を使 用する場合の 注意点』 ADSMPLREQ 構造体定義とデータ設定方法の変更 『構造体の中 の 構 造 体 配 列』 ADBMSMPLREQ 構造体定義とデータ設定方法の変更 『構造体の中 の 構 造 体 配 列』 ADBOARDSPEC 構造体定義の変更 『構造体を使 用する場合の 注意点』

(17)

◆定数について

表2-3の変更理由「データ型の指定が必要」についての修正点を以下に示します。 List2-5, List2-6にVisual Basic 6.0とVisual Basic .NETのFLAG_SYNC定数宣言部を示 します。太字で記載した部分が変更点です。

List2-5 Visual Basic 6.0のFLAG_SYNC定数 Public Const FLAG_SYNC = 1

List2-6 Visual Basic .NETのFLAG_SYNC定数 Public Const FLAG_SYNC As Integer = 1

Visual Basic 6.0では定数の宣言時に型を必要としませんでしたが、Visual

Basic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。 その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認 してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言える ことですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を 必要とするように変更されています。また、以前のバージョンでは可能であった、 変数宣言なしでいきなり変数を使用する処理もできなくなっています。 曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には 注意が必要になります。 ◆関数について 表2-3の変更理由が「Anyキーワードが使用できない」についての修正点を以下に 示します。 AdInputAD関数は、複数のデータ型に対応するため、複数の関数定義を行います。

Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことが できる、関数のオーバーロードをサポートしています。

(18)

List2-7,2-8にVisual Basic 6.0とVisual Basic .NETのAdInputAD関数定義を示します。 太字で記載した部分が変更点です。

List2-7 Visual Basic 6.0のAdInputAD関数定義

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Long, ByVal ulCh As Long, ByVal ulSingleDiff As Long, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByRef lpData As

Any) As Long

List2-8 Visual Basic .NETのAdInputAD関数定義

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh As

Integer, ByVal ulSingleDiff As Integer, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByRef

lpData As Byte) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh As

Integer, ByVal ulSingleDiff As Integer, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByRef

lpData As Short) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh As

Integer, ByVal ulSingleDiff As Integer, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByRef

lpData As Integer) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh As

Integer, ByVal ulSingleDiff As Integer, ByVal lpAdSmplChReq() As ADSMPLCHREQ, ByVal lpData() As Byte) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh As

Integer, ByVal ulSingleDiff As Integer, ByVal lpAdSmplChReq() As ADSMPLCHREQ, ByVal lpData() As Short) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh As

Integer, ByVal ulSingleDiff As Integer, ByVal lpAdSmplChReq() As ADSMPLCHREQ, ByVal lpData() As Integer) As Integer

同様の変更理由により、修正が必要な関数も同様の変更方法で修正してください。 また、「Anyキーワードが使用できない」についての詳細情報は、『Declare ステ ートメントはAs Any 型のパラメータをサポートしない』を参考にしてください。

(19)

◆構造体について

表2-3の変更理由が「構造体定義の変更」についての修正点を以下に示します。 List2-1-9, 2-1-10にVisual Basic 6.0とVisual Basic .NETのADSMPLCHREQ構造体定 義を示します。太字で記載した部分が変更点です。

List 2-9 Visual Basic 6.0のADSMPLCHREQ構造体定義

Type ADSMPLCHREQ UlChNo As Long UlRange As Long End Type

List 2-10 Visual Basic .NETのADSMPLCHREQ構造体定義 Option Strict Off

Option Explicit On

Imports System.Runtime.InteropServices

Module FbiAd ・

<StructLayout(LayoutKind.Sequential)> _Structure ADSMPLCHREQ Dim ulChNo As Integer

Dim ulRange As Integer End Structure

修正箇所の詳細情報に関しては、『構造体を使用する場合の注意点』をご参照く ださい。

(20)

次に、表2-3の変更理由「構造体定義とデータ設定方法の変更」についての修正点 を以下に示します。

List2-11,2-12にVisual Basic 6.0とVisual Basic .NETのADSMPLREQ構造体定義を示 します。太字で記載した部分が変更点です。

List 2-11 Visual Basic 6.0のADSMPLREQ構造体定義

Type ADSMPLREQ UlChCount As Long SmplChReq(0 To 255) As ADSMPLCHREQ UlSamplingMode As Long UlSingleDiff As Long UlSmplNum As Long UlSmplEventNum As Long FSmplFreq As Single UlTrigPoint As Long UlTrigMode As Long LTrigDelay As Long UlTrigCh As Long FTrigLevel1 As Single FTrigLevel2 As Single UlEClkEdge As Long UlATrgPulse As Long UlTrigEdge As Long UlTrigDI As Long UlFastMode As Long End Type

(21)

List 2-12 Visual Basic .NETのADSMPLREQ構造体定義

<StructLayout(LayoutKind.Sequential)> _

Structure ADSMPLREQ Dim ulChCount As Integer

<MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> _ Dim ulChNoRange() As Integer

Dim ulSamplingMode As Integer Dim ulSingleDiff As Integer Dim ulSmplNum As Integer Dim ulSmplEventNum As Integer Dim fSmplFreq As Single Dim ulTrigPoint As Integer Dim ulTrigMode As Integer Dim lTrigDelay As Integer Dim ulTrigCh As Integer Dim fTrigLevel1 As Single Dim fTrigLevel2 As Single Dim ulEClkEdge As Integer Dim ulATrgPulse As Integer Dim ulTrigEdge As Integer Dim ulTrigDI As Integer Dim ulFastMode As Integer

Public Sub New(ByVal Dummy As Integer) ReDim ulChNoRange(511)

End Sub

Public Sub SetChNo(ByVal ulIndex As Integer, ByVal ulNumber As Integer) ulChNoRange(ulIndex * 2) = ulNumber

End Sub

Public Function GetChNo(ByVal ulIndex As Integer) GetChNo = ulChNoRange(ulIndex * 2)

End Function

Public Sub SetChRange(ByVal ulIndex As Integer, ByVal ulRange As Integer) ulChNoRange((ulIndex * 2) + 1) = ulRange

End Sub

Public Function GetChRange(ByVal ulIndex As Integer) GetChRange = ulChNoRange((ulIndex * 2) + 1) End Function

End Structure

これは、標準マーシャリングサービスでは、構造体中のメンバに構造体配列があ る場合、整数配列や、固定長文字列を引き渡す場合と同じように定義しても、呼

(22)

修正箇所の詳細情報に関しては、『構造体の中の構造体配列(GPC-3100の例)』 をご参照ください。 ここで説明した以外のAPI関数や構造体については、Visual Basic 6.0以前と同様の 方法で使用することが可能です。 また、API関数や構造体の使用方法についてはGPC-3100のHelpを参照してくださ い。

2.1.3 アナログ出力ボード (GPC-3300)

弊社アナログ出力ボードソフトウェアライブラリ用の関数定義ファイルの変更点 を示します。

Visual Basic .NETとVisual Basic 6.0の関数定義ファイルは以下のフォルダに納めら れています。

Visual Basic 6.0

ソフトウェア GPC-3300

関数定義ファイル名 FbiDa.bas

格納先フォルダ <インストール先>¥Interface¥GPC3300¥include¥FbiDa.bas Visual Basic .NET

ソフトウェア BPC-0818

関数定義ファイル名 FbiDa.vb

格納先フォルダ <インストール先

>¥Interface¥BPC0818¥GPC3300¥include¥FbiDa.vb

Visual Basic 6.0用の関数定義ファイルと、Visual Basic .NET用の関数定義ファイル を比較します。

弊社アナログ出力ボード用のVisual Basic .NETの関数定義ファイルは、以下の定数 と関数と構造体が変更になっています。

(23)

表 2-4 関数定義ファイルの変更点 (アナログ出力) 定数名 変更理由 詳細情報 FLAG_SYNCなど データ型の指定が必要 なし 関数名 変更理由 詳細情報 DaSetSamplingData Anyキーワードが使用できない DaOutputDA Anyキーワードが使用できない DaDataConv Anyキーワードが使用できない DaWriteFile Anyキーワードが使用できない 『 Declare ス テートメント は As Any 型 のパラメータ をサポートし ない』 構造体名 変更理由 詳細情報 DASMPLCHREQ 構造体定義の変更 『構造体を使 用する場合の 注意点』 DASMPLREQ 構造体定義とデータ設定方法の変更 『構造体の中 の 構 造 体 配 列』 DABOARDSPEC 構造体定義の変更 『構造体を使 用する場合の 注意点』 DAMODECHREQ 構造体定義の変更 『構造体を使 用する場合の 注意点』 DAMODEREQ 構造体定義の変更 『構造体を使 用する場合の 注意点』章 DAFIFOREQ 構造体定義とデータ設定方法の変更 『構造体の中 の 構 造 体 配 列』

(24)

◆定数について

表2-4の変更理由「データ型の指定が必要」についての修正点を以下に示します。 List 2-13, List2-14にVisual Basic 6.0とVisual Basic .NETのFLAG_SYNC定数宣言部 を示します。太字で記載した部分が変更点です。

List 2-13 Visual Basic 6.0のFLAG_SYNC定数 Public Const FLAG_SYNC = 1

List 2-14 Visual Basic .NETのFLAG_SYNC定数 Public Const FLAG_SYNC As Integer = 1

Visual Basic 6.0では定数の宣言時に型を必要としませんでしたが、Visual

Basic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。 その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認 してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言える ことですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を 必要とするように変更されています。また、以前のバージョンでは可能であった、 変数宣言なしでいきなり変数を使用する処理もできなくなっています。 曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には 注意が必要になります。 ◆関数について 表2-4の変更理由「Anyキーワードが使用できない」についての修正点を以下に示 します。 DaSetSamplingData関数は、データ型に対応するため、複数の関数定義を行います。

Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことが できる、関数のオーバーロードをサポートしています。

関数のオーバーロードについての詳細情報は『関数のオーバーロード』を参考に してください。

(25)

List2-15,List2-16にVisual Basic 6.0とVisual Basic .NETのDaSetSamplingData関数定義 を示します。太字で記載した部分が変更点です。

List 2-15 Visual Basic 6.0のDaSetSamplingData関数定義

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Long, ByRef pSmplData As Any, ByVal ulSmplDataNum As Long) As Long

List 2-16 Visual Basic .NETのDaSetSamplingData関数定義

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Integer, ByRef pSmplData As Byte, ByVal ulSmplDataNum As Integer) As Integer

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Integer, ByRef pSmplData As Short, ByVal ulSmplDataNum As Integer) As Integer

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Integer, ByRef pSmplData As Integer, ByVal ulSmplDataNum As Integer) As Integer

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Integer,

ByVal pSmplData() As Byte, ByVal ulSmplDataNum As Integer) As Integer

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Integer,

ByVal pSmplData() As Short, ByVal ulSmplDataNum As Integer) As Integer

Declare Function DaSetSamplingData Lib "FbiDa.DLL" (ByVal hDeviceHandle As Integer,

ByVal pSmplData() As Integer, ByVal ulSmplDataNum As Integer) As Integer

同様の変更理由により、修正が必要な関数も同様の変更方法で修正してください。 また、「Anyキーワードが使用できない」についての詳細情報は『Declare ステー トメントはAs Any 型のパラメータをサポートしない』を参考にしてください。

◆構造体について

表2-4の変更理由「構造体定義の変更」についての修正点を以下に示します。 List2-17,List2-18にVisual Basic 6.0とVisual Basic .NETのADSMPLCHREQ構造体定 義を示します。

List 2-17 Visual Basic 6.0のDASMPLCHREQ構造体定義

Type DASMPLCHREQ ulChNo As Long ulRange As Long

(26)

List 2-18 Visual Basic .NETのDASMPLCHREQ構造体定義 Option Strict Off

Option Explicit On Imports System.Runtime.InteropServices Module FbiDa ・ ・ <StructLayout(LayoutKind.Sequential)> _ Structure DASMPLCHREQ

Dim ulChNo As Integer Dim ulRange As Integer End Structure

修正箇所の詳細情報に関しては、『構造体を使用する際の注意点』をご参照くだ さい。

次に、表2-4の変更理由「構造体定義とデータ設定方法の変更」についての修正点 を以下に示します。

List2-19,List2-20にVisual Basic 6.0とVisual Basic .NETのADSMPLREQ構造体定義を 示します。太字で記載した部分が変更点です。

List 2-19 Visual Basic 6.0のDASMPLREQ構造体定義

Type DASMPLREQ ulChCount As Long SmplChReq(0 To 255) As DASMPLCHREQ ulSamplingMode As Long fSmplFreq As Single ulSmplRepeat As Long ulTrigMode As Long ulTrigPoint As Long ulTrigDelay As Long ulEClkEdge As Long ulTrigEdge As Long ulTrigDI As Long End Type

(27)

List 2-20 Visual Basic .NETのDASMPLREQ構造体定義

<StructLayout(LayoutKind.Sequential)> _ Structure DASMPLREQ

Dim ulChCount As Integer

<MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> _ Dim ulChNoRange() As Integer

Dim ulSamplingMode As Integer Dim fSmplFreq As Single Dim ulSmplRepeat As Integer Dim ulTrigMode As Integer Dim ulTrigPoint As Integer Dim ulTrigDelay As Integer Dim ulEClkEdge As Integer Dim ulTrigEdge As Integer Dim ulTrigDI As Integer

Public Sub New(ByVal Dummy As Integer) ReDim ulChNoRange(511)

End Sub

Public Sub SetChNo(ByVal ulIndex As Integer, ByVal ulNumber As Integer) ulChNoRange(ulIndex * 2) = ulNumber

End Sub

Public Function GetChNo(ByVal ulIndex As Integer) GetChNo = ulChNoRange(ulIndex * 2)

End Function

Public Sub SetChRange(ByVal ulIndex As Integer, ByVal ulRange As Integer) ulChNoRange((ulIndex * 2) + 1) = ulRange

End Sub

Public Function GetChRange(ByVal ulIndex As Integer) GetChRange = ulChNoRange((ulIndex * 2) + 1) End Function End Structure これは、標準マーシャリングサービスでは、構造体中のメンバに構造体配列があ る場合、整数配列や、固定長文字列を引き渡す場合と同じように定義しても、呼 び出し時にマーシャリングに失敗するためです。これを解決するために、構造体 中の配列データへのアクセスには、SetChNo、GetChNo、SetRangeNo、GetRangeNo という専用のメソッドを利用します。 修正箇所の詳細情報に関しては、『構造体の中の構造体配列(GPC-3100の例)』 をご参照ください。ここで説明した以外のAPI関数や構造体については、Visual

(28)

2.1.4 GPIBボード (GPC-4301標準版DLL)

弊社GPIBボードソフトウェアライブラリ GPC-4301標準版DLL用関数定義ファイ ルの変更点を示します。

Visual Basic .NETとVisual Basic 6.0の関数定義ファイルは以下のフォルダに納めら れています。 Visual Basic 6.0 ソフトウェア GPC-4301 関数定義ファイル名 GPC43042.bas 格納先フォルダ <インストール先> ¥Interface¥GPC4301¥include¥GPC43042.bas Visual Basic .NET

ソフトウェア BPC-0818

関数定義ファイル名 GPC4301std.vb

格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC4301¥include¥ GPC4301std.vb

Visual Basic 6.0用の関数定義ファイルと、Visual Basic .NET用の関数定義ファイル を比較します。 関数定義ファイルは、以下の定数と関数が変更になっています。 これらの定数、関数を使用される場合は注意してください。 表 2-5 関数定義ファイルの変更点 (GPIB GPC-4301標準版) 定数名 変更理由 詳細情報 GPIB_SUCCESS_NOT_ACTI VE_SRQなど データ型の指定が必要 なし

(29)

関数名 変更理由 詳細情報 GpibReceive GpibSend 複数の送受信データ型に対応するため、複数の関数定義を行います。 『固定長文字列』『文字エンコー ド』 『関数のオーバ ーロード』

GpibSetSrqEvent Anyキーワードが使用できない 『Declare ステー

ト メ ン ト は As Any 型のパラメ ータをサポート しない』 また、次の定義を追加します。 項目 追加理由 詳細情報 delegate型 関数宣言の追加 (PLPSRQCALLBACK) コールバック関数を使用するために delegate宣言を追加します。 GpibSetSrqEvent関数が要求するパラ メータのひとつが使用する型です。 『デリゲード オ ブジェクトを使 用したコールバ ック処理』

(30)

◆定数について

表 2-の変更理由「データ型の指定が必要」についての修正点を以下に示します。 List2-21, List2-22 にVisual Basic 6.0とVisual Basic .NETの

GPIB_SUCCESS_NOT_ACTIVE_SRQ定数宣言部を示します。太字で記載した部分 が変更点です。

List 2-21 Visual Basic 6.0のGPIB_SUCCESS_NOT_ACTIVE_SRQ定数 Public Const GPIB_SUCCESS_NOT_ACTIVE_SRQ = 5

List 2-22 Visual Basic .NETのGPIB_SUCCESS_NOT_ACTIVE_SRQ定数 Public Const GPIB_SUCCESS_NOT_ACTIVE_SRQ As Integer = 5

Visual Basic 6.0では定数の宣言時に型を必要としませんでしたが、Visual

Basic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。 その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認 してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言える ことですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を 必要とするように変更されています。また、以前のバージョンでは可能であった、 変数宣言なしでいきなり変数を使用する処理もできなくなっています。 曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には 注意が必要になります。 ◆GpibSend関数について GpibSetnd関数は、複数の送信データ型に対応するため、複数の関数定義を行いま す。本書で取り上げる関数定義では、送信データ格納先に次のデータ型を指定で きます。 バイト型、バイト配列型、IntPtr型、文字列型。 [関数定義] パラメータの型が異なる4つの関数宣言を行います。関数名は、すべて同じ GpibSendとします。

Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことが できる、関数のオーバーロードをサポートしています。

関数のオーバーロードについての詳細情報は『関数のオーバーロード』を参考に してください。

(31)

パラメータの型が異なる関数は、それぞれ次のような異なる用途で使用できます。 表 2-6 GpibSend関数 パラメータ型別用途一覧 送信データ型 用途 Byte型 バイナリデータの送信(1データ) Byte型配列 バイナリデータの送信(複数データ) String型 文字列データの送信 IntPtr型 特殊なデータブロックの送信 非同期処理時

List 2-23 Visual Basic 6.0のGpibSend関数定義

Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Long, ByRef lpAdrsTbl As

Long, ByVal ulpLength As Long, ByVal vpBuffer As String) As Long

List 2-24 Visual Basic .NETのGpibSend関数定義(Byte型送信データ用) Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByRef vpBuffer As Byte) As Integer

List 2-25 Visual Basic .NETのGpibSend関数定義(Byte配列型送信データ用) Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer() As Byte) As Integer

List 2-26 Visual Basic .NETのGpibSend関数定義(String型送信データ用) Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer As String) As Integer

List 2-27 Visual Basic .NETのGpibSend関数定義(IntPtr型送信データ用) Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer As IntPtr) As Integer

◆GpibReceive関数について GpibReceive関数は、複数の受信データ型に対応するため、複数の関数定義を行い ます。本書で取り上げる関数定義例は、受信データ格納先に次のデータ型を指定 する場合です。 バイト型,バイト配列型,IntPtr型,文字列型。 [関数定義] パラメータの型が異なる4つの関数宣言を行います。

(32)

関数のオーバーロードについての詳細情報は『関数のオーバーロード』を参考に してください。 パラメータの型が異なる関数は、それぞれ次のような異なる用途で使用できます。 表 2-7 GpibReceive関数 パラメータ型別用途一覧 受信データ型 用途 Byte型 バイナリデータの受信(1データ) Byte型配列 バイナリデータの受信(複数データ) String型 文字列データの受信 IntPtr型 特殊なデータブロックの受信 非同期処理時

List 2-28 Visual Basic 6.0のGpibReceive関数定義

Declare Function GpibReceive Lib "GPC43042.DLL" (ByVal ulBoardNo As Long, ByRef

lpAdrsTbl As Long, ByRef ulpLength As Long, ByVal vpBuffer As String) As Long

List 2-29 Visual Basic .NETのGpibReceive関数定義(Byte型受信データ用) Declare Function GpibReceive Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByRef ulpLength As Integer, ByRef vpBuffer As Byte) As Integer

List 2-30 Visual Basic .NETのGpibReceive関数定義(Byte配列型受信データ用) Declare Function GpibReceive Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByRef ulpLength As Integer, ByVal vpBuffer() As Byte) As Integer

List 2-31 Visual Basic .NETのGpibReceive関数定義(String型受信データ用) Function GpibReceive(ByVal ulBoardNo As Integer, ByVal lpAdrsTbl() As Integer, ByRef ulpLength As Integer, ByRef vpBuffer As String) As Integer

Dim nLength As Integer Dim nRet As Integer

Dim e As ASCIIEncoding = New ASCIIEncoding() Dim szData(ulpLength - 1) As Byte

vpBuffer = "" nLength = ulpLength

nRet = GpibReceive(ulBoardNo, lpAdrsTbl, nLength, szData) If (nRet = 0) Then

vpBuffer = e.GetString(szData, 0, nLength) ulpLength = vpBuffer.Length

End If

GpibReceive = nRet End Function

(33)

受信データをString型に格納するGpibReceive関数は、Byte配列型でデータを受信し、 String型に変換を行うFunctionとして定義します。これは、GpibReceive関数が文字 列データにNULL終端を付加しないためByte配列からの変換を必要とするためで す。 詳細は、『固定長文字列』と、『文字エンコード』をご参照ください。

List 2-32 Visual Basic .NETのGpibReceive関数定義(IntPtr型受信データ用) Declare Function GpibReceive Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal

lpAdrsTbl() As Integer, ByRef ulpLength As Integer, ByVal vpBuffer As IntPtr) As Integer

◆GpibSetSrqEvent関数について

表2-5の変更理由「Anyキーワードが使用できない」についての修正点を以下に示 します。

List2-33,2-34にVisual Basic 6.0とVisual Basic .NETのGpibSetSrqEvent関数定義を示 します。太字で記載した部分が変更点です。

List 2-33 Visual Basic 6.0のGpibSetSrqEvent関数定義

Declare Function GpibSetSrqEvent Lib "GPC43042.DLL" (ByVal ulBoardNo As Long, ByVal lpOnSrqProc As Any, ByVal dwUser As Long) As Long

List 2-34 Visual Basic .NETのGpibSetSrqEvent関数定義

Declare Function GpibSetSrqEvent Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVal lpOnSrqProc As PLPSRQCALLBACK, ByVal dwUser As Integer) As Integer

上記の関数宣言を行うには、PLPSRQCALLBACKの宣言が必要です。

GpibSetSrqEvent関数のパラメータlpOnSrqProcは、SRQ信号有効時に自動で呼び出 されるコールバック関数のアドレスを指定するパラメータです。

Visual Basic .NET上では、デリゲートと呼ばれる仕組みを使用し、DLLからの関数 コールバック機能を利用することができます。

デリゲート型を使用し、コールバック処理に使用される関数の型

(34)

List 2-35 Visual Basic .NETのデリゲート型PLPSRQCALLBACK定義

Delegate Sub PLPSRQCALLBACK(ByVal nBoardNo As Integer, ByVal dwUser As Integer)

次のように使用します。

PLPSRQCALLBACK型のオブジェクトを保存する変数をモジュール定義ファイル内 などに宣言します。(クラスコード中に宣言する場合、関数コールバック機能を使用 している間に、生成したデリゲート型オブジェクトが、解放されないように、オブジ ェクトのスコープに注意が必要です。)

List 2-36 Visual Basic .NET PLPSRQCALLBACK定義 Public osp As PLPSRQCALLBACK

PLPSRQCALLBACK型のデリゲートオブジェクトを生成し、アプリケーション内 の関数と結びつけます。

New 演 算子 を使 用し 、パ ラメ ータ に コ ール バッ ク 関 数の アド レス を指 定 (AddressOf演算子を使用)します。

List 2-37 Visual Basic .NET PLPSRQCALLBACKの初期化

osp = New PLPSRQCALLBACK(AddressOf lpOnSrqProc)

nRet = GpibSetSrqEvent(nBoardNo, osp, UserData)

コールバック関数は、モジュール定義ファイル内などに次のように定義します。

List 2-38 Visual Basic .NET lpOnSrqProc

Sub lpOnSrqProc(ByVal dwBoardNo As Integer, ByVal dwUser As Integer) ' SRQ割り込みイベント処理を行うコールバック関数です ' ここにイベントが発生した時の処理を書いてください End Sub 「Anyキーワードが使用できない」についての詳細情報は『Declare ステートメン トはAs Any 型のパラメータをサポートしない』を参考にしてください。 デリゲートについての詳細情報は『デリゲードオブジェクトを使用したコールバ ック処理』を参考にしてください。 ここで説明した以外のAPIについては、Visual Basic 6.0以前と同様の方法で使用す ることが可能です。また、API関数や構造体の使用方法についてはGPC-4301のHelp にある「標準版DLLヘルプ」を参照してください。

(35)

2.1.5 GPIBボード (GPC-4301高機能版DLL)

弊社GPIBボードソフトウェアライブラリGPC-4301高機能版DLL用の関数定義ファイ ルの変更点を示します。

Visual Basic .NETとVisual Basic 6.0の関数定義ファイルは以下のフォルダに納められ ています。

Visual Basic 6.0

ソフトウェア GPC-4301

関数定義ファイル名 GPC4304.bas

格納先フォルダ <インストール先>¥Interface¥GPC4301¥include¥GPC4304.bas Visual Basic .NET

ソフトウェア BPC-0818

関数定義ファイル名 GPC4301Ex.bas

格納先フォルダ <インストール先>¥Interface¥BPC0818¥GPC4301¥include¥GPC4301Ex.vb

Visual Basic 6.0用の関数定義ファイルと、Visual Basic .NET用の関数定義ファイル を比較します。 関数定義ファイルは、以下の定数と関数が変更になっています。 これらの定数、関数を使用される場合は注意してください。 表 2-8 関数定義ファイルの変更点 (GPC4301 高機能版DLL) 定数名 変更理由 詳細情報 GPIB_SUCCESS_NOT_FOU ND_LISTENERなど データ型の指定が必要 なし

(36)

関数名 変更理由 詳細情報 PciGpibExMastSendData PciGpibExMastRecvData PciGpibExSlavSendData PciGpibExSlavRecvData 複数の送受信データ型に対応するた め、複数の関数定義を行います。 『固定長文字 列』 『文字エンコ ード』 『関数のオー バーロード』

PciGpibExSetSrqEvent Anyキーワードが使用できない 『 Declare ス

テートメント は As Any 型 のパラメータ をサポートし ない』 また、次の定義を追加します。 項目 追加理由 詳細情報 delegate型 関数宣言の追加 (PLPSRQCALLBACK) コールバック関数を使用するために delegate宣言を追加します。 PciGpibExSetSrqEvent 関 数が要求す るパラメータの一つが使用する型で す。 『デリゲード オブジェクト を使用したコ ールバック処 理』

(37)

◆定数について

表2-8の変更理由「データ型の指定が必要」についての修正点を以下に示します。 List2-39,2-40にVisual Basic 6.0とVisual Basic .NETの

GPIB_SUCCESS_NOT_FOUND_LISTENER定数宣言部を示します。太字で記載した部分が変 更点です。

List 2-39 Visual Basic 6.0のGPIB_SUCCESS_NOT_FOUND_LISTENER定数 Public Const GPIB_SUCCESS_NOT_FOUND_LISTENER = 11

List 2-40 Visual Basic .NETのGPIB_SUCCESS_NOT_FOUND_LISTENER定数 Public Const GPIB_SUCCESS_NOT_FOUND_LISTENER As Integer = 11

Visual Basic 6.0 で は定数の宣言 時に型を必要としませんでし たが、Visual Basic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。 その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認 してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言える ことですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を 必要とするように変更されています。また、以前のバージョンでは可能であった、 変数宣言なしでいきなり変数を使用する処理もできなくなっています。 曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には 注意が必要になります。 ◆PciGpibExMastSendData関数について PciGpibExMastSendData関数は、複数の送信データ型に対応するため、複数の関数 定義を行います。 本書で取り上げる関数定義例は、受信データ格納先に次のデータ型を指定する場 合です。 バイト型、バイト配列型、IntPtr型、文字列型。

(38)

[関数定義]

パラメータの型が異なる4つの関数宣言を行います。 関数名は、すべて同じPciGpibExMastSendDataとします。

Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことが できる、関数のオーバーロードをサポートしています。 関数のオーバーロードについての詳細情報は『関数のオーバーロード』を参考に してください。 パラメータの型が異なる関数は、それぞれ次のような異なる用途で使用できます。 表 2-9 PciGpibExMastSendData関数 パラメータ型別用途一覧 送信データ型 用途 Byte型 バイナリデータの受信(1データ) Byte型配列 バイナリデータの受信(複数データ) String型 文字列データの受信 IntPtr型 特殊なデータブロックの受信 非同期処理時

List 2-41 Visual Basic 6.0のPciGpibExMastSendData関数定義

Declare Function PciGpibExMastSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Long, ByRef npAdrsTbl As Long, ByVal dwLength As Long, ByVal pvBuffer As String, ByVal uMsg As Long) As Long

List 2-42 Visual Basic .NETのPciGpibExMastSendData関数定義(Byte型用) Declare Function PciGpibExMastSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,

ByVal npAdrsTbl() As Integer, ByVal dwLength As Integer, ByRef pvBuffer As Byte, ByVal

uMsg As Integer) As Integer

List 2-43 Visual Basic .NETのPciGpibExMastSendData関数定義(Byte配列型用) Declare Function PciGpibExMastSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,

ByVal npAdrsTbl() As Integer, ByVal dwLength As Integer, ByVal pvBuffer() As Byte, ByVal

uMsg As Integer) As Integer

List 2-44 Visual Basic .NETのPciGpibExMastSendData関数定義(String型用) Declare Function PciGpibExMastSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,

ByVal npAdrsTbl() As Integer, ByVal dwLength As Integer, ByVal pvBuffer As String, ByVal

uMsg As Integer) As Integer

List 2-45 Visual Basic .NETのPciGpibExMastSendData関数定義(IntPtr型用) Declare Function PciGpibExMastSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,

ByVal npAdrsTbl() As Integer, ByVal dwLength As Integer, ByVal pvBuffer As IntPtr, ByVal

(39)

◆PciGpibExMastRecvData関数について PciGpibExMastRecvData関数は、複数の受信データ型に対応するため、複数の関数 定義を行います。 本書で取り上げる関数定義例は、受信データ格納先に次のデータ型を指定する場 合です。 バイト型、バイト配列型、IntPtr型、文字列型。 [関数定義] パラメータの型が異なる4つの関数宣言を行います。 関数名は、すべて同じPciGpibExMastRecvDataとします。

Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことが できる、関数のオーバーロードをサポートしています。 関数のオーバーロードについての詳細情報は『関数のオーバーロード』を参考に してください。 パラメータの型が異なる関数は、それぞれ次のような異なる用途で使用できます。 表 2-10 PciGpibExMastRecvData関数 パラメータ型別用途一覧 受信データ型 用途 Byte型 バイナリデータの受信(1データ) Byte型配列 バイナリデータの受信(複数データ) String型 文字列データの受信 IntPtr型 特殊なデータブロックの受信 非同期処理時

List 2-46 Visual Basic 6.0のPciGpibExMastRecvData関数定義

Declare Function PciGpibExMastRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Long,

ByRef npAdrsTbl As Long, ByRef dwpLength As Long, ByVal pvBuffer As String, ByVal uMsg

As Long) As Long

List 2-47 Visual Basic .NETのPciGpibExMastRecvData関数定義

(送信データByte型用)

Declare Function PciGpibExMastRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,

ByVal npAdrsTbl() As Integer, ByRef dwpLength As Integer, ByRef pvBuffer As Byte, ByVal

uMsg As Integer) As Integer

(40)

List 2-49 Visual Basic .NETのPciGpibExMastRecvData関数定義(String型用) Function PciGpibExMastRecvData(ByVal nBoardNo As Integer, ByVal npAdrsTbl() As Integer, ByRef dwpLength As Integer, ByRef pvBuffer As String, ByVal uMsg As Integer) As Integer Dim nLength As Integer

Dim nRet As Integer

Dim e As ASCIIEncoding = New ASCIIEncoding() Dim szData(dwpLength - 1) As Byte

pvBuffer = ""

nLength = dwpLength

nRet = PciGpibExMastRecvData(nBoardNo, npAdrsTbl, nLength, szData, uMsg) If (nRet = 0) Then

pvBuffer = e.GetString(szData, 0, nLength) dwpLength = pvBuffer.Length End If PciGpibExMastRecvData = nRet End Function 受信データをString型に格納するPciGpibExMastRecvData関数は、Byte配列型でデー タを受信し、String型に変換を行うFunctionとして定義します。 これは、PciGpibExMastRecvData関数が文字列データにNULL終端を付加しないた めByte配列からの変換を必要とするためです。 詳細は、『固定長文字列』『文字エンコード』をご参照ください。

List 2-50 Visual Basic .NETのPciGpibExMastRecvData関数定義(IntPtr型用) Declare Function PciGpibExMastRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,

ByVal npAdrsTbl() As Integer, ByRef dwpLength As Integer, ByVal pvBuffer As IntPtr, ByVal

uMsg As Integer) As Integer

◆PciGpibExSlavSendData関数、PciGpibExSlavRecvData関数について PciGpibExSlavSendData関数、およびPciGpibExSlavRecvData関数も

「PciGpibExMastSendData」、「PciGpibExMastRecvData」と同様に複数のデータ型 に対応できるように定義します。

List 2-51 Visual Basic 6.0のPciGpibExSlavSendData関数定義

Declare Function PciGpibExSlavSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Long, ByVal dwLength As Long, ByVal pvBuffer As String, ByVal uMsg As Long) As Long

List 2-52 Visual Basic .NETのPciGpibExSlavSendData関数定義

(Byte型送信データ)

Declare Function PciGpibExSlavSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByVal dwLength As Integer, ByRef pvBuffer As Byte, ByVal uMsg As Integer) As Integer

(41)

List 2-53 Visual Basic .NETのPciGpibExSlavSendData関数定義

(Byte配列型送信データ)

Declare Function PciGpibExSlavSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByVal dwLength As Integer, ByVal pvBuffer() As Byte, ByVal uMsg As Integer) As Integer

List 2-54 Visual Basic .NETのPciGpibExSlavSendData関数定義

(String型送信データ)

Declare Function PciGpibExSlavSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByVal dwLength As Integer, ByVal pvBuffer As String, ByVal uMsg As Integer) As Integer

List 2-55 Visual Basic .NETのPciGpibExSlavSendData関数定義

(IntPtr型送信データ)

Declare Function PciGpibExSlavSendData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByVal dwLength As Integer, ByVal pvBuffer As IntPtr, ByVal uMsg As Integer) As Integer

List 2-56 Visual Basic 6.0のPciGpibExSlavRecvData関数定義

Declare Function PciGpibExSlavRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Long, ByRef dwpLength As Long, ByVal pvBuffer As String, ByVal uMsg As Long) As Long

List 2-57 Visual Basic .NETのPciGpibExSlavRecvData関数定義

(Byte型受信データ)

Declare Function PciGpibExSlavRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByRef dwpLength As Integer, ByRef pvBuffer As Byte, ByVal uMsg As Integer) As Integer

List 2-58 Visual Basic .NETのPciGpibExSlavRecvData関数定義

(Byte配列型受信データ)

Declare Function PciGpibExSlavRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByRef dwpLength As Integer, ByVal pvBuffer() As Byte, ByVal uMsg As Integer) As Integer

(42)

List 2-59 Visual Basic .NETのPciGpibExSlavRecvData関数定義

(String型受信データ)

Function PciGpibExSlavRecvData(ByVal nBoardNo As Integer, ByRef dwpLength As Integer,

ByRef pvBuffer As String, ByVal uMsg As Integer) As Integer

Dim nLength As Integer Dim nRet As Integer

Dim e As ASCIIEncoding = New ASCIIEncoding() Dim szData(dwpLength - 1) As Byte

pvBuffer = ""

nLength = dwpLength

nRet = PciGpibExSlavRecvData(nBoardNo, nLength, szData, uMsg) If (nRet = 0) Then

pvBuffer = e.GetString(szData, 0, nLength) dwpLength = pvBuffer.Length

End If

PciGpibExSlavRecvData = nRet End Function

List 2-60 Visual Basic .NETのPciGpibExSlavRecvData関数定義

(IntPtr型受信データ)

Declare Function PciGpibExSlavRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer, ByRef dwpLength As Integer, ByVal pvBuffer As IntPtr, ByVal uMsg As Integer) As Integer

◆PciGpibExSetSrqEvent関数について

表2-8の変更理由「Anyキーワードが使用できない」についての修正点を以下に示 します。

List2-61,2-62にVisual Basic 6.0とVisual Basic .NETのPciGpibExSetSrqEvent関数定義 を示します。太字で記載した部分が変更点です。

List 2-61 Visual Basic 6.0のPciGpibExSetSrqEvent関数定義

Declare Function PciGpibExSetSrqEvent Lib "GPC4304.DLL" (ByVal nBoardNo As Long, ByVal lpOnSrqProc As Long, ByVal dwUser As Long) As Long

List 2-62 Visual Basic .NETのPciGpibExSetSrqEvent関数定義

Declare Function PciGpibExSetSrqEvent Lib "GPC4304.DLL" (ByVal ulBoardNo As Integer, ByVal lpOnSrqProc As PLPSRQCALLBACK, ByVal dwUser As Integer) As Integer

上記の関数宣言を行うには、PLPSRQCALLBACKの宣言が必要です。

PciGpibExSetSrqEvent関数のパラメータlpOnSrqProcは、SRQ信号有効時に自動で呼 び出されるコールバック関数のアドレスを指定するパラメータです。

Visual Basic .NET上では、デリゲートと呼ばれる仕組みを使用し、関数のコールバ ック機能を使用することができます。

(43)

PLPSRQCALLBACKは、デリゲート型を使用し、コールバック処理に使用される 関数の型を定義します。

PLPSRQCALLBACKを次のように定義します。

List 2-63 Visual Basic .NETのデリゲート型PLPSRQCALLBACK定義

Public Delegate Sub PLPSRQCALLBACK(ByVal nBoardNo As Integer, ByVal dwUser As Integer)

次のように使用します。

PLPSRQCALLBACK型のオブジェクトを保存する変数をモジュール定義ファイ ル内などに宣言します。(クラスコード中に宣言する場合、関数コールバック機 能を使用している間に、生成したデリゲート型オブジェクトが、解放されないよ うに、オブジェクトのスコープに注意が必要です。)

List 2-64 Visual Basic .NET PLPSRQCALLBACK定義 Public osp As PLPSRQCALLBACK

List 2-65 Visual Basic .NET PLPSRQCALLBACKの初期化 osp = New PLPSRQCALLBACK(AddressOf lpOnSrqProc)

nRet = PciGpibExSetSrqEvent(nBoardNo, osp, &H55) List 2-66 Visual Basic .NET lpOnSrqProc

Sub lpOnSrqProc(ByVal dwBoardNo As Integer, ByVal dwUser As Integer) ' SRQ割り込みイベント処理を行うコールバック関数です ' ここにイベントが発生した時の処理を書いてください End Sub 「Anyキーワードが使用できない」についての詳細情報はDeclare ステートメント はAs Any 型のパラメータをサポートしない』を参考にしてください。 デリゲートについての詳細情報は『デリゲードオブジェクトを使用したコールバ ック処理』を参考にしてください。

表  2-1 Visual Basic .NET用関数定義ファイル格納先 ソフトウェア Visual Basic.NET用関数定義ファイル格納先 GPC-2000 &lt;インストールフォルダ &gt;¥Interface¥BPC0818¥GPC2000¥include¥FbiDio.vb GPC-3100 &lt;インストールフォルダ &gt;¥Interface¥BPC0818¥GPC3100¥include¥FbiAd.vb GPC-3300 &lt;インストールフォルダ &gt;¥Interface
表  2-12 Visual Basic 6.0とVisual Basic .NETの主な相違点 Visual Basic 6.0 Visual Basic .NET 変数、関数、構造体 名 gConfig 変更点 構造体中の配列データの初期化処理を追加。 詳細情報 なし ファイル名 Module1.frm Module1.vb ソースリスト List2-69,2-71 List2-70,2-72
表  2-14 Visual Basic 6.0とVisual Basic .NETの主な相違点 Visual Basic 6.0 Visual Basic .NET
表  2-15 Visual Basic 6.0とVisual Basic .NETの主な相違点 Visual Basic 6.0 Visual Basic .NET
+4

参照

関連したドキュメント

8.1 In § 8.1 ∼ § 8.3, we give some explicit formulas on the Jacobi functions, which are key to the proof of the Parseval-Plancherel type formula of branching laws of

So far, most spectral and analytic properties mirror of M Z 0 those of periodic Schr¨odinger operators, but there are two important differences: (i) M 0 is not bounded from below

In addition, under the above assumptions, we show, as in the uniform norm, that a function in L 1 (K, ν) has a strongly unique best approximant if and only if the best

The explicit treatment of the metaplectic representa- tion requires various methods from analysis and geometry, in addition to the algebraic methods; and it is our aim in a series

We have avoided most of the references to the theory of semisimple Lie groups and representation theory, and instead given direct constructions of the key objects, such as for

Bipartite maps (also called hypermaps, or dessins d’enfants ) : vertices are either black or white, and monochromatic edges

Thank you, Sabers Nation, for your participation in the coronavirus SA- BERStrong Pushup Challenge. Sabers students, teachers, graduates, and parents showed their mental and

Additional applications per year are permitted when a lower Product Use Rate per Application is used, as long as the Maximum Product Rate per Year is not exceeded..