128
www.interface.co.jp TUT-0014 Ver. 3.3 DLL

Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Embed Size (px)

Citation preview

Page 1: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

www.interface.co.jp

 

TUT-0014 Ver. 3.3

~既存DLL関数の呼び出し方法~

Page 2: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 1 - Interface Corporation

改訂履歴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)GPIB(GPC-4301)

・その他技術情報を追加3.1 2004年1月 ・誤記修正3.2 2004年8月 ・ 誤記修正

・ 技術資料一覧更新3.3 2005年9月 ・ 誤記修正

・ 技術資料一覧更新

本チュートリアルをご使用の際は、必ず各製品型式の最新のドキュメント(ユーザーズマニュアル,オンラインヘルプ)をあわせて参照してください。また、最新のドライバソフトウェアをご使用ください。ユーザーズマニュアル, ドライバソフトウェアは弊社Web siteからダウンロードできます。(オンラインヘルプはドライバソフトウェアに含まれています)

Page 3: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 2 -

商標/登録商標本チュートリアルに掲載されている会社名、製品名は、それぞれ各社の商標また

は登録商標です。

保障の内容と制限

株式会社インタフェースはドキュメント内の情報の正確さに万全を期しています。

万一、誤記または誤植などがあった場合、株式会社インタフェースは予告無く改

訂する場合があります。ドキュメントまたはドキュメント内の情報に起因するい

かなる損害に対しても株式会社インタフェースは責任を負いません。

ドキュメント内の図や表は説明のためであり、ユーザ個別の応用事例により変化

する場合があります。

著作権、知的所有権

株式会社インタフェースは本製品に含まれるおよび本製品に対する権利や知的所

有権を保持しています。 本製品はコンピュータ ソフトウェア(プログラム)、 図、 文章、 写真などを含んでいます。

複製の禁止

株式会社インタフェースの許可なく、本製品(ドキュメント含む)の全て、または一部に関わらず、複製、改変などを行うことはできません。

責任の制限

株式会社インタフェースは、株式会社インタフェース または再販売者の予見の有無にかかわらず発生したいかなる特別損害、偶発的損害、間接的な損害、重大な

損害について、責任を負いません。

Page 4: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 3 - Interface Corporation

-目 次-

はじめに 5

第 1章 Visual Studio .NETとは? 7

第 2章 Visual Basic .NETへの移行 8

2.1 関数定義ファイルのインポート ...................................................................92.1.1 デジタル入出力ボード(GPC-2000) ..............................................112.1.2 アナログ入力ボード (GPC-3100) .....................................................142.1.3 アナログ出力ボード (GPC-3300) .....................................................212.1.4 GPIBボード (GPC-4301標準版 DLL) .............................................272.1.5 GPIBボード (GPC-4301高機能版 DLL) .........................................34

2.2 サンプルプログラム .....................................................................................432.2.1 デジタル入出力 (1点入力、1点出力) ...........................................432.2.2 アナログ入力 (ADボードによるサンプリング)............................462.2.3 アナログ出力 (DAボードによる出力更新)....................................482.2.4 GPIB機器制御 (標準版 DLLを使用した制御)...............................502.2.5 GPIB機器制御 (高機能版 DLLを使用した制御)...........................55

2.3 アップグレードウィザード .........................................................................612.3.1 アップグレード手順...........................................................................612.3.2 アップグレードウィザードのエラー ...............................................64

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

3.1 クラスライブラリ .........................................................................................663.2 クラスライブラリの参照設定 .....................................................................673.3 クラスライブラリの関数を呼び出す .........................................................703.4 クラスライブラリのソースファイル .........................................................773.5 カテゴリ別プログラム作成方法 .................................................................77

3.5.1 GPC-2000 .............................................................................................783.5.2 GPC-3100 .............................................................................................793.5.3 GPC-3300 .............................................................................................823.5.4 GPC-4301標準版 DLL........................................................................853.5.5 GPC-4301高機能版 DLL....................................................................88

3.6 サンプルプログラム一覧 .............................................................................92

Page 5: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 4 -

第 4章 .NET技術情報 93

4.1 DLL呼び出しの概要.....................................................................................934.1.1 マネージコードとアンマネージコード ...........................................934.1.2 プラットフォーム呼び出し ...............................................................94

4.2 DLL関数呼び出し方法.................................................................................954.2.1 DLLおよびその DLLが提供する関数を識別するための情報 .....954.2.2 DLL 関数を保持するクラスを作成します。 .................................964.2.3 マネージコードでのプロトタイプ宣言の記述 ...............................964.2.4 DLL関数の呼び出し ..........................................................................99

4.3 その他の注意事項と追加情報 ...................................................................1004.3.1 Declare ステートメントは As Any 型のパラメータをサポートしない ....................................................................................................................1004.3.2 明示的なマーシャリングが必要となる場合 .................................1004.3.3 構造体を使用する場合の注意点 .....................................................1014.3.4 構造体の中の構造体配列 (GPC-3100の例) ..................................1044.3.5 固定長文字列.....................................................................................1074.3.6 文字エンコード.................................................................................1084.3.7 デリゲート オブジェクトを使用したコールバック処理 ...........1104.3.8 イベントオブジェクト.....................................................................1134.3.9 関数のオーバーロード.....................................................................1164.3.10 クラスライブラリの参照先が未解決になった場合 ...................1174.3.11 Visual C++ .NETの補足情報 .........................................................119

用語集 122

技術資料紹介 124

参考文献 125

Page 6: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 5 - Interface Corporation

はじめに

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

■本書の目的と内容本書の目的は、Visual Studio 6.0からVisual Studio .NETへ開発環境を移行されるお客様へ、弊社の既存のソフトウェアライブラリを継続して利用していただくための情報を提供することです。弊社Windows用ソフトウェアライブラリ(GPCシリーズ)が提供する既存の関数群をVisual Studio .NET開発環境(Visual Basic .NET,Visual C# .NET,Visual C++.NET)から利用するために必要な情報を記載しています。本書では各カテゴリ別にVisualStudio .NET用のサンプルプログラムを提供すると共に、Visual Studio 6.0からVisualStudio .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.jpE-mail:[email protected]

Page 7: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 6 -

■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より提供しています。(サンプルプログラム付き)是非、本書と合わせてご利用ください。

Page 8: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 7 - Interface Corporation

第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への移行の説明に入ります。

各言語の説明に入る前に各製品のユーザーズマニュアルに従って、ボードの設置、

ドライバのインストール,ドライバソフトウェアのインストールを行ってくださ

い。

Page 9: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 8 -

第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ライブラリなど)をご参照ください。

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

説明します。

Page 10: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 9 - Interface Corporation

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

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

1. Visual Studio .NETを起動します。2. ファイル-新規作成-プロジェクトを選択し、新規にプロジェクトを作成します。

Visual Basicプロジェクトが選択されていることを確認し、プロジェクト名を入力し、「OK」をクリックします。

図 2-1 新規プロジェクト作成

3. 次に、プロジェクトに関数定義ファイルの追加を行います。ソリューションエクスプローラを開き、プロジェクト名上で右クリックします。

「追加」-「既存項目の追加」を選択します。

図 2-2 関数定義ファイルの追加

Page 11: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 10 -

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についての変更点を説明していきます。

Page 12: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 11 - Interface Corporation

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 型のパラメータをサポートしない』

Page 13: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 12 -

◆定数について

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

してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言えることですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を必要とするように変更されています。また、以前のバージョンでは可能であった、

変数宣言なしでいきなり変数を使用する処理もできなくなっています。

曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること

が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には

注意が必要になります。

◆関数について

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

DioInputHandShake関数は、複数のデータ型に対応するため、複数の関数定義を行います。

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

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

してください。

Page 14: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 13 - Interface Corporation

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, ByReflpBuffer 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 AsInteger, 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 AsInteger, 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 lpNumOfBytesReadAs 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 lpNumOfBytesReadAs Integer, ByRef lpOverlapped As OVERLAPPED) As Integer

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

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

同様の変更理由により、修正が必要な関数も同様の変更方法で修正してください。

また、「Anyキーワードが使用できない」についての詳細情報は、『Declare ステートメントはAs Any 型のパラメータをサポートしない』を参考にしてください。ここで説明した以外のAPI関数については、Visual Basic 6.0以前と同様の方法で使用することが可能です。

また、各API関数の使用方法についてはGPC-2000のHelpをご参照ください。

Page 15: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 14 -

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キーワードが使用できないAdReadSamplingBuffer Anyキーワードが使用できないAdFifoGetSamplingData Anyキーワードが使用できない

『Declare ステートメントはAs Any 型のパラメータをサポートしない』

Page 16: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 15 - Interface Corporation

構造体名 変更理由 詳細情報ADSMPLCHREQ 構造体定義の変更 『構造体を使

用する場合の注意点』

ADTRIGCHREQ 構造体定義の変更 『構造体を使用する場合の注意点』

ADSMPLREQ 構造体定義とデータ設定方法の変更 『構造体の中の構造体配列』

ADBMSMPLREQ 構造体定義とデータ設定方法の変更 『構造体の中の構造体配列』

ADBOARDSPEC 構造体定義の変更 『構造体を使用する場合の注意点』

Page 17: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 16 -

◆定数について

表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では定数の宣言時に型を必要としませんでしたが、VisualBasic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認

してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言えることですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を必要とするように変更されています。また、以前のバージョンでは可能であった、

変数宣言なしでいきなり変数を使用する処理もできなくなっています。

曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること

が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には

注意が必要になります。

◆関数について

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

AdInputAD関数は、複数のデータ型に対応するため、複数の関数定義を行います。

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

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

してください。

Page 18: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 17 - Interface Corporation

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 AsAny) As Long

List2-8 Visual Basic .NETのAdInputAD関数定義Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh AsInteger, ByVal ulSingleDiff As Integer, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByReflpData As Byte) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh AsInteger, ByVal ulSingleDiff As Integer, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByReflpData As Short) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh AsInteger, ByVal ulSingleDiff As Integer, ByRef lpAdSmplChReq As ADSMPLCHREQ, ByReflpData As Integer) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh AsInteger, ByVal ulSingleDiff As Integer, ByVal lpAdSmplChReq() As ADSMPLCHREQ, ByVallpData() As Byte) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh AsInteger, ByVal ulSingleDiff As Integer, ByVal lpAdSmplChReq() As ADSMPLCHREQ, ByVallpData() As Short) As Integer

Declare Function AdInputAD Lib "fbiad.dll" (ByVal hdevicehandle As Integer, ByVal ulCh AsInteger, ByVal ulSingleDiff As Integer, ByVal lpAdSmplChReq() As ADSMPLCHREQ, ByVallpData() As Integer) As Integer

同様の変更理由により、修正が必要な関数も同様の変更方法で修正してください。

また、「Anyキーワードが使用できない」についての詳細情報は、『Declare ステートメントはAs Any 型のパラメータをサポートしない』を参考にしてください。

Page 19: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 18 -

◆構造体について

表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 LongEnd Type

List 2-10 Visual Basic .NETのADSMPLCHREQ構造体定義Option Strict OffOption Explicit OnImports System.Runtime.InteropServicesModule FbiAd・・<StructLayout(LayoutKind.Sequential)> _Structure ADSMPLCHREQ Dim ulChNo As Integer Dim ulRange As Integer End Structure

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

ださい。

Page 20: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 19 - Interface Corporation

次に、表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 LongEnd Type

Page 21: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 20 -

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

これは、標準マーシャリングサービスでは、構造体中のメンバに構造体配列があ

る場合、整数配列や、固定長文字列を引き渡す場合と同じように定義しても、呼

び出し時にマーシャリングに失敗するためです。これを解決するために、構造体

中の配列データへのアクセスには、SetChNo、GetChNo、SetRangeNo、GetRangeNoという専用のメソッドを利用します。

Page 22: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 21 - Interface Corporation

修正箇所の詳細情報に関しては、『構造体の中の構造体配列(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の関数定義ファイルは、以下の定数と関数と構造体が変更になっています。

これらの定数、関数、構造体を使用される場合は注意してください。

Page 23: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 22 -

表 2-4 関数定義ファイルの変更点 (アナログ出力)定数名 変更理由 詳細情報

FLAG_SYNCなど データ型の指定が必要 なし

関数名 変更理由 詳細情報DaSetSamplingData Anyキーワードが使用できないDaOutputDA Anyキーワードが使用できないDaDataConv Anyキーワードが使用できないDaWriteFile Anyキーワードが使用できない

『 Declare ステートメントはAs Any 型のパラメータをサポートしない』

構造体名 変更理由 詳細情報DASMPLCHREQ 構造体定義の変更 『構造体を使

用する場合の注意点』

DASMPLREQ 構造体定義とデータ設定方法の変更 『構造体の中の 構 造 体 配列』

DABOARDSPEC 構造体定義の変更 『構造体を使用する場合の注意点』

DAMODECHREQ 構造体定義の変更 『構造体を使用する場合の注意点』

DAMODEREQ 構造体定義の変更 『構造体を使用する場合の注意点』章

DAFIFOREQ 構造体定義とデータ設定方法の変更 『構造体の中の 構 造 体 配列』

Page 24: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 23 - Interface Corporation

◆定数について

表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では定数の宣言時に型を必要としませんでしたが、VisualBasic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認

してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言えることですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を必要とするように変更されています。また、以前のバージョンでは可能であった、

変数宣言なしでいきなり変数を使用する処理もできなくなっています。

曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること

が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には

注意が必要になります。

◆関数について

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

DaSetSamplingData関数は、データ型に対応するため、複数の関数定義を行います。

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

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

してください。

Page 25: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 24 -

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 LongEnd Type

Page 26: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 25 - Interface Corporation

List 2-18 Visual Basic .NETのDASMPLCHREQ構造体定義Option Strict OffOption Explicit OnImports System.Runtime.InteropServicesModule 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 LongEnd Type

Page 27: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 26 -

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関数や構造体については、VisualBasic 6.0以前と同様の方法で使用することが可能です。また、API関数や構造体の使用方法についてはGPC-3100のHelpを参照してください。

Page 28: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 27 - Interface Corporation

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_ACTIVE_SRQなど

データ型の指定が必要 なし

Page 29: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 28 -

関数名 変更理由 詳細情報GpibReceiveGpibSend

複数の送受信データ型に対応するため、複数の関数定義を行います。

『固定長文字列』『文字エンコード』『関数のオーバーロード』

GpibSetSrqEvent Anyキーワードが使用できない 『Declare ステートメントは AsAny 型のパラメータをサポートしない』

また、次の定義を追加します。項目 追加理由 詳細情報

delegate型関数宣言の追加(PLPSRQCALLBACK)

コールバック関数を使用するためにdelegate宣言を追加します。GpibSetSrqEvent関数が要求するパラメータのひとつが使用する型です。

『デリゲード オブジェクトを使用したコールバック処理』

Page 30: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 29 - Interface Corporation

◆定数について

表 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では定数の宣言時に型を必要としませんでしたが、VisualBasic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認

してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言えることですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を必要とするように変更されています。また、以前のバージョンでは可能であった、

変数宣言なしでいきなり変数を使用する処理もできなくなっています。

曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること

が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には

注意が必要になります。

◆GpibSend関数について

GpibSetnd関数は、複数の送信データ型に対応するため、複数の関数定義を行います。本書で取り上げる関数定義では、送信データ格納先に次のデータ型を指定で

きます。

バイト型、バイト配列型、IntPtr型、文字列型。

[関数定義]

パラメータの型が異なる4つの関数宣言を行います。関数名は、すべて同じGpibSendとします。Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことができる、関数のオーバーロードをサポートしています。

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

してください。

Page 31: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 30 -

パラメータの型が異なる関数は、それぞれ次のような異なる用途で使用できます。

表 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 AsLong, 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, ByVallpAdrsTbl() 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, ByVallpAdrsTbl() 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, ByVallpAdrsTbl() 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, ByVallpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer As IntPtr) As Integer

◆GpibReceive関数について

GpibReceive関数は、複数の受信データ型に対応するため、複数の関数定義を行います。本書で取り上げる関数定義例は、受信データ格納先に次のデータ型を指定

する場合です。

バイト型,バイト配列型,IntPtr型,文字列型。

[関数定義]

パラメータの型が異なる4つの関数宣言を行います。関数名は、すべて同じGpibReceiveとします。Visual Basic .NETは、同一の関数名で、引数の異なる複数の関数定義を行うことができる、関数のオーバーロードをサポートしています。

