DOBON.NET DOBON.NETプログラミング掲示板過去ログ

汎用USBドライバについて

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[その他]

【解決したい問題】

お世話になります。
汎用USBドライバー(uusbd.sys、uusbd.dll)での通信実験中です。
USB経由でプリントデータ(バイナリ)を送信したい。
環境:WindowsXP Vb.Net  USB接続先:プリンタ
<問題点>
ドライバーのインストールは、正常に完了して、プリンタの接続も
認識する。
アプリ(Vb.Net)で、ハンドル取得のための"UsbOpen()”を実行した
ときの戻り値が、異常となる。
プリンタ接続なし:Hex 200000FFFFFFFF (仕様では、-1)
プリンタ接続あり:Hex 230001FFFFFFFF

以上の内容に関して、何かご存じの方、御教示ください。
  • 題名: Re[1]: 汎用USBドライバについて
  • 著者: るしぇ
  • 日時: 2010/07/07 10:45:22
  • ID: 27038
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No27030に返信(Hondaさんの記事)
この手の話を聞くと、宣言部が間違っているんじゃないかと
まず疑います。
VBはバージョン6.0から.Netになった時に変数のサイズが
改められて、同じDLLを相手にしても6.0と.Netでは違う
宣言になることは知ってますか?そこは問題ないですか?
[Visual Basic 6.0 ユーザーのための Visual Basic .NET 移行ガイド]
http://msdn.microsoft.com/ja-jp/library/dd314356.aspx
第 4 章 Short、Integer、Long あたりの話です。
■No27030に返信(Hondaさんの記事)
> 汎用USBドライバー(uusbd.sys、uusbd.dll)での通信実験中です。
それは、下記の物でしょうか?
http://www.otto.to/~kasiwano/newpage17.htm

> アプリ(Vb.Net)で、ハンドル取得のための"UsbOpen()”を実行した
> ときの戻り値が、異常となる。
先の DLL だとしたら、Uusbd_Open() はあるようですが、
UsbOpen() は見つかりませんでした。別の物でしょうか?

> プリンタ接続なし:Hex 200000FFFFFFFF (仕様では、-1)
下位32bit 分は、&HFFFFFFFF すなわち -1 になっているようですね。

> プリンタ接続あり:Hex 230001FFFFFFFF
これって、54bit 分ありますね。
先頭に0が省略されていると仮定すると、64bit 値なのでしょうか。

戻り値が「ハンドル」という事は、恐らく IntPtr 型で宣言する事に
なるはずですが、その戻り値を (32bit ではなく)64bit として
扱っているという事は、64bit バージョンの WinXP をお使いなのでしょうか?
■No27042に返信(魔界の仮面弁士さんの記事)
> ■No27030に返信(Hondaさんの記事)
>>汎用USBドライバー(uusbd.sys、uusbd.dll)での通信実験中です。
> それは、下記の物でしょうか?
> http://www.otto.to/~kasiwano/newpage17.htm
>
>>アプリ(Vb.Net)で、ハンドル取得のための"UsbOpen()”を実行した
>>ときの戻り値が、異常となる。
> 先の DLL だとしたら、Uusbd_Open() はあるようですが、
> UsbOpen() は見つかりませんでした。別の物でしょうか?
>
>>プリンタ接続なし:Hex 200000FFFFFFFF (仕様では、-1)
> 下位32bit 分は、&HFFFFFFFF すなわち -1 になっているようですね。
>
>>プリンタ接続あり:Hex 230001FFFFFFFF
> これって、54bit 分ありますね。
> 先頭に0が省略されていると仮定すると、64bit 値なのでしょうか。
>
> 戻り値が「ハンドル」という事は、恐らく IntPtr 型で宣言する事に
> なるはずですが、その戻り値を (32bit ではなく)64bit として
> 扱っているという事は、64bit バージョンの WinXP をお使いなのでしょうか?

るしぇ ファミリーさん、
魔界の仮面弁士さん、
ご返答ありがとうごさいました。

http://www.otto.to/~kasiwano/newpage17.htmです。
UsbOpen()→Uusbd_Open()の間違いでした。
WinXp-32Bitです。
Declareでの引数、戻り値を、Api関数表をもとに見直し変更した結果、
USB未接続時Uusbd_Open()実行:"-1”は戻るようになりましたが、
USB接続時時Uusbd_Open()実行:"0"です。(ハンドル値でない。)
又、Uusbd_Open_mask()関数でVendor,Productを指定しOpenした場合、
戻り値"0"。 
 まだ、正常なハンドルが取得できないのが現状です。
     お手数かけます。  御教示ください。 
■No27045に返信(Hondaさんの記事)
> Declareでの引数、戻り値を、Api関数表をもとに見直し変更した結果、
実際のコードを提示するわけにはいかないのでしょうか?

> USB未接続時Uusbd_Open()実行:"-1”は戻るようになりましたが、
すなわち INVALID_HANDLE_VALUE ですね。

