- PR -

C#によるUSBデバイスの列挙

1
投稿者投稿内容
たち吉
会議室デビュー日: 2006/08/01
投稿数: 8
投稿日時: 2006-10-23 00:54
たち吉と申します。

C#からUSBデバイスを操作するコードを書いています。
しかし、SetupDiEnumDeviceInterfacesがどうしてもtrueを返しません。
またGetLastErrorをするとエラーコード259(ERROR_NO_MORE_ITEMS)を返します。
もちろんUSBデバイスは一つ以上接続してあります。

USBデバイスの扱いにお詳しい方がいらっしゃいましたら、
ご教示お願い致します。


作成環境はwin2k、VS2005で、一応DDKも入れて必要なパスは通しました。
以下、サンプルコードです(参照元記事URLのUSBSharp.zipが参考になります)。

コード:
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct SP_DEVICE_INTERFACE_DATA
{
	public int cbSize;
	public Guid InterfaceClassGuid;
	public int Flags;
	public IntPtr Reserved;
}

unsafe class USBTest
{
	public const int DIGCF_PRESENT		= 0x00000002;
	public const int DIGCF_DEVICEINTERFACE	= 0x00000010;

	[DllImport("hid.dll")]static public extern void HidD_GetHidGuid (ref Guid HidGuid);

	[DllImport("setupapi.dll")]static public unsafe extern int SetupDiGetClassDevs(
		ref Guid ClassGuid, int* Enumerator, int* hWndParent, int Flags);

	[DllImport("setupapi.dll")]public static extern bool SetupDiEnumDeviceInterfaces(
		int DeviceInfoSet, int DeviceInfoData, ref Guid InterfaceClassGuid,
		int MemberIndex, ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);

	static void Main(string[] args)
	{
		Guid guid = new Guid();
		
		USBTest.HidD_GetHidGuid(ref guid);

		// HIDに関する情報を持つ構造体の配列を取得する
		int hDevInfo = USBTest.SetupDiGetClassDevs(ref guid, null, null, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

		SP_DEVICE_INTERFACE_DATA spid = new SP_DEVICE_INTERFACE_DATA();
		spid.cbSize = Marshal.SizeOf(spid);

		// usbデバイスを列挙する。なくなったら0を返す。
		while(USBTest.SetupDiEnumDeviceInterfaces(hDevInfo, 0, ref guid, 0, ref spid))
		{
			// なんらかの処理
			Console.WriteLine("あり");
		}
		Console.WriteLine("おわり");
	}
}


たち吉
会議室デビュー日: 2006/08/01
投稿数: 8
投稿日時: 2006-10-23 01:42
追記です。

VC++6.0で試しても同様の結果で259が返ってきました。
原因が.NETに関することではない可能性が高いですね。
(その場合は会議室違いですね。申し訳ないです)

コード:
#include <stdio.h>
#include <windows.h>
#include <hidsdi.h>
#include <setupapi.h>
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "hid.lib")

void main(void)
{
	GUID hidGuid;
	HDEVINFO devInfo;
	SP_DEVICE_INTERFACE_DATA spid;
	PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = NULL;

	HidD_GetHidGuid(&hidGuid);

	devInfo = SetupDiGetClassDevs(&hidGuid, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

	memset(&spid, 0, sizeof(spid));
	spid.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

	if(SetupDiEnumDeviceInterfaces(devInfo, NULL, &hidGuid, 0, &spid))
		printf("あった\\n");
	else
		printf("%d\\n",GetLastError());
}

Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-10-23 07:09

同じような問題のスレッド。解決には至りませんでしたけど。
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=717582&SiteID=7

この人の場合は Win2k では問題なかったそうですが。
たち吉
会議室デビュー日: 2006/08/01
投稿数: 8
投稿日時: 2006-10-23 09:06
Hongliangさん、ありがとうございます。

引用:
同じような問題のスレッド。解決には至りませんでしたけど。
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=717582&SiteID=7


検索で拝見していました。VB環境は入れていないので、そちらのソース自体は
試していませんが、概ね同じ動作をさせていると思います。

確かにそちらのスレ主の方はWinXP、Win2k、VS2005で正常に動作したと
明記されていますね。。手持ちのXP機で先の両サンプルを実行しても、
同じようにErrorCode259でした。

また何かあればお願い致します。
おいたん
会議室デビュー日: 2008/03/10
投稿数: 15
投稿日時: 2008-08-01 11:08
検索してましたら、まったく同様の問題を抱えて
おられたスレッドを見つけましたので、返信してみます。

VC#2005で、現在PCに接続されているUSBデバイスを
列挙するプログラムを組もうとしています。XPです。

コードもたち吉様とほぼ同様です。
が、SetupDiEnumDeviceInterfacesがtrueを返して
くれません。SetupDiGetClassDevsでハンドル取得
はできているようです。

 上記について、知見をお持ちの方、ご教授いただけ
ないでしょうか。よろしくお願いいたします。
Sak-Tak
会議室デビュー日: 2007/06/07
投稿数: 13
投稿日時: 2008-09-12 11:35
具体的にSetupDiEnumDeviceInterfacesはどんな風に記述していますか?
1

スキルアップ/キャリアアップ(JOB@IT)