Page 32: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 31 - Interface Corporation

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

してください。

パラメータの型が異なる関数は、それぞれ次のような異なる用途で使用できます。表 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, ByReflpAdrsTbl 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, ByVallpAdrsTbl() 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, ByVallpAdrsTbl() 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, ByRefulpLength 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 = nRetEnd Function

Page 33: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 32 -

受信データを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, ByVallpAdrsTbl() 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, ByVallpOnSrqProc 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, ByVallpOnSrqProc As PLPSRQCALLBACK, ByVal dwUser As Integer) As Integer

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

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

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

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

PLPSRQCALLBACKを定義します。

Page 34: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 33 - Interface Corporation

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 lpOnSrqProcSub 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ヘルプ」を参照してください。

Page 35: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 34 -

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_FOUND_LISTENERなど

データ型の指定が必要 なし

Page 36: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 35 - Interface Corporation

関数名 変更理由 詳細情報PciGpibExMastSendDataPciGpibExMastRecvDataPciGpibExSlavSendDataPciGpibExSlavRecvData

複数の送受信データ型に対応するため、複数の関数定義を行います。

『固定長文字列』『文字エンコード』『関数のオーバーロード』

PciGpibExSetSrqEvent Anyキーワードが使用できない 『 Declare ステートメントはAs Any 型のパラメータをサポートしない』

また、次の定義を追加します。項目 追加理由 詳細情報

delegate型関数宣言の追加(PLPSRQCALLBACK)

コールバック関数を使用するためにdelegate宣言を追加します。PciGpibExSetSrqEvent関数が要求するパラメータの一つが使用する型です。

『デリゲードオブジェクトを使用したコールバック処理』

Page 37: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 36 -

◆定数について表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では定数の宣言時に型を必要としませんでしたが、VisualBasic .NETでは定数に対しても使用する型を明示的に宣言する必要があります。その他の定数でも同様に修正されています。各関数定義ファイルを比較し、確認

してください。

次項目で説明している「Anyキーワードが使用できない」と言う変更にも言えることですが、Visual Basic .NETでは全体的に曖昧さをなくして厳密な定義・宣言を必要とするように変更されています。また、以前のバージョンでは可能であった、

変数宣言なしでいきなり変数を使用する処理もできなくなっています。

曖昧な変数定義等をなくす事で、バグを埋め込んでしまう可能性を排除すること

が可能ですが、これまで変数定義に気を遣わずにコーディングしていた場合には

注意が必要になります。

◆PciGpibExMastSendData関数について

PciGpibExMastSendData関数は、複数の送信データ型に対応するため、複数の関数定義を行います。

本書で取り上げる関数定義例は、受信データ格納先に次のデータ型を指定する場

合です。

バイト型、バイト配列型、IntPtr型、文字列型。

Page 38: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 37 - Interface Corporation

[関数定義]

パラメータの型が異なる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, ByRefnpAdrsTbl 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, ByValuMsg 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, ByValuMsg 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, ByValuMsg 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, ByValuMsg As Integer) As Integer

Page 39: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 38 -

◆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 uMsgAs 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, ByValuMsg As Integer) As Integer

List 2-48 Visual Basic .NETのPciGpibExMastRecvData関数定義(Byte配列型用)Declare Function PciGpibExMastRecvData Lib "GPC4304.DLL" (ByVal nBoardNo As Integer,ByVal npAdrsTbl() As Integer, ByRef dwpLength As Integer, ByVal pvBuffer() As Byte, ByValuMsg As Integer) As Integer

Page 40: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 39 - Interface Corporation

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 = nRetEnd 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, ByValuMsg 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

Page 41: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 40 -

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, ByRefdwpLength 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

Page 42: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 41 - Interface Corporation

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 = nRetEnd 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, ByVallpOnSrqProc 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上では、デリゲートと呼ばれる仕組みを使用し、関数のコールバック機能を使用することができます。

Page 43: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 42 -

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 lpOnSrqProcSub 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ヘルプ」を参照してください。

Page 44: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 43 - Interface Corporation

2.2 サンプルプログラム

2.2.1 デジタル入出力 (1点入力、1点出力)

それでは、弊社デジタル入出力ボード (PCI-2994CV) で1点入力、1点出力のサンプルプログラムを確認していきましょう。本プログラムは、デジタル入出力ボ

ードソフトウェアライブラリであるGPC-2000に格納されているサンプルプログラム (Visual Basic 6.0以前用) と同様の処理をVisual Basic .NET上で実現するものです。

本書ではデジタル入出力の概要や、ボードの制御手順、外部機器との配線方法な

どの詳細手順は説明しません。これらの情報は「Visual BasicによるDIO入門書」をご参照ください。

ボード PCI-2994CV

Visual Basic 6.0 / 1点入力サンプルプログラムソフトウェア GPC-2000プロジェクト名 Inpoint.vbp格納先フォルダ <インストール先>¥Interface¥GPC2000¥samples¥vb¥Inpoint

Visual Basic .NET / 1点入力サンプルプログラムソフトウェア BPC-0818プロジェクト名 Inpoint.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC2000¥samples¥vb¥Inpoint

Visual Basic 6.0 / 1点出力サンプルプログラムソフトウェア GPC-2000プロジェクト名 Outpoint.vbp格納先フォルダ <インストール先>

¥Interface¥GPC2000¥samples¥vb¥Outpoint

Visual Basic .NET / 1点出力サンプルプログラムソフトウェア BPC-0818プロジェクト名 Outpoint.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC2000¥samples¥vb¥Outpoint

Visual Basic 6.0からVisual Basic .NETへの主な相違点は以下の通りです。

Page 45: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 44 -

表 2-11 Visual Basic 6.0とVisual Basic .NETの主な相違点Visual Basic 6.0 Visual

Basic .NET変数、関数、構造体名 OVERLAPPED

変更点 構造体定義の変更詳細情報 『構造体を使用する場合の注意点』ファイル名 Module1.frm Module1.vbソースリスト List2-67 List2-68

1. Visual Studio .NETを起動します。2. 「ファイル」-「開く」-「プロジェクト」を選択し、プロジェクトファイルを開きます。

3. ソリューションエクスプローラから表2-11に示したファイル名を開きます。4. 表2-11に示した各ソースリストにVisual Basic 6.0とVisual Basic .NETの構造体定義を示します。太字で記載した部分が変更点です。

List 2-67 Visual Basic 6.0のModule.frm内の構造体定義Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As Long hEvent As LongEnd TypeType SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As LongEnd Type

Page 46: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 45 - Interface Corporation

List 2-68 Visual Basic .NETのModule.vb内の構造体定義Option Strict OffOption Explicit OnImports System.Runtime.InteropServicesModule Module1・ <StructLayOut(LayoutKind.Sequential)> Structure OVERLAPPED

Dim Internal As Integer Dim InternalHigh As Integer Dim offset As Integer

Dim OffsetHigh As Integer Dim hEvent As Integer End Structure <StructLayout(LayoutKind.Sequential)> Structure SECURITY_ATTRIBUTES Dim nLength As Integer Dim lpSecurityDescriptor As Integer Dim bInheritHandle As Integer End Structure

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

ださい。

弊社デジタル入出力ボードソフトウェアライブラリに関連する相違点は以上です。

Visual Basic 6.0とVisual Basic .NETの詳細なソースコードの違いは、各サンプルプログラムを比較しご確認ください。

Page 47: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 46 -

2.2.2 アナログ入力 (ADボードによるサンプリング)

それでは、弊社ADボード (PCI-3133) のサンプリングのサンプルプログラムを確認していきましょう。本プログラムは、アナログ入力ボードソフトウェアライブ

ラリであるGPC-3100に格納されているサンプルプログラム (Visual Basic 6.0以前用) と同様の処理をVisual Basic .NET上で実現するものです。本書ではアナログ入力の概要や、ボードの制御手順、外部機器との配線方法など

の詳細手順は説明しません。これらの情報は「Visual BasicによるAD入門書」をご参照ください。

今回使用した環境は以下の通りです。

ボード PCI-3133

Visual Basic 6.0 / ADボードによるサンプリングソフトウェア GPC-3100プロジェクト名 AdSmpl_B.vbp格納先フォルダ <インストール先>

¥Interface¥GPC3100¥samples¥vb¥Ad_Smpl_B

Visual Basic .NET / ADボードによるサンプリングソフトウェア BPC-0818プロジェクト名 AdSmpl_B.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC3100¥samples¥vb¥Ad_Smpl_B

Visual Basic 6.0からVisual Basic .NETへの主な相違点は以下の通りです。

Page 48: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 47 - Interface Corporation

表 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

1. Visual Studio .NETを起動します。2. ファイル-開く-プロジェクトを選択し、プロジェクトファイルを開きます。3. ソリューションエクスプローラから表2-12に示したファイル名を開きます。4. 表2-12に示した各ソースリストにVisual Basic 6.0とVisual Basic .NETの構造体定義を示します。太字で記載した部分が変更点です。

List 2-69 Visual Basic 6.0のModule1.bas内の構造体配列宣言Public gConfig As ADSMPLREQ

List 2-70 Visual Basic .NETのModule1.vb内の構造体配列宣言Public gConfig As ADSMPLREQ = New ADSMPLREQ(0)

この修正は通常の構造体メンバは宣言時に初期化されますが、構造体中の配列デ

ータは初期化されない(Nothingのままになる)ため、構造体の宣言時にコンストラクタを使用して明示的に初期化する必要があるためです。

この構造体中の配列データを使用している部分は全て下記のように変更します。List 2-71 Visual Basic 6.0のADSMPLREQ内の配列データを使用する箇所

Public gConfig As ADSMPLREQ gConfig.SmplChReq(0).ulChNo = ... gConfig.SmplChReq(0).ulRange = ... ... = gConfig.SmplChReq(0).ulChNo ... = gConfig.SmplChReq(0).ulRange

Page 49: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 48 -

List 2-72 Visual Basic .NETのADSMPLREQ内の配列データを使用する箇所Public gConfig As New ADSMPLREQ(0) gConfig.SetChNo(0, ...) gConfig.SetChRange(0, ...) ... = gConfig.GetChNo(0) ... = gConfig.GetChRange(0)

弊社アナログ入力ボードソフトウェアライブラリに関連する相違点は以上です。

Visual Basic 6.0とVisual Basic .NETの詳細なソースコードの違いは、各サンプルプログラムを比較しご確認ください。

2.2.3 アナログ出力 (DAボードによる出力更新)

それでは、弊社DAボード (PCI-3329) で出力更新のサンプルプログラムのを確認していきましょう。本プログラムは、DAボードソフトウェアライブラリであるGPC-3300に格納されているサンプルプログラム (Visual Basic 6.0以前用) と同様の処理をVisual Basic .NET上で実現するものです。本書ではアナログ出力の概要や、ボードの制御手順、外部機器との配線方法など

の詳細手順は説明しません。これらの情報は「Visual BasicによるDA入門書」をご参照ください。

今回使用した環境は以下の通りです。

ボード PCI-3329

Visual Basic 6.0 / DAボードによる出力更新ソフトウェア GPC-3300プロジェクト名 DaSmpl_B.vbp格納先フォルダ <インストール先>

¥Interface¥GPC3300¥samples¥vb¥Da_Smpl_B

Visual Basic .NET / DAボードによる出力更新ソフトウェア BPC-0818プロジェクト名 DaSmpl_B.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC3300¥samples¥vb¥Da_Smpl_B

Page 50: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 49 - Interface Corporation

Visual Basic 6.0からVisual Basic .NETへの主な相違点は以下の通りです。

表 2-13 Visual Basic 6.0とVisual Basic .NETの主な相違点Visual Basic 6.0 Visual Basic .NET

変数、関数、構造体名 gConfig変更点 構造体中の配列データの初期化処理を追加。詳細情報 なしファイル名 Module1.frm Module1.vbソースリスト List2-73,2-75 List2-74,2-76

1. Visual Studio .NETを起動します。2. ファイル-開く-プロジェクトを選択し、プロジェクトファイルを開きます。3. ソリューションエクスプローラから表0-1に示したファイル名を開きます。4. 表2-13に示した各ソースリストにVisual Basic 6.0とVisual Basic .NETの構造体定義を示します。太字で記載した部分が変更点です。

List 2-73 Visual Basic 6.0のModule1.bas内の構造体配列宣言Public gConfig As DASMPLREQ

List 2-74 Visual Basic .NETのModule1.vb内の構造体配列宣言Public gConfig As DASMPLREQ = New DASMPLREQ(0)

この修正は通常の構造体メンバは宣言時に初期化されますが、構造体中の配列デ

ータは初期化されない(Nothingのままになる)ため、構造体の宣言時にコンストラクタを使用して明示的に初期化する必要があるためです。

Page 51: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 50 -

この構造体中の配列データを使用している部分は全て下記のように変更します。

変更点を太字で示します。List 2-75 Visual Basic 6.0のDASMPLREQ内の配列データを使用する箇所

Public gConfig As DASMPLREQ gConfig.SmplChReq(0).ulChNo = ... gConfig.SmplChReq(0).ulRange = ... ... = gConfig.SmplChReq(0).ulChNo ... = gConfig.SmplChReq(0).ulRange

List 2-76 Visual Basic .NETのDASMPLREQ内の配列データを使用する箇所Public gConfig As New DASMPLREQ(0) gConfig.SetChNo(0, ...) gConfig.SetChRange(0, ...) ... = gConfig.GetChNo(0) ... = gConfig.GetChRange(0)

弊社アナログ入力ボードソフトウェアライブラリに関連する相違点は以上です。

Visual Basic 6.0とVisual Basic .NETの詳細なソースコードの違いは、各サンプルプログラムを比較しご確認ください。

2.2.4 GPIB機器制御 (標準版DLLを使用した制御)

それでは、弊社GPIBボード (PCI-4302) のサンプルプログラムを確認していきましょう。

本プログラムは、GPIBボード用ソフトウェアライブラリであるGPC-4301に格納されているサンプルプログラム (Visual Basic 6.0以前用) と同様の処理をVisualBasic .NET上で実現するものです。

本書ではGPIB機器制御の概要や、ボードの制御手順、外部機器との配線方法などの詳細手順は説明しません。

Page 52: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 51 - Interface Corporation

今回使用した環境は以下の通りです。

ボード PCI-4302GPIBケーブル CAB-2220GPIB接続機器 マルチメータ Agilent Technologies HP 34401A 他

Visual Basic 6.0 / GPIB機器制御ソフトウェア GPC-4301プロジェクト名 Ctrl_B2.vbp格納先フォルダ

<インストール先>¥Interface¥GPC4301¥Smpl_DllStandard¥vb¥Ctrl_B2

Visual Basic .NET / GPIB機器制御ソフトウェア BPC-0818プロジェクト名 Ctrl_B2.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥ GPC4301¥samples_std¥vb¥Ctrl_B2

Visual Basic 6.0からVisual Basic .NETへの主な相違点は以下の通りです。表 2-14 Visual Basic 6.0とVisual Basic .NETの主な相違点

Visual Basic 6.0 Visual Basic .NET変数、関数 SetPrm、RecvBuffer、GpibSend関数、

GpibReceive関数。変更点 固定長文字列を文字列型に変更。

送信処理変更。受信処理変更。

詳細情報 なしファイル名 Ctrl_B2.bas

CtrlSendForm.frmCtrlRecvForm.frm

Ctrl_B2.vbCtrlSendForm.vbCtrlRecvForm.vb

ソースリスト List2-77,2-78,2-79 List2-78,2-80,2-82

1. Visual Studio .NETを起動します。2. ファイル-開く-プロジェクトを選択し、プロジェクトファイルを開きます。3. ソリューションエクスプローラから表2-14に示したファイル名を開きます。4. 表2-14に示した各ソースリストにVisual Basic 6.0とVisual Basic .NETの違いを示します。太字で記載した部分が変更点です。

Page 53: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 52 -

固定長文字列を文字列String型に変更します。Visual Basic .NETは固定長文字列をサポートしません。

List 2-77 Visual Basic 6.0のCtrl_B2.bas内の固定長文字列定義Public SetPrm As String * 128 ' パラメータPublic RecvBuffer As String * 32 ' 受信バッファ

List 2-78 Visual Basic .NETのCtrl_B2.vb内の文字列定義Public SetPrm As String ' パラメータPublic RecvBuffer As String ' 受信バッファ

送信処理を次のように変更します。

送信データをString型のままGpibSend関数に指定します。また、送信データを、コントロール配列で定義されたテキストボックスから取得

