2

アプリケーションでは、システム固有の UniqueId を取得する必要があります。CPUのUniqueIdを取得しようとしたので。WMI クラス プロパティを使用してそれを取得しています。しかし、win32_processor クラスの「UniqueId」プロパティを取得しようとすると、出力が期待されるバリアントで VT_NULL が返されます。しかし、同時に、deciveId、processorId などの他のプロパティに有効な出力を提供していますが、それらは一意ではなく、私の目的を達成できません。

なぜこれが起こるのか知っている人はいますか?助けてください....

以下は私が使用したコードです...見て、それに問題があるかどうか言ってください....それを機能させるためにどのような変更を加えることができますか...

   if(CoInitializeSecurity( NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
0
) != S_OK)
    return;

IWbemLocator * pIWbemLocator = NULL;
IWbemServices * pWbemServices = NULL;
IEnumWbemClassObject * pEnumObject  = NULL;

BSTR bstrNamespace = (L"root\\cimv2");


if(CoCreateInstance (
        CLSID_WbemAdministrativeLocator,
        NULL ,
        CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , 
        IID_IUnknown ,
        ( void ** ) & pIWbemLocator
        ) != S_OK)
            return;

if(pIWbemLocator->ConnectServer(
            bstrNamespace,  // Namespace
            NULL,          // Userid
            NULL,           // PW
            NULL,           // Locale
            0,              // flags
            NULL,           // Authority
            NULL,           // Context
            &pWbemServices
            ) != S_OK)
            return;



HRESULT hRes;
BSTR strQuery = (L"Select * from Win32_Processor");
BSTR strQL = (L"WQL");
hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);

if(hRes != S_OK)
{
    MessageBox("Could not execute Query");
    return;
}

ULONG uCount = 1, uReturned;
IWbemClassObject * pClassObject = NULL;


hRes = pEnumObject->Reset();

if(hRes != S_OK)
{
    MessageBox("Could not Enumerate");
    return;
}

hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
if(hRes != S_OK)
{
    MessageBox("Could not Enumerate");
    return;
}

VARIANT v;


BSTR strClassProp = SysAllocString(L"UniqueId");

hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);// here the v is VT_NULL but works if the vlaue of strClassProp is processerId, deviceId
if(hRes != S_OK)
{
    MessageBox("Could not Get Value");
    return;
}

SysFreeString(strClassProp);

_bstr_t bstrPath = &v;  //it causes exception if the v is VT_NULL in other cases its working

char* strPath = new char [1024];
_stprintf(strPath, ("%s"),(char*)bstrPath);


if (SUCCEEDED(hRes))
    MessageBox(strPath);

専門家のアドバイスと助けを期待しています....事前に感謝します....

4

0 に答える 0