Winapi 在vc+中使用win32#U diskDrive api获取物理驱动器的序列号+;

Winapi 在vc+中使用win32#U diskDrive api获取物理驱动器的序列号+;,winapi,visual-c++,Winapi,Visual C++,我正在尝试获取通过USB连接到系统外部的物理驱动器的序列号。现在,当我试图获取序列号时,它给出了通过SATA电缆连接的物理驱动器的序列号。它以加密形式给出序列号。但当我尝试使用外部驱动器时。它没有给出正确的序列号 我是通过win32\u DiskDrivewinapi来实现这一点的 我正在使用这个代码 void GetDrives() { HRESULT hres; // The return result of COM

我正在尝试获取通过USB连接到系统外部的物理驱动器的序列号。现在,当我试图获取序列号时,它给出了通过SATA电缆连接的物理驱动器的序列号。它以加密形式给出序列号。但当我尝试使用外部驱动器时。它没有给出正确的序列号

我是通过
win32\u DiskDrive
winapi来实现这一点的

我正在使用这个代码

       void GetDrives()
        {
            HRESULT hres;    // The return result of COM
            ULONG uReturn = 0;
            int nIndex = 0;
            CString szVariantString;
            CString szSerialNumber;
            VARIANT vtProp;

            hres =  CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); 

            if (FAILED(hres))
            {
                return;                  // Program has failed.
            }

            IWbemLocator *pLoc = NULL;
            hres = CoCreateInstance(
                CLSID_WbemLocator,             
                0, 
                CLSCTX_INPROC_SERVER, 
                IID_IWbemLocator, (LPVOID *) &pLoc);

            if (FAILED(hres))
            {
                CoUninitialize();
                return;                 // Program has failed.
            }

            IWbemServices *pSvc = NULL;

            // Connect to the root\cimv2 namespace with
            // the current user and obtain pointer pSvc
            // to make IWbemServices calls.
            hres = pLoc->ConnectServer(
                _bstr_t("ROOT\\CIMV2"), // Object path of WMI namespace
                NULL,                    // User name. NULL = current user
                NULL,                    // User password. NULL = current
                0,                       // Locale. NULL indicates current
                NULL,                    // Security flags.
                0,                       // Authority (e.g. Kerberos)
                0,                       // Context object 
                &pSvc                    // pointer to IWbemServices proxy
                );


            if (FAILED(hres))
            {
                pLoc->Release();     
                CoUninitialize();
                return ;                // Program has failed.
            }

            hres = CoSetProxyBlanket(
                pSvc,                        // Indicates the proxy to set
                RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
                RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
                NULL,                        // Server principal name 
                RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
                RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
                NULL,                        // client identity
                EOAC_NONE                    // proxy capabilities 
                );

            if (FAILED(hres))
            {
                pSvc->Release();
                pLoc->Release();     
                CoUninitialize();
                return;               // Program has failed.
            }

            IEnumWbemClassObject* pEnumerator = NULL;
            hres = pSvc->ExecQuery(
                bstr_t("WQL"), 
                bstr_t("SELECT * FROM Win32_DiskDrive"),
                WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
                NULL,
                &pEnumerator);


            IWbemClassObject *pclsObj = nullptr;
            CString szDisk;
            if (SUCCEEDED(hres))
            { 
                while (pEnumerator)
                {
                    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
                    if(!uReturn)
                        break;


                    // Variant is always needed to clear as it was initialized with new values
                    VariantInit(&vtProp);
                    memset(&vtProp,0,sizeof(VARIANT));

  ////////////////////////////////////////////////////////////////////////////////////////////////////
                    VariantClear(&vtProp);

                    hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
                    if(&vtProp != NULL)
                    {
                        szVariantString = vtProp.bstrVal;
                        szVariantString.ReleaseBuffer();
                    }


        ////////////////////////////////////////////////////////////////////////////////////////////////////
                    VariantClear(&vtProp);
                    nIndex++;
                }
            }

            if(pSvc)
                pSvc->Release();
            if(pLoc)
                pLoc->Release();
            if(pEnumerator)
                pEnumerator->Release();
            if(pclsObj)
                pclsObj->Release();

            CoUninitialize();
        }
我得到了msdn的帮助:

http://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx

有人能帮我吗。

你能给我们一些你目前正在使用的代码吗?那太好了。除非我们能看到你在做什么,否则我们无法帮助你找出你做错了什么(如果有的话)。ReleaseBuffer()毫无意义。使用WMI Code Creator实用程序双重检查查询。不要指望闪存驱动器会带来奇迹,记住序列号的变化非常微小。另外,操作系统的版本也很重要,旧的不起作用,而且(我认为)win8会改变这个数字。我试过很多次了。这就是我问的原因。它给出了闪存驱动器的序列号。那么,如果external hard drives.FWIW中的“加密”仅为十六进制,为什么不呢。您是否尝试过像WMIExplorer或WMIC这样的工具,以查看您是否从外部设备获得了所需的结果?