する処理を変更します。Visual Basic .NETは、コントロール配列をサポートしません。

そのため、例では、TextBox型の配列TextBoxTblに、フォーム上の全てのTextBoxコントロールを定義して、Forループ処理内で順番に処理しています。

List 2-79 Visual Basic 6.0のCtrlSendForm.frm内の送信処理Private Sub CmdSend_Click() Dim nRet As Long Dim szData As String Dim nLen As Long Dim i As Long ' 機器アドレステーブル設定 DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1

' データ送信 For i = 1 To 5 szData = TxtSendData(i).Text szData = StrConv(szData, vbFromUnicode) nLen = LenB(szData) If nLen = 0 Then Exit For szData = StrConv(szData, vbUnicode) nRet = GpibSend(nBoardNo, DevAdrsTbl(0), nLen, szData) If nRet Then Exit For Next Call DsplyErrMessage(nRet)End Sub

Page 54: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 53 - Interface Corporation

List 2-80 Visual Basic .NETのCtrlSendForm.vb内の送信処理Private Sub CmdSend_Click(ByVal eventSender As System.Object, ByVal eventArgs AsSystem.EventArgs) Handles CmdSend.Click Dim nRet As Integer Dim szData As String Dim nLen As Integer Dim i As Integer Dim TextBoxTbl() As TextBox = New TextBox() {TextBox1, TextBox2, TextBox3, TextBox4,TextBox5}

' 機器アドレステーブル設定 DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1

' データ送信 For i = 0 To (TextBoxTbl.Length - 1) szData = TextBoxTbl(i).Text nLen = szData.Length If nLen <> 0 Then nRet = GpibSend(nBoardNo, DevAdrsTbl, nLen, szData) If nRet Then Exit For End If End If Next Call DsplyErrMessage(nRet)End Sub

受信処理を次のように変更します。

受信データを格納するString型の変数をGpibReceive関数に指定するように変更します。

GpibReceive関数の第2パラメータには、最大受信データ長を格納した変数を指定します。

GpibReceive関数の第4パラメータ(受信データ格納先変数)にString型を指定した場合、第2パラメータに指定されたデータ長分のByte配列を用意し、データ取得後にString型へ変換されます。この処理の詳細については、GPC4301Std.vb内のGpibReceive関数の定義をご確認ください。

Page 55: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 54 -

List 2-81 Visual Basic 6.0のCtrlRecvForm.frm内の受信処理Private Sub CmdRecv_Click() Dim nRet As Long Dim nLen As Long ' 機器アドレステーブル設定 DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1 ' データ受信 Dim RecvLen As Long RecvLen = 64 nRet = GpibReceive(nBoardNo, DevAdrsTbl, RecvLen, RecvBuffer)

If nRet Then Call DsplyErrMessage(nRet) Unload CtrlRecvForm End If Call DsplyErrMessage(nRet) LblRecvData.Caption = Left(RecvBuffer, RecvLen)End Sub

List 2-82 Visual Basic .NETのCtrlRecvForm.vb内の受信処理Private Sub CmdRecv_Click(ByVal eventSender As System.Object, ByVal eventArgs AsSystem.EventArgs) Handles CmdRecv.Click Dim nRet As Integer Dim nLen As Integer

' 機器アドレステーブル設定 DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1

' データ受信 Dim RecvLen As Integer RecvLen = 64 nRet = GpibReceive(nBoardNo, DevAdrsTbl, RecvLen, RecvBuffer)

If nRet Then Call DsplyErrMessage(nRet) CtrlRecvForm.DefInstance.Close() End If

Call DsplyErrMessage(nRet) LblRecvData.Text = RecvBufferEnd Sub

Visual Basic 6.0とVisual Basic .NETの詳細なソースコードの違いは、各サンプルプログラムを比較しご確認ください。

Page 56: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 55 - Interface Corporation

2.2.5 GPIB機器制御 (高機能版DLLを使用した制御)

それでは、弊社GPIBボード (PCI-4302) のサンプルプログラムを確認していきましょう。

本プログラムは、GPIBボード用ソフトウェアライブラリであるGPC-4301に格納されているサンプルプログラム (Visual Basic 6.0以前用) と同様の処理をVisualBasic .NET上で実現するものです。本書ではGPIB機器制御の概要や、ボードの制御手順などの詳細手順は説明しません。

今回使用した環境は以下の通りです。

ボード PCI-4302GPIBケーブル CAB-2220GPIB接続機器 マルチメータ Agilent Technologies HP 34401A 他

Visual Basic 6.0 / 任意の機器との送受信ソフトウェア GPC-4301プロジェクト名 Ctrl_B.vbp格納先フォルダ <インストール先>¥Interface¥GPC4301¥samples¥vb¥Ctrl_B

Visual Basic .NET / 任意の機器との送受信ソフトウェア BPC-0818プロジェクト名 Ctrl_B.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC4301¥samples_adv¥Ctrl_B

Page 57: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 56 -

Visual Basic 6.0からVisual Basic .NETへの主な相違点は以下の通りです。表 2-15 Visual Basic 6.0とVisual Basic .NETの主な相違点

Visual Basic 6.0 Visual Basic .NET変数、関数 SetPrm、RecvBuffer、PciGpibExMastSendData関数、

PciGpibExMastRecvData関数。変更点 固定長文字列を文字列型に変更。

送信処理変更。受信処理変更。

詳細情報 なしファイル名 Ctrl_B.bas

CtrlSendForm.frmCtrlRecvForm.frm

Ctrl_B.vbCtrlSendForm.vbCtrlRecvForm.vb

ソースリスト List2-83,2-85,2-87 List2-84,2-86,2-88

1. Visual Studio .NETを起動します。2. ファイル-開く-プロジェクトを選択し、プロジェクトファイルを開きます。3. ソリューションエクスプローラから表 2-に示したファイル名を開きます。4. 表2-15に示した各ソースリストにVisual Basic 6.0とVisual Basic .NETの違いを示します。太字で記載した部分が変更点です。

固定長文字列を文字列String型に変更します。Visual Basic .NETは固定長文字列をサポートしません。

List 2-83 Visual Basic 6.0のCtrl_B.bas内の固定長文字列定義Public SetPrm As String * 128 ' ParameterPublic RecvBuffer As String * 32 ' Receive buffer

List 2-84 Visual Basic .NETのCtrl_B.vb内の文字列定義Public SetPrm As String ' ParameterPublic RecvBuffer As String ' Receive buffer

Page 58: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 57 - Interface Corporation

送信処理を次のように変更します。

送信データをString型のままPciGpibExMastSendData関数に指定します。また、送信データを、コントロール配列で定義されたテキストボックスから取得

する処理を変更します。Visual Basic .NETは、コントロール配列をサポートしません。

そのため、例では、TextBox型の配列TextBoxTblに、フォーム上の全てのTextBoxコントロールを定義して、Forループ処理内で順番に処理しています。

List 2-85 Visual Basic 6.0のCtrlSendForm.frm内の送信処理Private Sub CmdSend_Click() Dim nRet As Long Dim szData As String Dim nLen As Long Dim i As Long ' Configures the device address table. DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1

' Sends data to specified device. For i = 1 To 5 szData = TxtSendData(i).Text szData = StrConv(szData, vbFromUnicode) nLen = LenB(szData) If nLen = 0 Then Exit For szData = StrConv(szData, vbUnicode) nRet = PciGpibExMastSendData(nBoardNo, DevAdrsTbl(0), nLen, szData, 0) If nRet Then Exit For Next Call DsplyErrMessage(nRet)

End Sub

Page 59: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 58 -

List 2-86 Visual Basic .NETのCtrlSendForm.vb内の送信処理Private Sub CmdSend_Click(ByVal eventSender As System.Object, ByVal eventArgs AsSystem.EventArgs) Handles CmdSend.Click Dim nRet As Integer Dim szData As String Dim nLen As Integer Dim i As Integer Dim TextBoxTbl() As TextBox = New TextBox() {TextBox1, TextBox2, TextBox3,TextBox4, TextBox5}

' Configures the device address table. DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1

' Sends data to specified device. For i = 0 To (TextBoxTbl.Length - 1) szData = TextBoxTbl(i).Text nLen = szData.Length If nLen <> 0 Then nRet = PciGpibExMastSendData(nBoardNo, DevAdrsTbl, nLen, szData, 0) If nRet Then Exit For End If End If Next Call DsplyErrMessage(nRet)

End Sub

受信処理を次のように変更します。受信データを格納するString型の変数をPciGpibExMastRecvData関数に指定するように変更します。PciGpibExMastRecvData関数の第2パラメータには、最大受信データ長を格納した変数を指定します。

PciGpibExMastRecvData関数の第4パラメータ(受信データ格納先変数)にString型を指定した場合、第2パラメータに指定されたデータ長分のByte配列を用意し、データ取得後にString型へ変換されます。この処理の詳細については、GPC4301Ex.vb内のPciGpibExMastRecvData関数の定義をご確認ください。

Page 60: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 59 - Interface Corporation

List 2-87 Visual Basic 6.0のCtrlRecvForm.frm内の受信処理Private Sub CmdRecv_Click() Dim nRet As Long Dim nLen As Long ' Configures the device address table. DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1 ' Sends data to specified device. Dim RecvLen As Long RecvLen = 64 nRet = PciGpibExMastRecvData(nBoardNo, DevAdrsTbl(0), RecvLen, RecvBuffer, 0)

If nRet Then Call DsplyErrMessage(nRet) Unload CtrlRecvForm End If Call DsplyErrMessage(nRet) LblRecvData.Caption = Left(RecvBuffer, RecvLen)

End Sub

List 2-88 Visual Basic .NETのCtrlRecvForm.vb内の受信処理Private Sub CmdRecv_Click(ByVal eventSender As System.Object, ByVal eventArgs AsSystem.EventArgs) Handles CmdRecv.Click Dim nRet As Integer Dim nLen As Integer

' Configures the device address table. DevAdrsTbl(0) = DevAdrs DevAdrsTbl(1) = -1

' Sends data to specified device. Dim RecvLen As Integer RecvLen = 64 nRet = PciGpibExMastRecvData(nBoardNo, DevAdrsTbl, RecvLen, RecvBuffer, 0)

If nRet Then Call DsplyErrMessage(nRet) CtrlRecvForm.DefInstance.Close() End If

Call DsplyErrMessage(nRet) LblRecvData.Text = RecvBufferEnd SubVisual Basic 6.0とVisual Basic .NETの詳細なソースコードの違いは、各サンプルプログラムを比較しご確認ください。

サンプルプログラムCtrl_B以外のGPIBボード用ソフトウェアライブラリGPC-4301のサンプルプログラムもBPC-0818に含まれています。

Page 61: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 60 -

Visual Basic 6.0とVisual Basic .NETの詳細なソースコードの違いは、各サンプルプログラムを比較しご確認ください。各サンプルプログラムのインストール先は次の通りです。

Visual Basic 6.0 / YOKOGAWA7561, HP3458A制御サンプルソフトウェア GPC-4301プロジェクト名 Device_B.vbp格納先フォルダ <インストール先>

¥Interface¥GPC4301¥samples¥vb¥Device_B

Visual Basic .NET / YOKOGAWA7561, HP3458A制御サンプルソフトウェア BPC-0818プロジェクト名 Device_B.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC4301¥samples_adv¥vb¥Device_B

Visual Basic 6.0 / バイナリデータ送受信ソフトウェア GPC-4301プロジェクト名 Binary_B.vbp格納先フォルダ <インストール先>

¥Interface¥GPC4301¥samples¥vb¥ Binary_B

Visual Basic .NET / バイナリデータ送受信ソフトウェア BPC-0818プロジェクト名 Binary_B.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC4301¥samples_adv¥vb¥Binary_B

Visual Basic 6.0 / 非同期処理ソフトウェア GPC-4301プロジェクト名 Async_B.vbp格納先フォルダ <インストール先>

¥Interface¥GPC4301¥samples¥vb¥Async_B

Visual Basic .NET /非同期処理ソフトウェア BPC-0818プロジェクト名 Async_B.vbproj格納先フォルダ <インストール先>

¥Interface¥BPC0818¥GPC4301¥samples_adv¥vb ¥Async_B

Page 62: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 61 - Interface Corporation

2.3 アップグレードウィザード

Visual Studio .NETでは、Visual Basic 6.0で作成されたアプリケーションをVisualBasic .NET用に自動的にアップグレードが可能です。アップグレードウィザードはプロジェクト内のコードをVisual Basic .NETの構文に従うように変更します。また、フォームおよびコントロールをVisual Basic .NETの対応するフォームおよびコントロールで置き換えます。

ただし、アップグレードツールによる置き換えは、完全ではありません。VisualBasic 6.0とVisual Basic .NETの間の違いにより直接変換できない場合があります。そのような場合は、アップグレード レポートが表示されるので、その指示に従ってアプリケーションを修正します。

2.3.1 アップグレード手順

アップグレードは下記の手順に従って行うことができます。

1.Visual Studio .NETを起動します。2.ファイル-開く-プロジェクトを選択し、プロジェクトファイル(.vbp)を開きます。

図 2-4 プロジェクトの選択

Page 63: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 62 -

Visual Basic 6.0よりも前のバージョンで作成されたプロジェクトを開こうとすると下記のエラーメッセージが表示されます。

その場合は、あらかじめVisual Basic 6.0でプロジェクトを開き、Visual Basic 6.0用のプロジェクトに変換してください。

図 2-5 エラーメッセージ

3.自動的にアップグレードウィザードが起動します。画面の指示に従ってアップグレードを行ってください。

図 2-6 アップグレードウィザード

4.アップグレードが完了すると、下記のレポートが表示されます。アップグレードレポートはソリューションエクスプローラ上の

_UpgradeReport.htmです。

Page 64: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 63 - Interface Corporation

図 2-7 アップグレード レポート

レポートにはアップグレードウィザードにてアップグレードできなかった項目が

エラーや警告として表示されます。

弊社ソフトウェアライブラリに添付されているVisual Basic用サンプルプログラムは、Visual Basic 4.0で作成されているため、Visual Studio .NETでプロジェクトファイルを開くことはできません。

Visual Basicアップグレード ウィザードは、Visual BasicとVisual C# .NETのStandardEditionでは使用できません。

DLLが提供する関数を呼び出すプラットフォーム呼び出しや、関数呼び出しに必要な構造体の定義に関する部分も、アップグレード ウィザードは完全に置き換えできない場合があります。

アップグレードウィザードでアップグレードした場合は、アップグレードレポー

トを参照して手動で変更してください。

アップグレード ウィザードは、.NET Frameworkへの移行を手助けしてくれる有用なツールですが、一部のVisual Basic 6.0アプリケーションでは、直接変換できなかった箇所の対処など、アップグレードすることに利点がない場合があります。

Page 65: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 64 -

既存のVisual Basic 6.0アプリケーションの移行を検討されるにあたっては、事前に十分な情報収集と検証を行ってください。

Microsoft社が提供するドキュメント(MSDN ライブラリなど)に、アップグレードをスムーズに行うための情報や、注意点が記載されていますので、ご参照くだ

さい。

2.3.2 アップグレードウィザードのエラー

アップグレードウィザードの実行時に「参照されたコンポーネントを読み込めま

せんでした。」というエラーが発生する場合があります。

このエラーは、アップグレードウィザード実行時に参照できないカスタムコント

ロールをVisual Basic 6.0プロジェクトが参照している場合に発生します。

エラーを回避するには、次の手順でVisual Basic 6.0プロジェクトのコンポーネント参照設定を変更します。

図 2-8 アップグレードウィザードエラー

1.Visual Basic 6.0でプロジェクトを開きます

2.メニューの「プロジェクト」-「コンポーネント」を選択します。「コンポーネント」ダイアログが表示されます。

「コントロールタブ」中の一覧を確認し、アップグレードウィザードのエラーに

該当するチェックを外す。

図 2-9 コンポーネント ダイアログ

Page 66: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 65 - Interface Corporation

上記画面の例では、「COMCTRL32.OCX」と「DBCRID32.OCX」で参照エラーが発生しました。この場合は「Microsoft Windows Common Controls 5.0(SP2)」と「Microsoft Data Bound Grid Control 5.0(SP3)」のチェックを外します。

3.コンポーネントの設定の変更が完了したら、「OK」ボタンをクリックします。プロジェクトを保存し、Visual Basic 6.0を終了します。保存したプロジェクトをVisual Studio .NETで開き、アップグレードウィザードを実行します。

