A1. サンプルファイルをコンパイルするには、どうすれば良いですか?
- →Visual C++ サンプルソース 構築例
- →Visual Basic サンプルソース 構築例
- →Delphi サンプルソース構築例
A2. Visual C/C++ のMFCアプリケーションを組むにはどうすれば良いですか?
→MFC実装手順
A3. BORLAND C++ BUILDERでコンパイル出来ますか?
Windowsドライバに添付されているラッパー関数はVisualC++ 用ですが、以下の修正を行うことによって C++Builderでも使用することが可能です。
(VCサンプルのlibフォルダにあるlibファイル(例:Apci8131.lib)は、使用しません)
aPCI-8131の場合
■ラッパー関数(Apci8131w.c)の修正
1.Apci8131w.c を Apci8131w.cpp にコピーします
2.GetProcAddres で取得するアドレスの型を明確にするため
型指定を行います
例:
#include <windows.h>
#include <tchar.h>
#include "Apci8131w.h"
typedef BOOL WINAPI (*TApci8131GetVersion) (PDWORD
pdwDllVersion,
PDWORD pdwDriverVersion);
typedef BOOL WINAPI (*TApci8131Create) (PWORD pwLogSlot);
:
中略
:
typedef DWORD WINAPI (*TApci8131GetLastError) (WORD wLogSlot);
3.DLL エクスポート関数アドレスを取得する関数で GetProcAddress
の戻り値をキャストします
例:
static BOOL Apci8131wGetDllExportFunc(void)
{
pApci8131GetVersion = (TApci8131GetVersion)GetProcAddress
(hDLL,"Apci8131GetVersion");
pApci8131Create = (TApci8131Create)GetProcAddress
(hDLL,"Apci8131Create");
:
中略
:
pApci8131GetLastError = (TApci8131GetLastError)GetProcAddress
(hDLL,"Apci8131GetLastError");
if ( pApci8131GetVersion == NULL ) return FALSE;
4.プロジェクトにラッパー関数を追加します
Apci8131 C++Builder sample project (サンプルダウンロード)
上記の例に従って作成したサンプルです
詳細は圧縮ファイル内の readme.txt をご参照ください
A4. ドライバが提供するAPIの引数で「論理スロット番号」とありますがなにを指定したら良いですか?
論理スロットについて をご参照ください。
A5. Windowsプログラムを作成する際、一度DLLをCreateしたデバイスが何らかの原因でClose出来なかった場合、次のCreateでエラーになります。
この現象が起きる原因と、対応方法を教えて下さい。また、ドライバが提供するAPIの引数で「論理スロット番号」とありますがなにを指定したら良いですか?
何らかの理由によりDLLがClose出来なかった場合、ドライバ内に「デバイス使用中フラグ」が残ったままになりますので、再度Createしようとしてもエラーが発生します。
この対応としては、以下の様な方法でドライバを再起動し、内部フラグ等の初期化を行う必要があります。
- コンピュータをリセットする。
- [コントロールパネル]の[デバイス]を開き、デバイス中の[Apci****]を選択し、[停止]ボタンでドライバを停止させた後、[開始]ボタンで再起動する。
(ただし、この方法は WindowsNTドライバだけに有効です)
- PCカードを一度抜き差しする(ただし、この方法はPCカードだけに有効です)
上記の通り、Windows95/98上でPCカード以外の場合は、コンピュータをリセットする以外に方法はありません。
A6. 論理スロット番号の割り当てについて。
以下の論理スロット番号の割当てと思わ れる動作をしていますが、次の動作は正しいでしょうか。
8スロットバックプレーンの電源端子台の近い方から、次の様に各ボードを挿しました。
CPUボード (aPCI-8002)
入力ボード (aPCI-8132)
出力ボード (aPCI-8133)
A/D変換ボード (aPCI-8815)
D/A変換ボード (aPCI-8806)
D/A変換ボード (aPCI-8806)
モータコントロールボード(aPCI-8759)
通信ボード (aPCI-8304)
DOS用サンプルソースを流用して、
retcode = ApciGetDeviceInfo( ( LPAPCI_FIND_RES )&rep[i], board_id, i ); を実行しました。
論理スロット番号(i)を次の番号に指定した場合、上記関数がCMD_COMPLETEを返し、正常に情報を取得できたように見えます。
入力ボード(aPCI-8132) →0
出力ボード(aPCI-8133) →0
A/D変換ボード(aPCI-8815) →0
D/A変換ボード(aPCI-8806) →0
D/A変換ボード(aPCI-8806) →1
モータコントロールボード(aPCI-8759) →0
通信ボード(aPCI-8304) →0
論理スロット番号の割りあては物理スロットの挿入位置により、0,1,2,...6と割当てられるように考えていましたが、そうはなっていません。
aPCI-8806が7枚挿さっている状況であれば、 0,1,2,3,...6となりますが、ご質問をいただいた環境ではaPCI-8806が2枚のみで、その他はすべて異種ボードです。
したがいまして、この場合の論理スロット番号の割りあては上記内容でまちがいありません。
A7. 複数種ボードの同時使用について。
aPCI-P32,P33を1つのプロジェクトで使用したいと思っていますが、 wLogSlotやdwDllVerなどの変数名 がP32とP33でだぶっています。大丈夫でしょうか?
上記のように2種類以上のボードを1つのプロジェクトで使用する場合、サンプルソースプログラムで引数として使用する変数
wLogSlot
dwDllVer
...
については、例えば、
wLogSlot32 / wLogSlot33
dwDllVer32 / dwDllVer33
...
のように、各製品毎にそれぞれの変数を割りあててください。言い替えると、wLogslot32やwLogslot33のように、ボード毎に固有の変数名を割りあてる必要があります。
しかし、ラッパー関数ファイルに関しては処理として独立しているので、変数名を修正する必要が無く、そのまま使用可能です。
A8. 「外部シンボル未解決」エラー(aISA-G01,VC4)
aISA-G01とVC++ Ver.4.2でプログラム作成しています。コンパイルはできたのですが、リンク時に「外部 シンボル未解決」というエラーが出力されます。どのような対策を施せばよいでしょうか?
外部シンボル未解決エラーが発生する原因は、ライブラリ(****G01.LIB) がプロジェクトに追加されていないためです。テストプログラムのプロジェクトに ****G01.LIB を追加してから再度ビルドするようにしてください。
ライブラリの追加方法 :
- [ プロジェクト → プロジェクトへ追加 → ファイル ] をクリック。
- [ プロジェクトへファイルを追加 ] ダイアログが表示されますので、 [ ファイルの種類 ] を [ ライブラリ ファイル(lib) ] に指定。
- ****G01.LIB を選択し、 [ OK ] ボタンをクリック。
A9. Windowsドライバのサンプルに「ラッパー関数」がありますが、これはどの様に使用するのでしょうか。
ラッパー(wrapper)関数は、アプリから直接API関数を呼び出すこと無しにドライバをお使いいただける様、弊社にて添付しているものです。
ラッパー関数の使用例は、サンプルフォルダのxxxxs.cをご参照ください。
また、ユーザプアプリにてラッパー関数を使用する場合は、プロジェクトに、
・xxxxw.c // ラッパー関数
・xxxxw.h // ラッパー関数ヘッダ
・xxxxx.h // DLL 定義ヘッダ
を組み込んで下さい。(xxxxxの部分はボードによって異なります)
A10. WindowsドライバのVC用サンプルのLibフォルダ(\Sample\Vc\Lib)にインポートライブラリ(*.lib)がありますが、これはどの様に使用するのでしょうか。
libファイルはラッパー関数を使用せず、DLL を直接アクセスしたい場合に使用いたします。
Visualstudioの、「プロジェクト」→「プロジェクトへ追加」→「ファイル」でプロジェクトに追加し、ご使用ください。
|