2012-03-29 11 views
2

セットアップAPIを使用してデバイスを有効または無効にする方法を知っています。私が知る必要があるのは、この同じAPIを使って、デバイスが有効か無効かを判断できますか? Microsoftのdevconがハードウェアの操作にセットアップAPIを使用し、デバイスが有効か無効か(デバイスマネージャと同じように)、そのプログラムがあなたに通知するため、実際の問題は本当に問題になると思います。これはどうですか?この時点までのセットアップAPIメソッドの私の研究は、明確な答えを示していません。 MSからこのAPIを使用以上の中に持っているアンディセットアップAPIを使用して、デバイスが有効になっているかどうかを確認できます。

答えて

4

は、理解し、最悪の文書化。オリジナルの投稿で述べたように、セットアップAPIを使用してハードウェアを有効/無効にすることができます。だから、私は少し時間がかかり、最終的にハードウェアの状態を確認する方法をコミュニティに提供すると考えました。

したがって、短い答え:セットアップAPIからこれを実行しないでください。もちろん、これは理にかなっています。結局のところ、セットアップAPIを使用してデバイスの状態、つまり有効または無効を変更できるため、デバイスの現在の状態を判断するためには全く異なるAPIを使用する必要があります。ここで、Configuration Manager 32 APIを入力します。ハードウェアを有効/無効にするには、セットアップAPIを使用する必要がありますが、ハードウェアの状態を把握するには、ConfigMgr 32 API(#include cfgmgr32.h)を使用する必要があります。理にかなっているよね?

これを行う方法は他にもあるかもしれませんが、ここで行ったことがあります。

#include <Windows.h> 
#include <cstdlib> 
#include <setupapi.h> 
#include <cfgmgr32.h> 

GUID driveGuid = {0x4d36e967, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}; 

// first, get a list of hardware you're interested in using Setup API 
HDEVINFO hDevs(SetupDiGetClassDevs(&driveGuid, NULL, NULL, DIGCF_PRESENT)); 
if(INVALID_HANDLE_VALUE == hDevs) 
{ 
    throw std::runtime_error("unable to build a list of hardware"); 
} 

// this struct has the dev instance ID that the CFG MGR API wants. The struct must be 
// must be inited to the size of the struct, the cbSize member, all others should be 0 
SP_DEVINFO_DATA devInfo = {sizeof(SP_DEVINFO_DATA)}; 
DWORD index(0); 
LONG devStatus(0), devProblemCode(0); 
char devId[256]; 
memset(devId, 0, 256) 
while(SetupDiEnumDeviceInfo(hDevs, index++, &devInfo)) 
{ 
    // use Config Mgr to get a nice string to compare against 
    CM_Get_Device_ID(devInfo.DevInst, devId, 256, 0); 

    // use whatever mechanism you like to search the string to find out 
    // if it's the hardware you're after 
    if((std::string(devId)).find("MyHardware") != std::string::npos) 
    { 
     // goody, it's the hardware we're looking for 
     CM_Get_DevNode_Status(&devStatus, &devProblemCode, devInfo.DevInst, 0); 

     // if the call to getting the status code was successful, do something 
     // meaningful with the data returned. The fun part of this is that the 
     // return codes aren't really documented on MSDN. You'll have to look 
     // through the CfgMgr32.h file. Incidentally, these values are what 
     // are shown in the Device Manager when you look at the device's status. 
    } 
} 

SetupDiDestroyDeviceInfoList(hDevs); 

あなたはhereを発見したリストを検索することによって、後にしているハードウェアのGUIDを把握する必要があります。これらのうちのいくつかは、少なくとも、さまざまなWindowsヘッダーで事前定義されています。しかし、この時点で、私はごくわずかしか知りませんが、偶然にそれらに遭遇しました。上記で使用機能に

関連リンク: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA

私は、これは誰かに役立ちます願っています。

+0

「有効」と「無効」を判別するために使用するフラグは何ですか? 'DN_STARTED'は十分ですか? – AlexS

+0

私はこれ(2012年)に取り組んでからしばらく時間がありました。ヘッダーファイル(実際にはcfg.h)とメモリのクイックチェックでは、「有効」または「無効」にはDN_STARTEDで十分であると表示されます。実際には、このコンテキストでは、「有効」とは単に、このデバイスのドライバが起動したことを意味します。「無効」とは、このデバイスのドライバが起動していないことを意味します。 –

関連する問題