Page 67: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 66 -

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

本章では、BPC-0818で提供するC#クラスライブラリの説明と、それらのクラスライブラリを使用したアプリケーションの作成方法を説明します。

クラスライブラリは、弊社の該当するソフトウェアライブラリの関数を呼び出す

ラッパーです。

本章では、Visual C# .NETアプリケーションの例のみ記載しますが、クラスライブラリは、Visual Basic .NETアプリケーションでも使用することができます。Visual Basic .NETアプリケーションでクラスライブラリを使用する方法についての詳細は、MSDNライブラリなどをご参照ください。

本章で説明に使用したC#クラスライブラリ(DLL)と、そのソースコード、およびC#用サンプルプログラムは、本チュートリアル用サンプルプログラム集(BPC-0818)に収められています。BPC-0818をインストールして、本章の説明と併せてご覧ください。

3.1 クラスライブラリ

BPC-0818には、下記のカテゴリのクラスライブラリが含まれています。

表 3-1 クラスライブラリ名一覧カテゴリ クラス名(DLL名)

デジタル入出力ボード(GPC-2000) IFCDIOクラス(IFCDIO.DLL)アナログ入力ボード(GPC-3100) IFCADクラス(IFCAD.DLL)アナログ出力ボード(GPC-3300) IFCDAクラス(IFCDA.DLL)GPIBボード(GPC-4301 標準版DLL) IFCGPIBクラス(IFCGPIB.DLL)GPIBボード(GPC-4301 高機能版DLL) IFCGPIBEXクラス(IFCGPIBEX.DLL)

Page 68: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 67 - Interface Corporation

3.2 クラスライブラリの参照設定

C#アプリケーションのプロジェクトを新規に作成し、使用するクラスライブラリの参照設定を行うまでの手順を説明します。

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

2.メニューの「ファイル」-「新規作成」-「プロジェクト」を選択します。「新しいプロジェクト」ダイアログが表示されます。

3.「プロジェクトの種類」から「Visual C#プロジェクト」を選択します。「テンプレート」から「Windows アプリケーション」を選択します。「プロジェクト名」と「場所」を任意に設定し、「OK」ボタンをクリックします。

図 3-1 新しいプロジェクト ダイアログ

Page 69: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 68 -

4.メニューの「プロジェクト」-「参照の追加」を選択します。

図 3-2 参照の追加ダイアログ

5.「参照」ボタンをクリックして、クラスライブラリ DLLを指定します。BPC-0818に含まれるクラスライブラリDLLのインストール先は次の通りです。使用するクラスライブラリDLLを指定します。

表 3-2 クラスライブラリインストール先一覧カテゴリ インストール先とDLL名

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

<インストール先>¥Interface¥BPC0818¥GPC2000¥CLASS¥DLL¥IFCDIO.DLL

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

<インストール先>¥Interface¥BPC0818¥GPC3100¥CLASS¥DLL¥IFCAD.DLL

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

<インストール先>¥Interface¥BPC0818¥GPC3300¥CLASS¥DLL¥IFCDA.DLL

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

<インストール先>¥Interface¥BPC0818¥GPC4301¥CLASS¥DLL¥IFCGPIB.DLL

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

<インストール先>¥Interface¥BPC0818¥GPC4301¥CLASS¥DLL¥IFCGPIBEX.DLL

「選択されたコンポーネント」に指定したDLLが表示されます。「OK」ボタンをクリックします。

Page 70: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 69 - Interface Corporation

図 3-3 参照の追加ダイアログ DLL参照指定後

6.「ソリューション エクスプローラー」の「参照設定ツリー」に、指定したクラスライブラリDLLに含まれるクラス名が追加されます。

図 3-4 ソリューションエクスプローラー 参照設定

以上で設定は完了です。C#クラスライブラリが提供する関数を使用することができます。

Page 71: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 70 -

3.3 クラスライブラリの関数を呼び出す

クラスライブラリに含まれる関数や構造体定義、定数を使用する方法を説明しま

す。BPC-0818に含まれるクラスライブラリに含まれるクラスの、ネームスペースとクラス名は次の通りです。

表 3-3 ネームスペース、クラスライブラリ名一覧型式名 ネームスペース(namespace) クラス名

GPC-2000 InterfaceCorpDllWrap IFCDIOGPC-3100 InterfaceCorpDllWrap IFCADGPC-3300 InterfaceCorpDllWrap IFCDAGPC-4301標準版DLL用 InterfaceCorpDllWrap IFCGPIBGPC-4301高機能版DLL用 InterfaceCorpDllWrap IFCGPIBEX

まず、usingキーワードを使用して、使用するクラスライブラリのネームスペースの指定を追加します。

BPC-0818に含まれる各クラスは、ネームスペースを「InterfaceCorpDllWrap」としています。

List 3-1ネームスペースの追加using InterfaceCorpDllWrap;

クラスに定義された関数は、<クラス名>.<関数名>で呼び出します。

List 3-2 GPC-2000 InputPoint関数の呼び出し例IFCDIO.DioInputPoint(hSavedDevice,out nBuffer,dwStartNum,1);

List 3-3 GPC-3100 AdInputAD関数の呼び出し例IFCAD.AdInputAD(ghDeviceHandle,ulCh, gConfig.ulSingleDiff, SmplChInf, wSmpData);

List 3-4 GPC-3300 DaOutputDA関数の呼び出し例IFCDA.DaOutputDA(ghDeviceHandle, ulCh, SmplChInf, wData);

List 3-5 GPC-4301 標準版DLL GpibReceive関数の呼び出し例IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);

List 3-6 GPC-4301 高機能版DLL PciGpibExMastRecvData関数の呼び出し例IFCGPIBEX.PciGpibExMastRecvData(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer, 0);

殆どの関数のパラメータ、および使用方法は、該当するGPCシリーズの使用方法と同じです。

関数説明、および呼び出し順番などは該当するGPCシリーズのオンラインヘルプをご参照ください。

Page 72: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 71 - Interface Corporation

各クラスには、そのクラスで使用する定数や、構造体の定義も含まれています。

使用するには、<クラス名>.<定数名>を記述します。

List 3-7 GPC-2000戻り値定数の記述例IFCDIO.FBIDIO_ERROR_SUCCESS

List 3-8 GPC-3100の構造体の記述例IFCAD.ADSMPLCHREQ[ ] SmplChInf = new IFCAD.ADSMPLCHREQ[2];

List 3-9 GPC-3100の定数の記述例IFCAD.AD_ERROR_SUCCESS

List 3-10 GPC-3300の構造体の記述例IFCDA.DASMPLCHREQ[ ] SmplChInf = new IFCDA.DASMPLCHREQ[2];

List 3-11 GPC-3300の定数の記述例IFCDA.DA_ERROR_SUCCESS

List 3-12 GPC-4301標準版DLL戻り値定数の記述例IFCGPIB.GPIB_SUCCESS

List 3-13 GPC-4301高機能版DLL戻り値定数の記述例IFCGPIBEX.GPIB_SUCCESS

以上のように、クラスライブラリの関数を呼び出し、定数,構造体を使用して、

プログラムを作成します。

Page 73: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 72 -

クラスライブラリを使用して作成するアプリケーションの、1つのソースファイルの全体例を示します。

List 3-14 GPC-2000のDioInputPoint関数を使用する例(サンプルプログラムInpointのInBox.csより)using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using InterfaceCorpDllWrap;

namespace InPoint{

public class InBox : System.Windows.Forms.Form{

private System.Windows.Forms.Button button1;private System.Windows.Forms.Button button2;

・・・

private void button1_Click(object sender, System.EventArgs e){

int nRet;int nBuffer;uint dwStartNum;

・・・

nRet = IFCDIO.DioInputPoint(hSavedDevice,out nBuffer,dwStartNum,1);if (nRet != IFCDIO.FBIDIO_ERROR_SUCCESS){

MessageBox.Show("Failed to input the data.", "InPoint_Cs",MessageBoxButtons.OK,MessageBoxIcon.Error);

}・・・

}

}}

Page 74: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 73 - Interface Corporation

List 3-15 GPC-3100のAdInputAD関数を使用する例(サンプルプログラムAdSmpl_CsのSamplingForm.csより)using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using InterfaceCorpDllWrap;

namespace AdSmpl_Cs{

public class SamplingForm : System.Windows.Forms.Form{

private System.Windows.Forms.Label label1;private System.Windows.Forms.Label label2;

・・・

private void button1_Click(object sender, System.EventArgs e){

uint[ ] ghChannel = new uint[2];IFCAD.ADSMPLCHREQ[ ] SmplChInf = new IFCAD.ADSMPLCHREQ[2];byte[ ] bSmpData = new byte[2];ushort[ ] wSmpData = new ushort[2];

・・・

gnErrCode = IFCAD.AdInputAD(ghDeviceHandle,ulCh, gConfig.ulSingleDiff, SmplChInf, wSmpData);

if (gnErrCode == IFCAD.AD_ERROR_SUCCESS){・・・}・・・

}

}}

Page 75: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 74 -

List 3-16 GPC-3300のDAOutputDA関数を使用する例(サンプルプログラムDaSmpl_CsのSamplingForm.csより)using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using InterfaceCorpDllWrap;

namespace DaSmpl_Cs{

public class SamplingForm : System.Windows.Forms.Form{

private System.Windows.Forms.Label label1;private System.Windows.Forms.Label label2;

・・・

private void buttonStart_Click(object sender, System.EventArgs e){

uint[ ] ghChannel = new uint[2];IFCDA.DASMPLCHREQ[ ] SmplChInf = new IFCDA.DASMPLCHREQ[2];ushort[ ] wData = new ushort[2];uint ulCh;

・・・

// Output one analog data on the board.gnErrCode = IFCDA.DaOutputDA(ghDeviceHandle, ulCh, SmplChInf, wData);if (gnErrCode != IFCDA.DA_ERROR_SUCCESS){

・・・

}・・・

}

}}

Page 76: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 75 - Interface Corporation

List 3-17 GPC-4301 標準版DLLのGpibReceive関数を使用する例(サンプルプログラムCtrl_Cs2のReceiveForm.csより)using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using InterfaceCorpDllWrap;

namespace Ctrl_Cs2{

public class ReceiveForm : System.Windows.Forms.Form{

private System.Windows.Forms.Label label1;private System.Windows.Forms.TextBox textBoxData;

・・・

private void buttonReceive_Click(object sender, System.EventArgs e){

int nRet;string RecvBuffer = "";int[ ] DevAdrsTbl = new int [2];uint RecvLen;

// 機器アドレステーブル設定DevAdrsTbl[0] = DevAdrs;DevAdrsTbl[1] = -1;

// データ受信RecvLen = 64;

nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer);

if(nRet != 0){

CtrlCs2Form.DsplyErrMessage(nRet);return;

}

CtrlCs2Form.DsplyErrMessage(nRet);textBoxData.Text = RecvBuffer;

}

}}

Page 77: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 76 -

List 3-18 GPC-4301 高機能版DLLのPciGpibExMastRecvData関数を使用する例(サンプルプログラムCtrl_CsのReceiveForm.csより)using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using InterfaceCorpDllWrap;

namespace Ctrl_Cs{

public class ReceiveForm : System.Windows.Forms.Form{

private System.Windows.Forms.Label label1;private System.Windows.Forms.TextBox textBoxData;

・・・

private void buttonReceive_Click(object sender, System.EventArgs e){

int nRet; string RecvBuffer = "";

uint RecvLen;int[ ] DevAdrsTbl = new int[2];

// Configures the device address table. DevAdrsTbl[0] = DevAdrs; DevAdrsTbl[1] = -1;

// Sends data to specified device.RecvLen = 64;nRet = IFCGPIBEX.PciGpibExMastRecvData(nBoardNo,

DevAdrsTbl, ref RecvLen, out RecvBuffer, 0);CtrlCsForm.DsplyErrMessage(nRet);if(nRet != 0){

return;}textBoxData.Text = RecvBuffer;

}

}}

Page 78: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 77 - Interface Corporation

3.4 クラスライブラリのソースファイル

BPC-0818には、各クラスライブラリのソースファイルが含まれています。関数定義の具体的な記述については、それぞれのソースファイルをご参照くださ

い。表 3-4 クラスライブラリ ソースファイルインストール先一覧カテゴリ インストール先

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

<インストール先>¥Interface¥BPC0818¥GPC2000¥CLASS¥IFCDIO

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

<インストール先>¥Interface¥BPC0818¥GPC3100¥CLASS¥IFCAD

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

<インストール先>¥Interface¥BPC0818¥GPC3300¥CLASS¥IFCDA

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

<インストール先>¥Interface¥BPC0818¥GPC4301¥CLASS¥IFCGPIB

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

<インストール先>¥Interface¥BPC0818¥GPC4301¥CLASS¥IFCGPIBEX

各クラスライブラリのプロジェクトは次の手順で開きます。

Visual Studio .NETを起動し、「ファイル」-「開く」-「プロジェクト」を選択します。各クラスライブラリのインストール先フォルダにある、C#プロジェクトファイル(.csproj)を、指定して「開く」ボタンをクリックします。

3.5 カテゴリ別プログラム作成方法

各カテゴリ別に基本的なプログラムの作成方法を説明します。

各関数の定義は、BPC-0818のクラスライブラリに含まれています。関数呼び出し例は、クラスライブラリを使用しています。

関数を呼び出すには、クラスライブラリの参照設定と、usingキーワードによる使用するネームスペースの追加が必要です。

『クラスライブラリの参照設定』、および『クラスライブラリの関数を呼び出す』

をあわせてお読みください。

また、各カテゴリのパラメータ説明や、関数呼び出し順番などの詳細は、各ソフ

トウェアライブラリのオンラインヘルプを参照ください。

Page 79: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 78 -

3.5.1 GPC-2000

オープン

使用するボードをオープンします。List 3-19 DioOpen関数定義[DllImport("fbidio.dll")]public static extern uint DioOpen( string lpszName, uint fdwFlags );

List 3-20 DioOpen関数呼び出しuint hDevice;

hDevice = IFCDIO.DioOpen(“FBIDIO1”,IFCDIO.FBIDIO_FLAG_SHARE);

1点入力

デジタル信号の入力を行うDioInputPoint関数は次のように、データ保存先にint型とint配列型を指定できるように2種類定義されています。アプリケーションは、データ数に応じて、int型または、int型配列でデジタル入力信号を取得することができます。

List 3-21 DioInputPoint関数定義[DllImport("fbidio.dll")]public static extern int DioInputPoint( uint hDevice, out int pBuffer, uint dwStartNum, uintdwNum );

[DllImport("fbidio.dll")]public static extern int DioInputPoint( uint hDevice, int[ ] pBuffer, uint dwStartNum, uint dwNum );

List 3-22 DioInputPoint関数呼び出し(1点のみ)int nRet;int nBuffer;

nRet = IFCDIO.DioInputPoint(hDevice,out nBuffer,1,1);

List 3-23 DioInputPoint関数呼び出し(複数接点)int nRet;int[ ] nBuffer = new int[64];

nRet = IFCDIO.DioInputPoint(hDevice,nBuffer,1,64);

クローズ

プログラムの最後でボードをクローズします。

List 3-24 DioClose関数定義[DllImport("fbidio.dll")]public static extern int DioClose( uint hDevice );

Page 80: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 79 - Interface Corporation

List 3-25 DioClose関数呼び出しint nRet;

nRet = IFCDIO.DioClose(hDevice);

3.5.2 GPC-3100構造体定義

ADSMPLREQ構造体はメソッドを持つ構造体として定義します。標準マーシャリングサービスでは、構造体中のメンバに構造体配列がある場合、

整数配列や、固定長文字列を引き渡す場合と同じように定義しても、呼び出し時

にマーシャリングに失敗します。

ADSMPLREQ構造体は、これに該当します。この問題を解決するために、構造体中の配列データへのアクセスには、SetChNo、GetChNo、SetRangeNo、GetRangeNoという専用のメソッドを利用します。

また、構造体の初期化時にInitializeArrayメソッドを使用してメンバ内の配列の初期化を行う必要がある点に注意してください。

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

