gpib-32.dllエクスポートへ直接アクセスする

NI-488.2

gpib-32.dllエクスポートへ直接アクセスする

次の各行がアプリケーションの最初の部分に記述されていることを確認してください。

#ifdef __cplusplus
extern "C"{

#include <windows.h>
#include" "ni488.h"
#ifdef __cplusplus
}

Win32アプリケーションでは、最初に gpib-32.dllをロードすることが必要です。次のコードは、LoadLibrary関数を呼び出してエラーを調べるものです。

HINSTANCE Gpib32Lib = NULL;
Gpib32Lib=LoadLibrary("GPIB-32.DLL");
if (Gpib32Lib == NULL) {

return FALSE;

}

各関数のプロトタイプについては、このヘルプファイルのキーワードを介してその関数のヘルプを参照してください。

ibdevibwrtのように整数値を返す呼び出しでは、関数へのポインタは次のように指定します。

int (_stdcall *Pname)

ここで、*Pnameは関数へのポインタ名です。

FindLstnSendListのように値を返さない呼び出しでは、関数へのポインタは次のように指定します。

void (_stdcall *Pname)

ここで、*Pnameは関数へのポインタ名です。続けて指定する関数のパラメータリストについては、このヘルプファイルのキーワードを介してその関数のヘルプを参照してください。

次の例は、ibdevibonl呼び出しでの関数ポインタとパラメータリストの設定方法を示すものです。

int (_stdcall *Pibdev)(int ud, int pad, int sad, int tmo, int eot, int eos);
int (_stdcall *Pibonl)(int ud, int v);

次に、Win32アプリケーションでは、GetProcAddressを使って、アプリケーションに必要なグローバルステータス変数と呼び出しのアドレスを取得します。次のコードは、アプリケーションに必要なステータス変数と呼び出しへのポインタのアドレスを示すものです。

/* NI-488.2のグローバルステータス変数へのポインタ*/
int *Pibsta;
int *Piberr;
long *Pibcntl;
static int(__stdcall *Pibdev)

(int ud, int pad, int sad, int tmo, int eot,
int eos);

static int(__stdcall *Pibonl)

(int ud, int v);

Pibsta = (int *) GetProcAddress(Gpib32Lib,

(LPCStr)"user_ibsta");

Piberr = (int *) GetProcAddress(Gpib32Lib,

(LPCStr)"user_iberr");

Pibcntl = (long *) GetProcAddress(Gpib32Lib,

(LPCStr)"user_ibcnt");

Pibdev = (int (__stdcall *)

(int, int, int, int, int, int))

GetProcAddress(Gpib32Lib, (LPCStr)"ibdev");

Pibonl = (int (__stdcall *)(int, int))

GetProcAddress(Gpib32Lib, (LPCStr)"ibonl");


GetProcAddressが失敗すると、NULLポインタが返されます。次のコードは、GetProcAddressへの呼び出しすべてが成功したことを確認するものです。

if ((Pibsta == NULL) ||

(Piberr == NULL) ||
(Pibcntl == NULL) ||
(Pibdev == NULL) ||
(Pibonl == NULL)) {
/* GPIBライブラリを開放 */
FreeLibrary(Gpib32Lib);

printf("GetProcAddressに失敗しました。");

}

ステータス変数または関数にアクセスするためには、ポインタの参照を解除する必要があります。次のコードは、アプリケーション内から関数を呼び出してステータス変数にアクセスするものです。

dvm = (*Pibdev) (0, 1, 0, T10s, 1, 0);
if (*Pibsta & ERR) {
printf("呼び出しに失敗しました");
}

アプリケーションを終了する前に、次のコマンドを使ってgpib-32.dllを解放してください。

FreeLibrary(Gpib32Lib);

その他のgpib-32.dllへの直接アクセスの例については、NI-488.2ソフトウェアにインストールされているダイレクトエントリ用サンプルプログラムdlldevquery.cdll4882query.cを参照してください。ダイレクトエントリについての詳細は、Win32 SDK(ソフトウェア開発キット)のヘルプを参照してください。