1

すべてのComポートデバイスをプログラムでアンインストールする必要があります。問題は、これらのComポートデバイスが存在しないため、完全に非表示になっていることです。つまり、デバイスマネージャーを使用してそれらをアンインストールする場合でも、最初にdevmgr_show_nonpresent_devices = 1環境変数に追加してから、デバイスマネージャーで非表示のデバイスを表示する必要があります。次に、各デバイスを右クリックしてアンインストールできます。ただし、関連するドライバーをアンインストールしたくありません。高度なシステム設定でその変数を追加し、新しいユーザー変数を作成して保存しています。

私はdevconでこれをやろうとしています。それらはで見つけることができますが、デバイスがアンインストールされていないことを示すためにそれらを削除するコマンドが失敗devcon findallするため、それらを削除できません。また、存在しないデバイスを検索するためのフラグはありません。標準を実行すると、(対象の)デバイスが見つかりません。devcon find

だから、私は自分のコードを使用してこれを正確に行う方法を理解することを余儀なくされており、ここで私は立ち往生しています。これが私がこれまでに持っているものです:

// Get all of the devices
PCTSTR enumType = "PORTS";
HDEVINFO devs = NULL;
devs = SetupDiGetClassDevs(NULL,enumType,0,DIGCF_PRESENT | DIGCF_ALLCLASSES);

// Loop through the devices
DWORD devCount = 0;
SP_DEVINFO_DATA devInfo;
int enumeratingDevices = 1;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
while(enumeratingDevices){
    enumeratingDevices = SetupDiEnumDeviceInfo (devs,devCount,&devInfo);
    // Uninstall each device
    cout << SetupDiRemoveDevice(devs,&devInfo);
    cout << SetupDiCallClassInstaller(DIF_REMOVE,&devInfo,NULL);
    devCount++;
}
cout << devCount;
SetupDiDestroyDeviceInfoList(devs);
return 0;

現在、の出力を取得しています001。したがって、基本的に、SetupDiEnumDeviceInfo()またはSetupDiRemoveDevice正しく実行されません。列挙が機能していることはわかっていますenumType = "USB";。入力すると、devCountが10になるからです。

どんな助けやアドバイスも素晴らしいでしょう。

4

2 に答える 2

2

それで、私はたくさんのいじくり回して読んだ後にそれを理解しました。

// Get all of the devices
   //This enumeration does not work in general, instead passing
   //complete id of the device is probably best. 
   //It is helpful to know the vendor and device ID
PCTSTR enumType = "PORTS"; 
HDEVINFO devs = NULL;
devs = SetupDiGetClassDevs(NULL,enumType,0,DIGCF_ALLCLASSES);

// Loop through the devices
DWORD devCount = 0;
SP_DEVINFO_DATA devInfo;
int enumeratingDevices = 1;
/*This line is essential*/
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
while(enumeratingDevices){
        enumeratingDevices = SetupDiEnumDeviceInfo (devs,devCount,&devInfo);
        // Uninstall each device
        if(enumeratingDevices){
           SetupDiRemoveDevice(devs,&devInfo);
           devCount++;
        }
}
    //Clean up
SetupDiDestroyDeviceInfoList(devs);

明日、私が話していた正確な列挙でラボに到着したときに、これを更新します。ただし、この方法を使用すると、デバイスが存在せず、レジストリに「ゴースト」しかない場合でも、事実上すべてのデバイスをアンインストールできます。

于 2012-10-09T03:05:34.237 に答える
0

コードでUSBデバイスを正常に無効にすることはできましたが、SetupDiunremoveDevice関数を使用してUSBを有効にすることができません。このAPIの例を挙げて、デバイスを再度有効にしてください。WINSETUPAPI BOOL SetupDiUnremoveDevice(HDEVINFO DeviceInfoSet、PSP_DEVINFO_DATA DeviceInfoData);

于 2021-06-29T07:11:31.747 に答える