List 3-26 ADSMPLREQ構造体定義[StructLayout(LayoutKind.Sequential)]public struct ADSMPLREQ{

public uint ulChCount;[MarshalAs(UnmanagedType.ByValArray, SizeConst=512)]public uint[ ] ulChNoRange;public uint ulSamplingMode;public uint ulSingleDiff;public uint ulSmplNum;public uint ulSmplEventNum;public float fSmplFreq;public uint ulTrigPoint;public uint ulTrigMode;public int lTrigDelay;public uint ulTrigCh;public float fTrigLevel1;public float fTrigLevel2;public uint ulEClkEdge;public uint ulATrgPulse;public uint ulTrigEdge;public uint ulTrigDI;public uint ulFastMode;

public void InitializeArray()

Page 81: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 80 -

{ulChNoRange = new uint [512];

}

public void SetChNo(uint ulIndex , uint ulNumber){

ulChNoRange[ulIndex * 2] = ulNumber;}

public uint GetChNo(uint ulIndex){

return(ulChNoRange[ulIndex * 2]);}

public void SetChRange(uint ulIndex, uint ulRange){

ulChNoRange[(ulIndex * 2) + 1] = ulRange;}

public uint GetChRange(uint ulIndex){

return(ulChNoRange[(ulIndex * 2) + 1]);}

}

ADSMPLREQ構造体を使用する前に、InitializeArrayメソッドを使用してメンバ内の配列の初期化を必ず行います。

List 3-27 ADSMPLREQ構造体の使用ADSMPLREQ gConfig;

gConfig.InitializeArray();

オープン

ボードをオープンします。List 3-28 AdOpen関数定義[DllImport("fbiad.dll")]public static extern uint AdOpen(string szName);

List 3-29 AdOpen関数呼び出しuint hDevice;

hDevice = IFCAD.AdOpen(“FBIAD1”);

1件アナログ入力

アナログ信号の入力を行うAdInputAD関数は次のように、データ保存先にByte型、ushort型、uint型、および、それぞれの配列型を指定できるように複数定義されています。アプリケーションは、使用するボードにより異なるデータサイズと、チ

ャンネル数に応じて、適切なデータ型を使用することができます。

Page 82: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 81 - Interface Corporation

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

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

List 3-30 AdInputAD関数定義[DllImport("fbiad.dll")]public static extern int AdInputAD(uint hDevice, uint ulCh, uint ulSingleDiff, refADSMPLCHREQ AdSmplChReq, out byte lpData);

[DllImport("fbiad.dll")]public static extern int AdInputAD(uint hDevice, uint ulCh, uint ulSingleDiff, refADSMPLCHREQ AdSmplChReq, out ushort lpData);

[DllImport("fbiad.dll")]public static extern int AdInputAD(uint hDevice, uint ulCh, uint ulSingleDiff, refADSMPLCHREQ AdSmplChReq, out uint lpData);

[DllImport("fbiad.dll")]public static extern int AdInputAD(uint hDevice, uint ulCh, uint ulSingleDiff, ADSMPLCHREQ[ ]AdSmplChReq, byte[ ] lpData);

[DllImport("fbiad.dll")]public static extern int AdInputAD(uint hDevice, uint ulCh, uint ulSingleDiff, ADSMPLCHREQ[ ]AdSmplChReq, ushort[ ] lpData);

[DllImport("fbiad.dll")]public static extern int AdInputAD(uint hDevice, uint ulCh, uint ulSingleDiff, ADSMPLCHREQ[ ]AdSmplChReq, uint[ ] lpData);

List 3-31 AdInputAD関数呼び出しuint[ ] ghChannel = new uint[2];IFCAD.ADSMPLCHREQ[ ] SmplChInf = new IFCAD.ADSMPLCHREQ[2];ushort[ ] wSmpData = new ushort[2];uint ulCh;int nErrCode = -1; ・ ・ ・

nErrCode = IFCAD.AdInputAD(hDevice, ulCh, gConfig.ulSingleDiff, SmplChInf, wSmpData);

クローズ

プログラムの最後にボードをクローズします。List 3-32AdClose関数定義[DllImport("fbiad.dll")]public static extern int AdClose(uint hDevice);

List 3-33 AdClose関数呼び出しuint nRet;

nRet = IFCAD.AdClose(hDevice);

Page 83: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 82 -

3.5.3 GPC-3300

構造体定義

DASMPLREQ構造体はメソッドを持つ構造体として定義します。標準マーシャリングサービスでは、構造体中のメンバに構造体配列がある場合、

整数配列や、固定長文字列を引き渡す場合と同じように定義しても、呼び出し時

にマーシャリングに失敗します。

DASMPLREQ構造体は、これに該当します。この問題を解決するために、構造体中の配列データへのアクセスには、SetChNo、GetChNo、SetRangeNo、GetRangeNoという専用のメソッドを利用します。

また、構造体の初期化時にInitializeArrayメソッドを使用してメンバ内の配列の初期化を行う必要がある点に注意してください。

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

List 3-34 DASMPLREQ構造体定義[StructLayout(LayoutKind.Sequential)]public struct DASMPLREQ{

public uint ulChCount;[MarshalAs(UnmanagedType.ByValArray, SizeConst=512)]public uint[ ] ulChNoRange;public uint ulSamplingMode;public float fSmplFreq;public uint ulSmplRepeat;public uint ulTrigMode;public uint ulTrigPoint;public uint ulTrigDelay;public uint ulEClkEdge;public uint ulTrigEdge;public uint ulTrigDI;

public void InitializeArray(){

ulChNoRange = new uint [512];}

public void SetChNo(uint ulIndex , uint ulNumber){

ulChNoRange[ulIndex * 2] = ulNumber;}

public uint GetChNo(uint ulIndex){

return(ulChNoRange[ulIndex * 2]);

Page 84: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 83 - Interface Corporation

}

public void SetChRange(uint ulIndex, uint ulRange){

ulChNoRange[(ulIndex * 2) + 1] = ulRange;}

public uint GetChRange(uint ulIndex){

return(ulChNoRange[(ulIndex * 2) + 1]);}

}

DASMPLREQ構造体を使用する前に、InitializeArrayメソッドを使用してメンバ内の配列の初期化を必ず行います。List 3-35 DASMPLREQ構造体の使用DASMPLREQ gConfig;

gConfig.InitializeArray();

オープン

ボードをオープンします。List 3-36 DaOpen関数定義[DllImport("fbida.dll")]public static extern uint DaOpen(string szDevice);

List 3-37 DaOpen関数呼び出しuint hDevice;

hDevice = IFCDA.DaOpen(“FBIDA1”);

1件アナログ出力

アナログ信号の出力を行うDaOutputDA関数は次のように、出力データ格納先にByte型,ushort型,uint型,およびそれぞれの配列型を指定できるように複数定義されています。

アプリケーションは、使用するボードにより異なるデータサイズと、チャンネル

数に応じて、適切なデータ型を使用することができます。

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

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

してください。

Page 85: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 84 -

List 3-38 DaOutputDA関数定義[DllImport("fbida.dll")]public static extern int DaOutputDA(uint hDevice, uint nCh, ref DASMPLCHREQDaSmplChReq, ref byte pData);

[DllImport("fbida.dll")]public static extern int DaOutputDA(uint hDevice, uint nCh, ref DASMPLCHREQDaSmplChReq, ref ushort pData);

[DllImport("fbida.dll")]public static extern int DaOutputDA(uint hDevice, uint nCh, ref DASMPLCHREQDaSmplChReq, ref uint pData);

[DllImport("fbida.dll")]public static extern int DaOutputDA(uint hDevice, uint nCh, DASMPLCHREQ[ ]DaSmplChReq, byte[ ] pData);

[DllImport("fbida.dll")]public static extern int DaOutputDA(uint hDevice, uint nCh, DASMPLCHREQ[ ]DaSmplChReq, ushort[ ] pData);

[DllImport("fbida.dll")]public static extern int DaOutputDA(uint hDevice, uint nCh, DASMPLCHREQ[ ]DaSmplChReq, uint[ ] pData);

List 3-39 DaOutputDA関数呼び出しuint[ ] ghChannel = new uint[2];IFCDA.DASMPLCHREQ[ ] SmplChInf = new IFCDA.DASMPLCHREQ[2];ushort[ ] wData = new ushort[2];uint ulCh;int nErrCode = -1;

nErrCode = IFCDA.DaOutputDA(hDevice, ulCh, SmplChInf, wData);

クローズ

プログラムの最後にボードをクローズします。

List 3-40 DaClose関数定義[DllImport("fbida.dll")]public static extern int DaClose(uint hDevice);

List 3-41 DaClose関数呼び出しint nRet;

nRet = IFCDA.DaClose(hDevice);

Page 86: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 85 - Interface Corporation

3.5.4 GPC-4301標準版DLL

オープン

ボードをオープンします。

List 3-42 GpibOpen関数定義[DllImport("gpc43042.dll")]public static extern int GpibOpen(uint ulBoardNo);

List 3-43 GpibOpen関数呼び出しint nRet;

nRet = IFCGPIB.GpibOpen(1);

データ送受信の準備

GpibSetConfig関数、GpibSetIfc関数、GpibSetRen関数を使用して、データを送受信する準備を行います。

List 3-44 GpibSetConfig関数,GpibSetIfc関数,GpibSetRen関数定義[DllImport("gpc43042.dll")]public static extern int GpibSetConfig(uint ulBoardNo, string pParam);

[DllImport("gpc43042.dll")]public static extern int GpibSetIfc(uint ulBoardNo);

[DllImport("gpc43042.dll")]public static extern int GpibSetRen(uint ulBoardNo);

List 3-45 GpibSetConfig関数,GpibSetIfc関数,GpibSetRen関数呼び出しint nRet;string szSetPrm;

// デリミタ設定szSetPrm = "/SRT=600 /TMO=600 /SDELIM=CRLF+EOI /RDELIM= CRLF+EOI“;nRet = IFCGPIB.GpibSetConfig(1, szSetPrm);if (nRet != 0){

return;}

// IFC送出nRet = IFCGPIB.GpibSetIfc(1);if (nRet != 0){

return;}

// REN設定nRet = IFCGPIB.GpibSetRen(1);if(nRet != 0){

Page 87: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 86 -

return;}

送信処理

データ送信を行うGpibSend関数は次のように、送信データ格納先にByte型,Byte配列型,String型,IntPtr型を指定できるように複数定義されています。アプリケーションは、送信するデータに応じて、適切なデータ型を使用すること

ができます。詳細情報は『関数のオーバーロード』をご参照ください。

List 3-46 GpibSend関数定義[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, ref bytepvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, byte[ ]pvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, stringpvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, IntPtrpvBuffer);

List 3-47 GpibSend関数呼び出し(String型)int nRet = 0;string szData = "*RST";uint uLen;int[ ] DevAdrsTbl = new int [2];

// 機器アドレステーブル設定DevAdrsTbl[0] = 22;DevAdrsTbl[1] = -1;

// データ送信uLen = (uint)szData.Length;nRet = IFCGPIB.GpibSend(1, DevAdrsTbl,uLen, szData);

受信処理

データ受信を行うGpibReceive関数は次のように、受信データ保存先にByte型,Byte配列型,String型,IntPtr型を指定できるように複数定義されています。アプリケーションは、受信するデータに応じて、適切なデータ型を使用すること

ができます。詳細情報は『関数のオーバーロード』をご参照ください。

また、String型を指定するGpibReceive関数は、Byte型配列でデータを受信し、String型へ変換するファンクションとして定義されています。

Page 88: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 87 - Interface Corporation

詳細は、『固定長文字列』と、『文字エンコード』をご参照ください。List 3-48 GpibReceive関数定義[DllImport("gpc43042.dll")]public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, refbyte pvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, byte[ ]pvBuffer);

public static int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, ref stringpvBuffer){

uint nLength = dwpLength;int nRet;ASCIIEncoding e = new ASCIIEncoding();byte[ ] szData= new byte [dwpLength];

pvBuffer = "";

nRet = GpibReceive(ulBoardNo, lpAdrsTbl, ref nLength, szData);if(nRet == 0){

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

}return nRet;

}

[DllImport("gpc43042.dll")]public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uint dwpLength, IntPtrpvBuffer);

List 3-49 GpibReceive関数呼び出し(String型)int nRet = 0;string RecvBuffer = "";int[ ] DevAdrsTbl = new int [2];uint RecvLen;

// 機器アドレステーブル設定DevAdrsTbl[0] = 22;DevAdrsTbl[1] = -1;

// データ受信RecvLen = 64;nRet = IFCGPIB.GpibReceive(1, DevAdrsTbl, ref RecvLen, out RecvBuffer);

if(nRet != 0){

return;}

Page 89: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 88 -

クローズ

プログラムの最後にボードをクローズします。

List 3-50 GpibClose関数定義[DllImport("gpc43042.dll")]public static extern int GpibClose(uint ulBoardNo);

List 3-51 GpibClose関数呼び出しint nRet;

nRet = IFCGPIB.GpibClose(1);

3.5.5 GPC-4301高機能版DLL

オープン

ボードをオープンします。List 3-52 PciGpibExInitBoard関数定義[DllImport("gpc4304.dll")]public static extern int PciGpibExInitBoard(int nBoardNo, uint hWnd);

List 3-53 PciGpibExInitBoard関数呼び出しint nRet;

nRet = IFCGPIBEX.PciGpibExInitBoard(1, 0);

データ送受信の準備

PciGpibExSetConfig関数、PciGpibExSetIfc関数、PciGpibExSetRen関数を使用して、データを送受信する準備を行います。

List 3-54 PciGpibExSetConfig関数,PciGpibExSetIfc関数,PciGpibExSetRen関数定義[DllImport("gpc4304.dll")]public static extern int PciGpibExSetConfig(int nBoardNo, string szPrm);

[DllImport("gpc4304.dll")]public static extern int PciGpibExSetIfc(int nBoardNo, int nTime);

[DllImport("gpc4304.dll")]public static extern int PciGpibExSetRen(int nBoardNo);

Page 90: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 89 - Interface Corporation

List 3-55 PciGpibExSetConfig関数,PciGpibExSetIfc関数,PciGpibExSetRen関数呼び出し

int nRet;string szSetPrm;

// デリミタ設定szSetPrm = "/STM=600 /SRT=600 /TMO=600 /SDELIM=CRLF+EOI /RDELIM=CRLF+EOI”;

nRet = IFCGPIBEX.PciGpibExSetConfig(1, szSetPrm);if( nRet != 0){

return;}

// IFC送出nRet = IFCGPIBEX.PciGpibExSetIfc(1, 1);if( nRet != 0){

return;}

// REN設定nRet = IFCGPIBEX.PciGpibExSetRen(1);if( nRet != 0){

return;}

送信

データ送信を行うPciGpibExMastSendData関数は次のように、送信データ格納先にByte型,Byte配列型,String型,IntPtr型を指定できるように複数定義されています。アプリケーションは、送信するデータに応じて、適切なデータ型を使用すること

ができます。詳細情報は『関数のオーバーロード』をご参照ください。

List 3-56 PciGpibExMastSendData関数定義

[DllImport("gpc4304.dll")]public static extern int PciGpibExMastSendData(int nBoardNo, int[ ] npAdrsTbl, uint dwLength, refbyte pvBuffer, uint uMsg);

[DllImport("gpc4304.dll")]public static extern int PciGpibExMastSendData(int nBoardNo, int[ ] npAdrsTbl, uint dwLength,byte[ ] pvBuffer, uint uMsg);

[DllImport("gpc4304.dll")]public static extern int PciGpibExMastSendData(int nBoardNo, int[ ] npAdrsTbl, uint dwLength,string pvBuffer, uint uMsg);

[DllImport("gpc4304.dll")]public static extern int PciGpibExMastSendData(int nBoardNo, int[ ] npAdrsTbl, uint dwLength,IntPtr pvBuffer, uint uMsg);

Page 91: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 90 -

List 3-57 PciGpibExMastSendData関数呼び出し(String型)int nRet = 0;string szData = “*RST”;uint uLen;int[ ] DevAdrsTbl = new int [2];

// Configures the device address table.DevAdrsTbl[0] = 22;DevAdrsTbl[1] = -1;

// Sends data to specified device.uLen = (uint)szData.Length;nRet = IFCGPIBEX.PciGpibExMastSendData(1, DevAdrsTbl, uLen, szData, 0);

受信

データ受信を行うPciGpibExMastRecvData関数は次のように、受信データ保存先にByte型,Byte配列型,String型,IntPtr型を指定できるように複数定義されています。アプリケーションは、受信するデータに応じて、適切なデータ型を使用すること

ができます。

詳細情報は『関数のオーバーロード』をご参照ください。

また、String型を指定するGpibReceive関数は、Byte型配列でデータを受信し、String型へ変換するファンクションとして定義されています。