> USB接続時時Uusbd_Open()実行:"0"です。(ハンドル値でない。)
使った事が無いので逆に質問なのですが、そのライブラリにとって、
「0」というのは有効なハンドルでは無いのでしょうか?

API 仕様を読んでみた限りでは、
 INVALID_HANDLE_VALUE … 該当するUSBデバイスが見つからない
 その他        … USBデバイスのハンドル。
と書かれているだけで、0 が無効という記述は見当たりませんでした。
■No27047に返信(魔界の仮面弁士さんの記事)
> ■No27045に返信(Hondaさんの記事)
>>Declareでの引数、戻り値を、Api関数表をもとに見直し変更した結果、
> 実際のコードを提示するわけにはいかないのでしょうか?
>
>>USB未接続時Uusbd_Open()実行:"-1”は戻るようになりましたが、
> すなわち INVALID_HANDLE_VALUE ですね。
>
>>USB接続時時Uusbd_Open()実行:"0"です。(ハンドル値でない。)
> 使った事が無いので逆に質問なのですが、そのライブラリにとって、
> 「0」というのは有効なハンドルでは無いのでしょうか?
>
> API 仕様を読んでみた限りでは、
>  INVALID_HANDLE_VALUE … 該当するUSBデバイスが見つからない
>  その他        … USBデバイスのハンドル。
> と書かれているだけで、0 が無効という記述は見当たりませんでした。

お世話になります。遅くなりました。
//////////////
<Openに関する宣言>
*マスクなしOpen
Private Declare Function Uusbd_Open Lib "uusbd.dll" () As IntPtr
*マスク設定Open
Private Declare Function Uusbd_Open_mask Lib "uusbd.dll" _
(ByVal s1 As Integer, ByVal v1 As Byte, ByVal v2 As Byte, ByVal v3 As Integer, ByVal v4 As Integer, ByVal v5 As Byte) As IntPtr
*パイプ接続
Private Declare Function Uusbd_OpenPipe Lib "uusbd.dll" _
(ByRef v1 As IntPtr, ByRef v2 As Byte, ByRef v3 As Byte) As IntPtr
//////////////
<Dll呼び出しコード。>
Dim hUSB As IntPtr
Sub ****
*マスクなし
hUSB = Uusbd_Open()
*マスク設定  
' hUSB = Uusbd_Open_mask(&HC, 0, 0, &H1525, &H1, 0) '確認にため直値設定

If hUSB = -1 Then
MsgBox("USB PRT が見つかりません")
End If
*パイプ接続
h_CMD0 = Uusbd_OpenPipe(hUSB, 0, 1)
///////////
ハンドル"0"が無効と判断したのは、Vendor,Productを指定したマスク設定Openで
"-1”なることからです。
引数 ByRef→ByValの変更しても同じでした。

お手数かけます。  御教示ください。
■No27054に返信(Hondaさんの記事)
>> 実際のコードを提示するわけにはいかないのでしょうか?
> お世話になります。遅くなりました。
ざっと見た限りでは、Uusbd_Open_mask にしても Uusbd_OpenPipe にしても、
宣言が間違っていると思いますよ。

とりあえず、Uusbd_Open_mask の方を見てみましょう。
(以下、引用元の原文を加工し、改行や行継続文字を追加しています)

> *マスク設定Open
> Private Declare Function Uusbd_Open_mask Lib "uusbd.dll" ( _
>   ByVal s1 As Integer, _
>   ByVal v1 As Byte, _
>   ByVal v2 As Byte, _
>   ByVal v3 As Integer, _
>   ByVal v4 As Integer, _
>   ByVal v5 As Byte _
> ) As IntPtr

API一覧.doc および uusbd.h を見たところ、
Uusbd_Open_mask 関数の定義は、以下のようになっています。

  HUSB APIENTRY Uusbd_Open_mask(
    ULONG   flag,
    UCHAR   Class,
    UCHAR   SubClass,
    USHORT  Vendor,
    USHORT  Product,
    BYTE    bcdDevice
  );

そして、それぞれの型の意味は、Windows SDK によれば
下記のように定義されています。
http://msdn.microsoft.com/en-us/library/cc230309%28PROT.10%29.aspx

ULONG  : 32-bit unsigned integer (range: 0 through 4294967295 decimal)
UCHAR  : 8-bit integer (range: 0 through 255 decimal)
USHORT : 16-bit unsigned integer (range: 0 through 65535 decimal).
BYTE   : 8-bit unsigned value


ということは、Uusbd_Open_mask の引数はすべて ByVal で、
UInteger, Byte, Byte, UShort, UShort, Byte あたりが
正しい宣言であると予想します。
符号無し整数型を使うか、符号付き整数型を使うかは任意ですけれども。


> 引数 ByRef→ByValの変更しても同じでした。
意味を把握せずに、闇雲に変換しているわけでは無いですよね…?

質問内容からでは、どの引数を変更したのかが読み取れませんでしたが、
その ByRef → ByVal の変更というのは、どのような基準で行っていますか?

DOBON.NET | プログラミング道 | プログラミング掲示板