詳細は、『固定長文字列』と、『文字エンコード』をご参照ください。

List 3-58 PciGpibExMastRecvData関数定義[DllImport("gpc4304.dll")]public static extern int PciGpibExMastRecvData(int nBoardNo, int[ ] npAdrsTbl, ref uint dwpLength,ref byte pvBuffer, uint uMsg);

[DllImport("gpc4304.dll")]public static extern int PciGpibExMastRecvData(int nBoardNo, int[ ] npAdrsTbl, ref uint dwpLength,byte[ ] pvBuffer, uint uMsg);

public static int PciGpibExMastRecvData(int nBoardNo, int[ ] npAdrsTbl, ref uint dwpLength, outstring pvBuffer, uint uMsg){

uint nLength = dwpLength;int nRet;ASCIIEncoding e = new ASCIIEncoding();byte[ ] szData= new byte [dwpLength];

pvBuffer = "";

nRet = PciGpibExMastRecvData(nBoardNo, npAdrsTbl, ref nLength, szData, uMsg);

Page 92: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 91 - Interface Corporation

if(nRet == 0){

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

}return nRet;

}

[DllImport("gpc4304.dll")]public static extern int PciGpibExMastRecvData(int nBoardNo, int[ ] npAdrsTbl, ref uint dwpLength,IntPtr pvBuffer, uint uMsg);

List 3-59 PciGpibExMastRecvData関数呼び出し(String型)int nRet = 0;string RecvBuffer = "";uint RecvLen;int[ ] DevAdrsTbl = new int[2];

// 機器アドレステーブル設定DevAdrsTbl[0] = 22;DevAdrsTbl[1] = -1;

// データ受信RecvLen = 64;nRet = IFCGPIBEX.PciGpibExMastRecvData(1, DevAdrsTbl, ref RecvLen, out RecvBuffer, 0);CtrlCsForm.DsplyErrMessage(nRet);if(nRet != 0){

return;}

クローズ

プログラムの最後にボードをクローズします。

List 3-60 PciGpibExFinishBoard関数定義[DllImport("gpc4304.dll")]public static extern int PciGpibExFinishBoard(int nBoardNo);

List 3-61 PciGpibExFinishBoard関数呼び出しint nRet;

nRet = IFCGPIBEX.PciGpibExFinishBoard(nBoardNo);

Page 93: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 92 -

3.6 サンプルプログラム一覧

BPC-0818に含まれるC#用のサンプルプログラムは次の通りです。サンプルプログラムの完全なソースは、下記のサンプルプログラムのソースファ

イルをご参照ください。

表 3-5 サンプルプログラム一覧型式名 サンプルプログラム名 内容

Inpoint 1点入力GPC-2000Outpoint 1点出力

GPC-3100 AdSmpl_Cs アナログ入力GPC-3300 DaSmpl_Cs アナログ出力GPC-4301標準版DLL用

Ctrl_Cs2 任意の機器との送受信

Ctrl_Cs 任意の機器との送受信Device_Cs YOKOGAWA7561, HP3458A制御サ

ンプルManualop すべての関数を手動で実行

GPC-4301高機能版DLL用

MultiDevice 複数機器制御

各サンプルプログラムのプロジェクトは、次の手順で開きます。

Visual Studio .NETを起動し、「ファイル」-「開く」-「プロジェクト」を選択します。

各サンプルプログラムのインストール先フォルダにある、C#プロジェクトファイル(.csproj)を、指定して「開く」ボタンをクリックします。

Page 94: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 93 - Interface Corporation

第4章 .NET技術情報

4.1 DLL呼び出しの概要

DLLが提供する関数を、Visual Studio .NET上から呼び出す方法を理解いただくために、Visual Studio .NETで作成されたアプリケーションがDLLを呼び出す方法を説明します。

4.1.1 マネージコードとアンマネージコード

Microsoft .NET Frameworkには共通言語ランタイムと呼ばれる重要なコンポーネントがあります。

共通言語ランタイムは、実行時のコード管理を行い、メモリ管理、スレッド管理、

リモート処理などのサービスを提供します。

共通言語ランタイムの制御下で実行されるコードをマネージ コードと呼びます。それに対し、共通言語ランタイムの外部で実行されるコードをアンマネージ コードと呼びます。

Visual Basic .NETやVisual C# .NETで作成され、.NET Framework上で動作するアプリケーションは、共通言語ランタイムの制御下で実行されるマネージコードです。

アンマネージ コードの例としては、COM コンポーネント、ActiveX インタフェース、Win32 API 関数を含む既存のDLLが提供する関数があります。

マネージコード アンマネージコード

DLL

共通言語ランタイム

オペレーティングシステム

ActiveX

アンマネージ

アプリケーション

マネージアプリケーション

Visual Basic .NET

アプリケーション

.NET Framework

クラスライブラリ

Visual C# .NET

アプリケーション

Visual Basic 6.0

アプリケーション

図 4-1 マネージコードとアンマネージコード

Page 95: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 94 -

4.1.2 プラットフォーム呼び出し

DLLの関数をVisual Basic .NETやVisual C# .NETで作成するアプリケーションから呼び出すということは、マネージコードからアンマネージコードを呼び出すとい

う動作になります。

マネージコードからWin32APIの関数のような、DLLに実装されたアンマネージ関数を呼び出すことができるようにするサービスを「プラットフォーム呼び出し」

と呼びます。

プラットフォーム呼び出しは、DLLが提供する関数を探し出して呼び出します。その際、必要に応じて、その引数をマーシャリングすることにより、マネージコ

ードとアンマネージコードのプラットフォームの違いを越える関数呼び出しを実

現します。

引数パラメータとして指定される文字列、配列、構造体など標準的なマーシャリ

ング処理を行う「標準マーシャリングサービス」が用意されています。

共通言語ランタイム

マネージコード

アンマネージコード

DLLマネージ

アプリケーション

DLL関数

標準マーシャリング

サービス

プラットフォーム

呼び出し

図 4-2 プラットフォーム呼び出し

Page 96: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 95 - Interface Corporation

4.2 DLL関数呼び出し方法

DLLが提供する関数を呼び出すには 次の情報と処理コードの実装が必要です。・[Step1] DLLおよびそのDLLが提供する関数を識別するための情報・[Step2] DLL関数を保持するクラスの作成・[Step3] マネージコードでのプロトタイプ宣言の記述

以上のステップを踏むことでDLL関数の呼び出しが行えます。DLL 関数の呼び出しは、ほかのマネージ メソッドの場合と同じ方法で、マネージ クラスのメソッドを呼び出します。本章の最後にDLL関数呼び出しの一連のコード例を示します。・[Step4]DLL関数呼び出し

4.2.1 DLLおよびそのDLLが提供する関数を識別するための情報

DLLの関数を呼び出すためには、関数の名前と、その関数を格納している DLL の名前を指定する必要があります。

弊社PCI/CompactPCI/CardBus対応Windows用ソフトウェアライブラリGPCシリーズのDLL名と関数名は、各製品添付のオンラインヘルプにある、関数リファレンス中のVisual Basic用関数定義か、製品に含まれる既存のVisual Basic用関数定義ファイルを参照すれば関数名と、関数をエクスポートしているDLLの名前がわかります。

List 4-1 Visual Basic 6.0用の関数宣言例 デジタル入出力ライブラリGPC-2000

Declare Function DioInputPoint Lib "FbiDio.DLL" (ByVal hDeviceHandle As Long, _

ByRef pBuffer As Long, ByVal dwStartNum As Long, ByVal dwNum As Long) As Long

ただし、関数定義に使用されている各引数パラメータの型はVisual Basic .NETでは、そのまま使用できません。

また、DLL関数が構造体を使用する場合、構造体の定義も各ソフトウェアライブラリのオンラインヘルプに記載があります。

識別子の定義は、製品に含まれる既存のVisual Basic用関数定義ファイルを参照してください。

DLL名1) 関数名

Page 97: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 96 -

4.2.2 DLL 関数を保持するクラスを作成します。

C# や Visual Basic を使ってプログラミングしている場合は、DLL 関数をクラスまたは Visual Basic モジュール内で宣言する必要があります。

DLL関数を呼び出すための専用のクラス作成は必須ではありませんが、DLL 関数の定義には手間がかかり、エラーの原因にもなりやすいため、クラス を作成しておくと便利です。

クラス内では、呼び出す各 DLL 関数に対して静的メソッドを定義します。List 4-2 Visual Basic .NETでのクラス例

Imports System.Runtime.InteropServices

Public Class IFCDio

Declare Function DioOpen Lib "FbiDio.DLL" (ByVal lpszName As String,_

ByVal fdwAttrs As Integer) As Integer

End Class

クラスを作成し、DLL関数定義を静的メソッドとして定義すると、ほかの静的関数のメソッドを呼び出す場合と同じ方法で、関数を呼び出すことができます。

プラットフォーム呼び出しのためにマネージ クラスを作成するメリットしては次の事項が挙げられます。

・DLL 関数ごとに別個のクラスを作成することで検索しやすくなる。・論理的なグループを形成し、オーバーヘッドを減らすことができる。

(一連の関連する DLL 関数に対して 1 つのクラスを作成する。 )・クラスおよびそのメソッドには、任意の名前を付けることができる。

4.2.3 マネージコードでのプロトタイプ宣言の記述

DLLなどのアンマネージ ライブラリが提供する関数を呼び出すために、.NETFramework アプリケーションはそのアンマネージ関数を表す、マネージ コード内の関数プロトタイプを必要とします。

引数パラメータや戻り値の型にご注意ください。対応するマネージ データ型を使用する必要があります。

Visual Basic .NETとVisual Basic 6.0は、整数のデータ型が異なるため、プロトタイプ宣言の記述では、引数パラメータと戻り値の型の記述にご注意ください。

Page 98: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 97 - Interface Corporation

整数データは次の表のように変わりました。表 4-1 整数データ対応表

Visual Basic 6.0 Visual Basic .NET C# C++ マネージ拡張16 ビット Integer Short short short32 ビット Long Integer int int64 ビット (none) Long Long _int64

また、プラットフォーム呼び出しでは、データを正確にマーシャリングできるよ

うにするプロトタイプを作成する必要があります。

構造体や配列を引数パラメータに指定する場合、明示的にデータをマーシャリン

グする必要がある場合があります。これについては、後述します。

[Visual Basic] Declare ステートメントを Function キーワードと Lib キーワードと共に使用します。

デジタル入出力ライブラリGPC-2000のオープン、クローズ、接点単位の入力を行う関数のプロトタイプ宣言例を示します。

GPC-2000の関数は、FbiDio.DLLファイルが提供します。

List 4-3 プロトタイプ宣言例 Visual Basic .NETImports System.Runtime.InteropServices

Declare Function DioOpen Lib "FbiDio.DLL" (ByVal lpszName As String,_

ByVal fdwAttrs As Integer) As Integer

Declare Function DioClose Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer)_

As Integer

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

ByRef pBuffer As Integer, ByVal dwStartNum As Integer,_

ByVal dwNum As Integer) As Integer

DllImportAttribute を Shared Function キーワードと共に使用できる場合もあります。Visual Basic .NET上でDllImportAttributeを使用する方法の詳細は、Microsoft社のドキュメントをご参照ください。本書では扱いません。

Page 99: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 98 -

[C#]DllImportAttribute を使って、DLL と関数を識別します。メソッドに static 修飾子と extern 修飾子を使ってマークを付けます。

List 4-4 プロトタイプ宣言例 Visual C# .NET

using System.Runtime.InteropServices;

[DllImport("fbidio.dll")]

public static extern int DioOpen( string lpszName, uint fdwFlags );

[C++]DllImportAttribute を使って、DLL と関数を識別します。ラッパー メソッドまたはラッパー関数には extern "C" でマークを付けます。

List 4-5 プロトタイプ宣言例 Visual C++ .NET

using namespace System::Runtime::InteropServices;

[DllImport("fbidio.dll")]

extern "C" HANDLE DioOpen( LPCTSTR lpszName, DWORD fdwFlags );

Visual C++ .NETでアンマネージアプリケーションを作成する場合は、DllImportAttributeを指定するプラットフォーム呼び出しではなく、Visual C++ 6.0アプリケーションの作成と同じように、ヘッダファイルのインクルード指定と、

インポートライブラリのリンク指定を行うことでDLL関数を呼び出すアプリケーションを作成することができます。

Page 100: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 99 - Interface Corporation

4.2.4 DLL関数の呼び出し

DLL関数を呼び出す一連のコード例を次に示します。[Visual Basic]

List 4-6 DLL関数の呼び出し例

Imports System.Runtime.InteropServices

Public Const FBIDIO_FLAG_SHARE As Integer = &H2

Imports System.Runtime.InteropServices

Public Class IFCDio

Declare Function DioOpen Lib "FbiDio.DLL" (ByVal lpszName As String,_

ByVal fdwAttrs As Integer) As Integer

Declare Function DioClose Lib "FbiDio.DLL" (ByVal hDeviceHandle As Integer)_

As Integer

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

ByRef pBuffer As Integer, ByVal dwStartNum As Integer,_

ByVal dwNum As Integer) As Integer

End Class

Public Class DigitalInput

Public Shared Sub Main()

Dim nRet As Integer

Dim hDeviceHandle As Integer

Dim lpszName As String

hDeviceHandle = IFCDio.DioOpen(lpszName, FBIDIO_FLAG_SHARE)

If hDeviceHandle = -1 Then

nRet = MessageBox.Show ("Failed to open the device.", _

"DioOpen",MessageBoxButtons.OK,MessageBoxIcon.Error)

EndIf

・ End Sub

End Class

Page 101: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 100 -

4.3 その他の注意事項と追加情報

本章では、弊社ソフトウェアライブラリをVisual Basic .NETで使用するにあたり、移行時に問題となると予想される事項についての注意事項と追加情報を示します。

4.3.1 Declare ステートメントは As Any 型のパラメータをサポートしない

Visual Basic 6.0 では、Declare ステートメントで外部プロシージャへの参照を宣言し、引数または戻り値のデータ型として As Any を指定できました。As Any キーワードは型チェックを無効にするため、どのようなデータ型でも渡したり返した

りできました。

Visual Basic .NET では、As Any キーワードはサポートされていません。タイプ セーフを保証するために、すべての引数および戻り値のデータ型を明確に宣言する

必要があります。

弊社ソフトウェアライブラリの製品に含まれるVisual Basic 6.0用の関数定義の記述にも、As Any型の記述がされているものがあります。

宣言されている関数がコード内で使用されている場所、および渡されるデータ型

を調べます。使用されているすべての箇所で同じデータ型が渡される場合は、AsAny の代わりにそのデータ型を含むように宣言を変更します。

複数のデータ型をサポートする必要がある場合は、各データ型に対してオーバー

ロードされたバージョンの宣言を作成します。

Visual Basic .NETでは、プロシージャ宣言をオーバーロードして、さまざまな引数のデータ型を適用できます。詳しくは、MSDNライブラリをご参照ください。

4.3.2 明示的なマーシャリングが必要となる場合

プラットフォーム呼び出しでは、データを正確にマーシャリングできるようにす

るプロトタイプを作成する必要があります。

構造体や配列を引数パラメータに指定する場合、明示的にデータをマーシャリン

グする必要がある場合があります。

次のような場合におけるプロトタイプ宣言方法とサンプルプログラムが、MSDNライブラリに記載されていますので、詳細はご確認ください。

Page 102: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 101 - Interface Corporation

・文字列

文字列を値または参照渡しする場合、および構造体、クラス、または配列に組

み込んで渡す場合。

・クラス、構造体、および共用体のマーシャリング

クラスを値渡しする方法、各種構造体の渡し方、および値と混合型を含む共用

体を渡す場合。 構造体中で固定長配列を宣言する場合。

・型の配列のマーシャリング

整数から構成される多次元配列を値渡しする場合、および 1 次元配列を参照渡しする場合。

4.3.3 構造体を使用する場合の注意点

弊社ソフトウェアライブラリの中には、構造体を引数パラメータとして要求する

関数が多くありますので、構造体を使用するDLL関数の呼び出し方法についての注意点をもう少し詳しく説明します。

プラットフォーム呼び出しを使って構造体のメンバを渡す場合は、型を元のレイ

アウトや配置を維持したままフォーマットするための追加情報を提供する必要が

あります。

フォーマットされた型を定義するために使用する StructLayoutAttribute クラスについて説明します。マネージ コードでは、フォーマットされる型は構造体またはクラスのメンバで、メンバに対して予測可能なレイアウト情報を提供するために

StructLayoutAttribute によって注釈が付けられます。

フォーマットされる型のメンバ レイアウトは、Automatic、Sequential、またはExplicit として定義できます。各レイアウトオプションの説明を次の表に示します。

表 4-2 レイアウトオプション説明レイアウト オプション 説明

LayoutKind.Automatic ランタイムが型のメンバを再順序付けできるようするオプションです。プラットフォーム呼び出しでは使用しません。

LayoutKind.Explicit 各フィールドに適用された FieldOffset 属性に従って型のメンバを順序付けします。

LayoutKind.Sequential 型のメンバをマネージ型定義での順序に従ってアンマネージ メモリに順序付けします。

これらの属性に関するリファレンス情報については、MSDNライブラリの「StructLayoutAttribute クラス」および「FieldOffsetAttribute クラス」を参照してください。

Page 103: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 102 -

それでは、StructLayoutAttributeクラスを使用した構造体メンバの受け渡し例を示します。

マネージ コードで MYSTRUC型を定義し、これらの型を MyLib.dll ファイル内の MyFunc関数に引数として渡す方法の例を次に示します。

typedef struct _myStruc { int a; int b;}MYSTRUC;

BOOL MyFunc(MYSTRUC *lpMystc);

この関数は MYSTRUC型へのポインタを期待しているため、構造体は参照渡しする必要があることに注意してください。

[Visual Basic]List 4-7 構造体受け渡し例 Visual Basic .NET

Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential)> Public Structure MyStruc

Public a As Integer

Public b As Integer

End Structure

Class MyAPI

Declare Auto Function MyFunc Lib " MyLib.dll" _

(ByRef lpMystc As MYSTRUC) As Boolean

End Class

MyStrucにLayoutKind.Explicitを使用する場合は次のように宣言します。List 4-8 構造体受け渡し例Explicitオプション Visual Basic .NET

<StructLayout(LayoutKind.Explicit)> Public Structure MyStruc

<FieldOffset(0)> Public a As Integer

<FieldOffset(4)> Public b As Integer

End Structure

Page 104: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 103 - Interface Corporation

[C#]List 4-9 構造体受け渡し例 Visual C# .NET

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]

public struct MYSTRUC {

public int a;

public int b;

}

class MyAPI {

[DllImport("MyLib.dll")]

public static extern Bool PtInRect(ref MYSTRUC lpMystc);

}

MyStrucにLayoutKind.Explicitを使用する場合は次のように宣言します。List 4-10 構造体受け渡し例 Explicit オプションVisual C# .NET

[StructLayout(LayoutKind. Explicit)]

public struct MYSTRUC {

[FieldOffset(0)] public int a;

[FieldOffset(4)] public int b;

}

Page 105: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 104 -

4.3.4 構造体の中の構造体配列 (GPC-3100の例)

弊社ソフトウェアライブラリの中には、プラットフォーム呼び出しのために用意

されている標準的なマーシャリングサービスを適用できない場合があります。

アナログ入力ソフトウェアライブラリGPC-3100のADSMPLREQ構造体を引数パラメータとして要求する関数もそのひとつです。

ADSMPLREQ構造体は、ADSMPLCHREQ構造体配列256要素をメンバとして含んでいます。

標準マーシャリングサービスでは、構造体中のメンバに構造体配列がある場合、

整数配列や、固定長文字列を引き渡す場合と同じように定義しても、呼び出し時

にマーシャリングが失敗します。

この問題を回避するためには、次の2つの方法があります。

・回避方法1 構造体を平坦化する・回避方法2 構造体にデータの設定と取得を行うメソッドを定義する。

ただし、どちらの方法もコード中のメンバ設定の記述に変更が必要です。

回避方法1 構造体を平坦化する。

構造体のメンバに構造体が存在するようなケースと同様に、構造体メンバを展開

し、平坦化した定義に変更します。

ただし、GPC-3100のADSMPLREQ構造体は、ADSMPLCHREQ構造体配列256要素とるため単純な平坦化は現実的ではありませんので、必要なチャンネル数分のみ

平坦化した例を示します。使用しない領域は、ダミー領域として確保します。

例では、2チャンネル分のみ使用可能にしています。

ADSMPLCHREQ構造体は、ふたつの32bit値をメンバに持つ構造体です。List 4-11 ADSMPLCHREQ構造体

<StructLayout(LayoutKind.Sequential)> Structure ADSMPLCHREQ

Dim ulChNo As Integer

Dim ulRange As Integer

End Structure

Page 106: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 105 - Interface Corporation

ADSMPLCHREQ構造体メンバを2要素分平坦化した場合の、ADSMPLREQの定義例です。

List 4-12 ADSMPLREQ構造体 平坦化例

<StructLayout(LayoutKind.Sequential)> Structure ADSMPLREQ Dim ulChCount As Integer Dim ulChNo1 As Integer Dim ulRange1 As Integer Dim ulChNo2 As Integer Dim ulRange2 As Integer <MarshalAs(UnmanagedType.ByValArray, SizeConst:=508)> _ Dim dummy() 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

End Structure

平坦化によりメンバ名が変更されますので、プログラム中の構造体メンバの参照

は、次のように変更します。List 4-13 平坦化ADSMPLREQ構造体メンバ参照例

gConfig.ulChNo1 = 1 gConfig.ulRange1 = AD_1V gConfig.ulChNo2 = 2 gConfig.ulRange2 = AD_1V ・ ・ ・ nRet = AdSetSamplingConfig(ghDeviceHandle, gConfig)

Page 107: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 106 -

回避方法2 構造体にデータの設定と取得を行うメソッドを定義する。

より汎用性を持たせるため、構造体にデータの設定と、取得を行うメソッドを定

義した場合の例を示します。

Visual Basic .NETの構造体は、クラスと同じようにメソッドを持つことができますので、これを利用します。ADSMPLREQの定義例を示します。

List 4-14 メソッド追加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) As Integer GetChNo = ulChNoRange(ulIndex * 2) End Function

Public Sub SetRange(ByVal ulIndex As Integer, ByVal ulRange As Integer)

Page 108: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 107 - Interface Corporation

ulChNoRange((ulIndex * 2) + 1) = ulRange End Sub

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

End Structure

プログラム中の構造体メンバの参照は、メソッドを使用します。次のように変更

が必要です。List 4-15メソッド追加ADSMPLREQ構造体メンバ参照例

gConfig.SetChNo(0, 1) gConfig.SetChNo(1, 2) gConfig.SetRange(0, AD_1V) gConfig.SetRange(1, AD_1V) ・ ・ ・ nRet = AdSetSamplingConfig(ghDeviceHandle, gConfig)

4.3.5 固定長文字列

Visual Basic .NETは固定長文字列をサポートしません。

プラットフォーム呼び出しにて、アンマネージDLLの関数が、固定長文字列への参照を要求するような場合は、StringBuilder型を使用します。アンマネージDLLの関数がNULL終端付きの文字列を返す場合、StringBuilder型を、そのままパラメータの型として使用することができます。

StringBuilder型の詳細は、Microsoft社が提供するドキュメントをご確認ください。

弊社GPIBボード用ソフトウェアライブラリGPC-4301の受信関数(GpibReceive関数、PciGpibExMastRecvData関数、PciGpibExSlavRecvData関数)で、文字データを受信する場合は、注意が必要です。受信データにNULL終端文字が付加されません。そのため、StringBuilder型を使用できません。このような場合は、Byte配列でデータを取得し、文字列へ変換します。また、その際に文字コードの変換が必要となります。

『文字エンコード』の説明に具体例を記載していますのでご参照ください。

Page 109: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 108 -

4.3.6 文字エンコード

.NET Frameworkプログラムの文字列はすべてUnicodeとして格納されます。Unicodeは、1文字を2バイト(16ビット)で表します。

.NET Framework には「エンコード(Unicode 文字から別のエンコーディングによるバイト集合への変換)」および「デコード(何らかのエンコードによるバイト

集合から Unicode 文字への変換)」を実行するためのいくつかのクラスが用意されています。

サポートされている各種のエンコーディングごとにクラスがあります。

ASCIIEncoding、CodePageEncoding、UnicodeEncoding、UTF7Encoding、およびUTF8Encoding といったクラスが用意されています。

アンマネージDLLからByte配列の文字列を取得した場合、ASCIIコードからUnicodeへの変換は行われません。Visual Basic .NETや、Visual C# .NET上で文字列として扱う場合は、ASCIIEncodingクラスを使用してASCIIコードからUnicodeへデコードします。

GPC-4301 標準版DLL のGpibReceive関数の例を示します。

GpibReceive関数は、GPIB機器からのデータを受信する関数です。次のプログラムは、Byte配列で取得した文字データ(ASCIIコード)を.NETFramework上のアプリケーション上で文字列(Unicode)として扱うために、ASCIIEncodingクラスを用いてデコードする例です。

Page 110: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 109 - Interface Corporation

[Visual Basic]List 4-16 GpibReceive関数の定義(受信データをByte配列で取得)Declare Function GpibReceive Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVallpAdrsTbl() As Integer, ByRef ulpLength As Integer, ByVal vpBuffer() As Byte) As Integer

バイト配列で受信したASCII文字データをUnicodeにデコードしてString型に格納します。

List 4-17 エンコード例(Visual Basic)Dim nLength As IntegerDim nRet As IntegerDim szBuffer As StringDim e As ASCIIEncoding = New ASCIIEncoding()Dim bData(63) As Byteint[ ] DevAdrsTbl = new int [2];

szBuffer = ""

DevAdrsTbl(0) = 22DevAdrsTbl(1) = -1

nLength = 64nRet = GpibReceive(1, DevAdrsTbl, nLength, bData)If (nRet = 0) Then szBuffer = e.GetString(bData, 0, nLength)End If

[C#]List 4-18 GpibReceive関数の定義(受信データをByte配列で取得)[DllImport("gpc43042.dll")]public static extern int GpibReceive(uint ulBoardNo, int[ ] lpAdrsTbl, ref uintdwpLength, byte[ ] pvBuffer);バイト配列で受信したASCII文字データをUnicodeにデコードしてString型に格納します。

List 4-19 エンコード例(C#)uint uLength = 64;int nRet;string szBuffer = “”;ASCIIEncoding e = new ASCIIEncoding();byte[ ] bData= new byte [64];int[ ] DevAdrsTbl = new int [2];

DevAdrsTbl[0] = 22;DevAdrsTbl[1] = -1;

nRet = GpibReceive(1, DevAdrsTbl, ref uLength, bData);if(nRet == 0){

szBuffer = e.GetString(bData,0,(int)uLength);}

Page 111: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 110 -

4.3.7 デリゲート オブジェクトを使用したコールバック処理

アンマネージDLL関数には、アプリケーション内に定義した関数をコールバックする機能を提供するものがあります。

コールバックとは、特定の条件が成立した場合などにアンマネージ DLLから、アプリケーションの登録された関数が呼び出される動作をさします。

コールバック関数の呼び出しは、マネージ アプリケーションから DLL 関数を通じて間接的に渡されたアドレスに対して行われます。

Visual Basic .NETおよび、C# .NETで作成されたマネージアプリケーションが、コールバック関数を要求するDLL関数を使用する方法を説明します。.NET Framework上のアプリケーションは、デリゲートオブジェクトを使用して、アンマネージDLLが提供するコールバック機能を実現します。

次のステップで、コールバック処理を実装します。・Step1:DLL関数、コールバック関数の定義関数のドキュメントを参照して、その関数がコールバックを必要とするかどうかを判断します。そして、DLL関数の定義および、コールバック関数のデリゲート宣言を行います。・Step2:コールバック関数の作成マネージ アプリケーション内にコールバック関数を作成します。・Step3:DLL関数呼び出し引数として、コールバック関数のポインタ(デリゲートオブジェクト)を渡し、DLL関数を呼び出します。

デリゲートオブジェクトが解放されるまで、アンマネージDLLは。繰り返しコールバック関数を呼び出すことができます。

もし、デリゲートオブジェクトが解放された後に、アンマネージDLLがコールバック関数を呼び出した場合、予期しない動作異常が発生します。

関数がコールバックされる可能性がある期間内に、デリゲートオブジェクトがガ

ーベジコレクタによって解放される事がないように、処理の記述にはご注意くだ

さい。

(例えば、ローカル変数としてデリゲートオブジェクトを生成した場合、その関

数を抜けた後にコールバック関数の呼び出しが行われた場合、問題が発生しま

す。)

Page 112: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 111 - Interface Corporation

[Visual Basic]

GPC-4301 標準版DLLのGpibSetSrqEvent関数の使用例を示します。

・Step1:DLL関数、コールバック関数の定義C言語でのGpibSetSrqEvent関数宣言とコールバック関数の型宣言は次の通りです。List 4-20 コールバック関数型宣言#define LPSRQCALLBACK VOID WINAPItypedef void (WINAPI *PLPSRQCALLBACK)(int nBoardNo, DWORD dwUser);

List 4-21 GpibSetSrqEvent関数宣言int GpibSetSrqEvent(ULONG ulBoardNo, PLPSRQCALLBACK lpOnSrqProc, DWORDdwUser);

Visual Basic .NETで、次のように宣言します。PLPSRQCALLBACKというデリゲートを宣言します。List 4-22 コールバック用デリゲート宣言Delegate Sub PLPSRQCALLBACK(ByVal nBoardNo As Integer, ByVal dwUser As Integer)

List 4-23 GpibSetSrqEvent関数宣言Declare Function GpibSetSrqEvent Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVallpOnSrqProc As PLPSRQCALLBACK, ByVal dwUser As Integer) As Integer

・Step2:コールバック関数の作成

lpSrqProcというコールバック関数を宣言します。引数パラメータの数、型を、デリゲートPLPSRQCALLBACKと合わせます。また、下記の例では、デリゲートPLPSRQCALLBACKのオブジェクト保存先をモジュール内に定義しています。List 4-24 コールバック関数Module Module1 ・ ・ Public osp As PLPSRQCALLBACK ・ ・ ・ Sub lpOnSrqProc(ByVal dwBoardNo As Integer, ByVal dwUser As Integer) ・ ・ ・ End SubEnd Module

Page 113: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 112 -

・Step3:DLL関数呼び出し関数lpOnSrqProcをコールバック関数として、PLPSRQCALLBACKデリゲートオブジェクトを生成します。デリゲートオブジェクトを、GpibSetSrqEvent関数の第2パラメータに指定して呼び出します。List 4-25 GpibSetSrqEvent関数呼び出しosp = New PLPSRQCALLBACK(AddressOf lpOnSrqProc)

nRet = GpibSetSrqEvent(1, osp, 0x55)

以上でコールバック関数の登録は完了です。

[C#]GPC-4301 標準版DLLのGpibSetSrqEvent関数の使用例を示します。・Step1:DLL関数、コールバック関数の定義

C言語でのGpibSetSrqEvent関数宣言とコールバック関数の型宣言は次の通りです。List 4-26 コールバック関数型宣言#define LPSRQCALLBACK VOID WINAPItypedef void (WINAPI *PLPSRQCALLBACK)(int nBoardNo, DWORD dwUser);

List 4-27 GpibSetSrqEvent関数宣言int GpibSetSrqEvent(ULONG ulBoardNo, PLPSRQCALLBACK lpOnSrqProc, DWORDdwUser);

C#で次のように定義します。PLPSRQCALLBACKというデリゲートを宣言します。List 4-28 コールバック用デリゲート宣言public delegate void PLPSRQCALLBACK(int nBoardNo, uint dwUser);

List 4-29 GpibSetSrqEvent関数宣言[DllImport("gpc43042.dll")]public static extern int GpibSetSrqEvent(uint ulBoardNo, PLPSRQCALLBACK lpOnSrqProc,uint dwUser);

・Step2:コールバック関数の作成

lpSrqProcというコールバック関数を宣言します。引数パラメータの数、型を、デリゲートPLPSRQCALLBACKと合わせます。List 4-30 コールバック関数void lpOnSrqProc(int dwBoardNo , uint dwUser){ ・ ・}

Page 114: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 113 - Interface Corporation

・Step3:DLL関数呼び出し

デリゲートPLPSRQCALLBACKのオブジェクト保存先を定義します。コールバック関数の呼び出しが繰り返される期間中に解放されないクラスの変

数などにします。List 4-31 デリゲートオブジェクト保存先変数定義IFCGPIB.PLPSRQCALLBACK osp;

関数lpOnSrqProcをコールバック関数として、PLPSRQCALLBACKデリゲートオブジェクトを生成します。デリゲートオブジェクトを、GpibSetSrqEvent関数の第2パラメータに指定して呼び出します。List 4-32 GpibSetSrqEvent関数呼び出しosp = new IFCGPIB.PLPSRQCALLBACK (lpOnSrqProc);

nRet = IFCGPIB.GpibSetSrqEvent(1, osp, 0x55);

以上でコールバック関数の登録は完了です。

4.3.8 イベントオブジェクト

イベントオブジェクトを利用して、割り込みイベントなどをアプリケーションへ

通知する機能を持ったアンマネージDLLがあります。.NET Framework上のアプリケーションでも、Win32APIのCreateEvent関数を呼び出し、イベントオブジェクトを使用できます。

Win32APIはKernel32.dllなどのアンマネージDLLが提供する関数です。Win32APIも、本チュートリアルで紹介しているアンマネージDLL関数の呼び出し、利用方法と同様に行う事ができます。

イベント通知機能を.NET Framework上のアプリケーションで利用する例を示します。

[Visual Basic]List 4-33 CreateEvent、WaitForSingleObject、CloseHandle、ResetEvent関数定義Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (ByVal lpEventAttributes AsInteger, ByVal ManualReset As Integer, ByVal bInitialState As Integer, ByVal lpName As String)As Integer

Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Integer, ByValdwMilliseconds As Integer) As Integer

Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer

Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Integer) As Integer

Page 115: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 114 -

List 4-34 関数呼び出し例(GPC-3100 非同期サンプリング処理)

(GPC-3100サンプルプログラムAdSmpl_BのForm5.vbより)Dim hEvent As IntegerhEvent = CreateEvent(0, True, False, CStr(0)) ・ ・ ・nRet = AdSetBoardConfig(ghDeviceHandle, hEvent, 0, 0)nRet = AdSetSamplingConfig(ghDeviceHandle, gConfig)nRet = AdStartSampling(ghDeviceHandle, FLAG_ASYNC) ・ ・ ・nRet = WaitForSingleObject(hEvent, 5000)nRet = ResetEvent(hEvent) ・ ・ ・nRet = CloseHandle(hEvent)

[C#]List 4-35 CreateEvent、WaitForSingleObject、CloseHandle、ResetEvent関数定義[DllImport("kernel32.dll",EntryPoint="CreateEventA")]public static extern uint CreateEvent(uint lpEventAttributes, bool ManualReset, bool bInitialState,string lpName);

[DllImport("kernel32.dll")]public static extern uint WaitForSingleObject(uint hHandle, uint dwMilliseconds);

[DllImport("kernel32.dll")]public static extern bool CloseHandle(uint hObject);

[DllImport("kernel32.dll")]public static extern bool ResetEvent(uint hEvent);

Page 116: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 115 - Interface Corporation

List 4-36 関数呼び出し例(GPC-3100 非同期サンプリング処理)(GPC-3100サンプルプログラム AdSmpl_Csの ESamplingForm.csより)uint hEvent;

hEvent =CreateEvent(0, true, false, null);

・ ・ ・gnErrCode = IFCAD.AdSetBoardConfig( ghDeviceHandle , hEvent , null , 0 );gnErrCode = IFCAD.AdSetSamplingConfig(ghDeviceHandle, ref gConfig);gnErrCode = IFCAD.AdStartSampling(ghDeviceHandle, IFCAD.FLAG_ASYNC); ・ ・ ・WaitForSingleObject(hEvent, 5000);ResetEvent(hEvent); ・ ・ ・CloseHandle(hEvent);

Page 117: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 116 -

4.3.9 関数のオーバーロード

異なる型の引数を持つ同じ名前の関数を複数定義することを、関数のオーバーロ

ードと言います。関数中の特定のパラメータが、異なる複数のデータ型を処理す

る場合に有効です。

オーバーロードを利用すると、使用するデータ型を選択できるようになるため、

関数の使い方が簡単になります。

例として、GPC-4301のGpibSend関数(データの送信関数)を示します。下記は、GpibSend関数を、IntPtr、Byte型、Byte配列型、String型の送信データに対応させる例です。BPC-08018に含まれるサンプルプログラムやC#クラスライブラリ内でも使用しています。

[Visual Basic]List 4-37 関数のオーバーロード定義例(Visual Basic)Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVallpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByRef vpBuffer As Byte) As Integer

Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVallpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer() As Byte) As Integer

Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVallpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer As String) As Integer

Declare Function GpibSend Lib "GPC43042.DLL" (ByVal ulBoardNo As Integer, ByVallpAdrsTbl() As Integer, ByVal ulpLength As Integer, ByVal vpBuffer As IntPtr) As Integer

[C#]

List –4-38 関数のオーバーロード定義例(C#)[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, ref bytepvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, byte[ ]pvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, stringpvBuffer);

[DllImport("gpc43042.dll")]public static extern int GpibSend(uint ulBoardNo, int[ ] lpAdrsTbl, uint dwLength, IntPtrpvBuffer);

Page 118: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 117 - Interface Corporation

4.3.10 クラスライブラリの参照先が未解決になった場合

「ソリューションエクスプローラー」上の参照設定ツリー中にあるクラス名にエ

クスクラメーションマークが表示された場合、目的のクラスライブラリDLLの参照に問題が発生しています。

このままでは、プログラム中で該当するクラスを使用することができません。

図 4-3 ソリューションエクスプローラー 参照エラー

コンポーネントの参照先は、絶対パスで保存されます。

そのため、ドライブ構成の異なる環境上にプロジェクトをコピーした場合や、ネ

ットワーク経由で、プロジェクトを開いた場合に割り当てるネットワークドライ

ブ文字が異なった場合にコンポーネントが参照できなくなります。

このような場合は、次の手順で、コンポーネントの参照設定を変更することで対

処することができます。

1.プロジェクトのプロパティを開きます。「ソリューションエクスプローラー」でプロジェクトの名(WindowsApprication 1)を選択し、メニューの「プロジェクト」-「プロパティ」を選択します。(もしくは、「ソリューションエクスプローラー」でプロジェクト名上

(Windows Apprication 1)で右クリックし、「プロパティ」を選択します。)プロジェクトのプロパティページが表示されます。

Page 119: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 118 -

2.プロジェクトのプロパティページの左のウィンドウにある「参照パス」を選択します。

設定されている参照パスが表示されます。

クラスライブラリDLLの保存先フォルダを参照パスとして追加してください。不要な参照パス設定は削除してください。

図 4-4 プロジェクトのプロパティ

3.「OK」をクリックしてプロパティの設定ダイアログを終了します。新しく設定された参照パスにより、クラスが正常に参照できるようになります。

Page 120: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 119 - Interface Corporation

4.3.11 Visual C++ .NETの補足情報

Visual C++ .NETでアンマネージアプリケーションを作成する場合は、DllImportAttributeを指定するプラットフォーム呼び出しではなく、Visual C++ 6.0アプリケーションの作成と同じように、ヘッダファイルのインクルード指定と、

インポートライブラリのリンク指定を行うことでDLL関数を呼び出すアプリケーションを作成することができます。

アンマネージアプリケーションとは、Visual C++プロジェクトの「MFCアプリケーション」や「Win32プロジェクト」のテンプレートを使用して作成されるアプリケーションです。

図 4-5 新しいプロジェクト ダイアログ

Visual C++アンマネージアプリケーションで、弊社Windows用ソフトウェアライブラリDLLを使用する手順を説明します。

1.アプリケーションのプロジェクトを開きます。プロジェクトのプロパティを開きます。

プロジェクトのプロパティページの「構成」より「C/C++」-「全般」を選択します。

右のウィンドウにある「追加のインクルードディレクトリ」という項目に、ソフ

トウェアライブラリのヘッダファイルの保存先を追加します。

Page 121: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 120 -

(例:H:¥work¥interface¥GPC2000¥include)

図 4-6 プロジェクトのプロパティ インクルードディレクトリ設定

2.インポートライブラリの検索パス設定を行います。プロジェクトのプロパティページの「構成」にある「リンカ」-「全般」を選択します。右のウィンドウにある「追加のライブラリディレクトリ」にソフトウ

ェアライブラリが提供するインポートライブラリの保存先を追加します。(例:H:¥work¥Interface¥GPC2000¥lib)

図 4-7 プロジェクトのプロパティ ライブラリディレクトリの設定

Page 122: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 121 - Interface Corporation

3.リンカに、リンクするインポートライブラリ名を追加指定します。プロジェクトのプロパティページの「構成」にある「リンカ」-「入力」を選択します。

右のウィンドウにある「追加する依存関係」にインポートライブラリのファイ

ル名を追加します。(例:fbidio.lib)

図 4-8 プロジェクトのプロパティ依存関係の設定

4.DLLが提供する関数を使用するための設定は以上で完了です。ソースファイル内で、ヘッダファイルのインクルード指定を行い、各DLLの関数を記述することができます。

Page 123: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 122 -

用語集

■アンマネージ コード共通言語ランタイムの規則および要件に関係なく作成されたコード。アンマネージコードが共通言語ランタイム環境で実行される場合は、最小限のサービスで実行されます。たとえば、ガベージ コレクションは実行されず、デバッグ機能も限定されます。

■エンコードとデコード本チュートリアルでは、文字コードの変換に対して、「エンコード」と「デコード」という表現を使用しています。エンコードとは、Unicode 文字から別のエンコーディングによるバイト集合へ変換することをさします。デコードは、何らかのエンコードによるバイト集合から Unicode 文字へ変換することをさします。.NET Framework には、各種のエンコーディングごとにクラスがあります。ASCIIEncoding、CodePageEncoding、UnicodeEncoding、UTF7Encoding、およびUTF8Encoding といったクラスが用意されています。

■オーバーロード同じ名前を持つ関数、プロパティまたはメソッドの別のバージョンを提供することをさします。名前は同じでも、パラメータの数またはパラメータのデータ型は異なっている必要があります。関数のオーバーロード とは、名前が同じで引数リストが異なる、複数のバージョンの関数を定義することです。

■共通言語ランタイムマネージ コード実行の核となるエンジン。共通言語ランタイムは、マネージ コードと共に、言語間の統合、コード アクセス セキュリティ、オブジェクトの有効期間の管理、デバッグ、プロファイルのサポートなどのサービスを提供します。

■デリゲート.NET Frameworkには、関数ポインタの機能を提供する特別な型 (Delegate) が定義されています。DLLなどが、アプリケーション内の関数を、関数ポインタを使い、呼び出すコールバック処理を.NET Framework上のアプリケーションでも実現することができます。

Page 124: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 123 - Interface Corporation

■ネームスペース.NET Framework上のソフトウェアコンポーネントは、ネームスペース(名前空間)を使用してクラスを識別します。名前空間は、クラスの可視範囲(参照可能なスコープ)を決定します。

プログラムを作成する時、Imports(Visual Basic)や、using (C#)キーワードを使い、参照したいクラスが定義されているネームスペースを指定します。これにより、その名前空間に含まれる、目的のクラスを参照できるようになります。

Imports やusingキーワードは、C言語の「#include」と同じような働きをするものと捉える事ができます。

■マーシャリング関数のパラメータを、スレッドまたはプロセスの境界を越えて、パッケージ化して送ったり、パッケージ化を解除するプロセスを言います。

■マネージ コード共通言語ランタイムとの "連携のコントラクト" に従って実行されるコード。マネージ コードは、ランタイムがメモリ管理、言語間の統合、コード アクセス セキュリティ、オブジェクトの有効期間の自動管理などのサービスを提供するために必要とするメタデータを提供する必要があります。Microsoft Intermediate Language(MSIL) に基づくコードはすべて、マネージ コードとして実行されます。

Page 125: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Interface Corporation - 124 -

技術資料紹介

弊社では下記の技術資料を提供しております。詳しくは、弊社Web site(www.interface.co.jp)、または弊社窓口までお問い合わせ下さい。カタログ

PRM-0061 CPZカタログ(日本語版)PRM-0062 PCIカタログ(日本語版)PRM-0063 CSIカタログ(日本語版)

チュートリアルTUT-0056 チュートリアル XP Embedded OS構築編TUT-0055 チュートリアル 画像入力ボードTUT-0054 CANチュートリアルTUT-0053 モーションコントロールチュートリアルTUT-0050 RTLinuxによるモーションコントローラボード制御プログラミング チュートリアル(GPG-7400用)TUT-0048 RTLinuxによるカウンタボード制御プログラミング チュートリアルTUT-0044 RTLinuxによるメモリ共有インタフェースボード制御プログラミング チュートリアルTUT-0043 RTLinuxによる調歩同期シリアル通信ボード制御プログラミング チュートリアルTUT-0041 RTLinuxによるGP-IBボード制御プログラミング チュートリアルTUT-0040 RTLinuxによるDAボード制御プログラミング チュートリアルTUT-0039 RTLinuxによるADボード制御プログラミング チュートリアルTUT-0038 RTLinuxによるDIOボード制御プログラミング チュ-トリアルTUT-0037 RTLinuxによるHDLCボード制御プログラミング チュートリアルTUT-0036 RTLinuxによるPCI/CompactPCI/CardBus制御入門書(導入編)TUT-0034 Visual C++によるPPI入門書TUT-0033 Visual Basicによるメモリ共有インタフェース入門書TUT-0032 Visual C++によるメモリ共有インタフェース入門書TUT-0031 Visual Basicによるカウンタ入門書TUT-0030 Visual C++によるカウンタ入門書TUT-0029 Visual BasicによるHDLC入門書TUT-0028 Visual C++によるHDLC入門書TUT-0027 Visual BasicによるGP-IB入門書TUT-0026 Visual C++によるGP-IB入門書TUT-0025 Visual BasicによるDIO入門書TUT-0024 Visual C++によるDIO入門書TUT-0023 Visual BasicによるDA入門書TUT-0022 Visual C++によるDA入門書TUT-0021 Visual BasicによるAD入門書TUT-0020 Visual C++によるAD入門書TUT-0019 Visual Basicによるモーションコントローラ入門書TUT-0018 Visual C++によるモーションコントローラ入門書TUT-0017 メモリンクを使用した負荷分散システム事例チュートリアルTUT-0016 Visual BasicによるPPI入門書TUT-0015 モーションコントロールチュートリアルTUT-0014 Microsoft Visual Studio .NET移行ガイドTUT-0008 拡張ユニット チュートリアル(問題解決編)TUT-0007 拡張ユニットチュートリアル(入門編)TUT-0006 C(98)/ISA製品からPCI/CompactPCI製品への移行チュートリアル(DOS編)TUT-0005 DOSによるLAP-B入門書TUT-0004 DOSによるAD入門書TUT-0003 LinuxによるPCI/CompactPCI/CardBus制御 入門書TUT-0002 PCI-ISAバスブリッジチュートリアルTUT-0001 PCI-Cバスブリッジチュートリアル

技術情報資料初めてのCANインタフェースLinux, リアルタイムLinux移植(SH-4)経験談及び当社の今後の取り組みについてLinuxからPCI/CompactPCIボードを制御する方法ActiveXコントロールによるシステム組み込み技術CompactPCIへの置き換え+システム構築/移行ガイドMS-DOSからPCI/CompactPCIボードを制御する方法

Page 126: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

- 125 - Interface Corporation

参考文献

・Microsoft MSDN ライブラリ 2002年10月リリース・Microsft Visual Studio .NET Professional ヘルプドキュメント・C#標準リファレンス(日経BPソフトプレス)

Page 127: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

Microsoft Visual Studio .NET移行ガイド

2005年 9月 Ver. 3.3 発行発行所

〒732-0828広島県広島市南区京橋町10-21TEL 082-262-7777FAX 082-262-5066

ISD-7078-33価格 ¥2,100 (定価 ¥2,000 + 消費税 ¥100)

本書の内容の一部または全部を、無断で転載することを禁止します。本書の内容は、将来予告なく変更することがありますので、あらかじめご了承ください。© 2002, 2005 Interface Corporation. All rights reserved.

Page 128: Microsoft Visual Studio .NET移行ガイド · PDF file · 2005-09-222.0 2003年 3月 Visual Basic .NET ... ・Visual Studio .NET Enterprise Developer ・Visual Studio .NET Professional

www.interface.co.jp

~既存DLL関数の呼び出し方法~

Microsoft Visual Studio .NET移行ガイドTUT-0014 Ver. 3.3