none
Error System.TypeInitializationException RRS feed

  • Pregunta

  • Saludos,

    Estoy teniendo un error que me tiene la cabeza frita, porque he intentado de todo para solucionarlo. La cosa es que necesito cierta información interna del pc donde se ejecute el programa que estoy creando y tengo un código para sacar la información, es el siguiente:

    HRESULT hres;


        wsprintf( baseBoardManufacturer, "");
        wsprintf( baseBoardModel, "");
        wsprintf( macAddress, "");




        // Step 1: --------------------------------------------------
        // Initialize COM. ------------------------------------------

        hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
        if (FAILED(hres))
        {
    //        cout << "Failed to initialize COM library. Error code = 0x"
    //            << hex << hres << endl;
            return false;                  // Program has failed.
        }

        // Step 2: --------------------------------------------------
        // Set general COM security levels --------------------------
        // Note: If you are using Windows 2000, you need to specify -
        // the default authentication credentials for a user by using
        // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
        // parameter of CoInitializeSecurity ------------------------

        hres =  CoInitializeSecurity(
            NULL,
            -1,                          // COM authentication
            NULL,                        // Authentication services
            NULL,                        // Reserved
            RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
            RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
            NULL,                        // Authentication info
            EOAC_NONE,                   // Additional capabilities
            NULL                         // Reserved
            );

                          
        if (FAILED(hres))
        {
    //        cout << "Failed to initialize security. Error code = 0x"
    //            << hex << hres << endl;
            CoUninitialize();
            return false;                    // Program has failed.
        }
        
        // Step 3: ---------------------------------------------------
        // Obtain the initial locator to WMI -------------------------

        IWbemLocator *pLoc = NULL;

        hres = CoCreateInstance(
            CLSID_WbemLocator,             
            0,
            CLSCTX_INPROC_SERVER,
            IID_IWbemLocator, (LPVOID *) &pLoc);
     
        if (FAILED(hres))
        {
    //        cout << "Failed to create IWbemLocator object."
    //            << " Err code = 0x"
    //            << hex << hres << endl;
            CoUninitialize();
            return false;                 // Program has failed.
        }

        // Step 4: -----------------------------------------------------
        // Connect to WMI through the IWbemLocator::ConnectServer method

        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(L"ROOT\\CIMV2"), // Object path of WMI namespace
             //bstr_t(L"\\\\noorgani-8xwxwf\\root\\cimv2"),
             //bstr_t(L"\\\\fbt-4bf51dc0762\\root\\cimv2"),
            
             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))
        {
    //        cout << "Could not connect. Error code = 0x"
    //             << hex << hres << endl;
            pLoc->Release();     
            CoUninitialize();
            return false;                // Program has failed.
        }

    //    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


        // Step 5: --------------------------------------------------
        // Set security levels on the proxy -------------------------

        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))
        {
    //        cout << "Could not set proxy blanket. Error code = 0x"
    //            << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();     
            CoUninitialize();
            return false;               // Program has failed.
        }

        // Step 6: --------------------------------------------------
        // Use the IWbemServices pointer to make requests of WMI ----

        // For example, get the name of the operating system
        IEnumWbemClassObject* pEnumerator = NULL;
        hres = pSvc->ExecQuery(
            bstr_t("WQL"),
            //bstr_t("SELECT * FROM Win32_OperatingSystem"),
            bstr_t("SELECT * FROM Win32_BaseBoard"),
            //bstr_t("SELECT * FROM Win32_NetworkAdapter"),        
            //bstr_t("SELECT * FROM Win32_DiskDrive"),                
            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
            NULL,
            &pEnumerator);
        
        if (FAILED(hres))
        {
    //        cout << "Query for BaseBoard failed."
    //            << " Error code = 0x"
    //            << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();
            CoUninitialize();
            return false;               // Program has failed.
        }

        // Step 7: -------------------------------------------------
        // Get the data from the query in step 6 -------------------
     
        IWbemClassObject *pclsObj = NULL;
        ULONG uReturn = 0;
       
        while (pEnumerator)
        {
            HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
                &pclsObj, &uReturn);

            if(0 == uReturn)
            {
                break;
            }

            VARIANT vtProp;

            // Get the value of the ... property
            //hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
            //hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);    // Win32_DiskDrive        
            //hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);    // Win32_DiskDrive        
            //hr = pclsObj->Get(L"Model", 0, &vtProp, 0, 0);    // Win32_DiskDrive        
            //hr = pclsObj->Get(L"SystemName", 0, &vtProp, 0, 0);    // Win32_DiskDrive        
            //hr = pclsObj->Get(L"Product", 0, &vtProp, 0, 0);    // Win32_BaseBoard
            //hr = pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0);    // Win32_NetworkAdapter
            //wcout << "Value : " << vtProp.bstrVal << endl;

            hr = pclsObj->Get(L"Manufacturer", 0, &vtProp, 0, 0);    // Win32_BaseBoard
            //wcout << vtProp.bstrVal << endl;
            sprintf( baseBoardManufacturer, "%.128S", vtProp.bstrVal );
            VariantClear(&vtProp);

            hr = pclsObj->Get(L"Product", 0, &vtProp, 0, 0);    // Win32_BaseBoard
            //wcout << vtProp.bstrVal << endl;
            sprintf( baseBoardModel, "%.128S", vtProp.bstrVal );
            VariantClear(&vtProp);

            pclsObj->Release();
        }

        //-----

        pEnumerator = NULL;
        hres = pSvc->ExecQuery(
            bstr_t("WQL"),
                                    //"SELECT * FROM Win32_NetworkAdapter Where (adaptertypeID = 0)"
                                    // y ver q realmente lista al menos uno y que el mac no son todos los numeros iguales

            //bstr_t("SELECT * FROM Win32_NetworkAdapter"),
            bstr_t("SELECT * FROM Win32_NetworkAdapter Where (adaptertypeID = 0)"), //!! nuevo

            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
            NULL,
            &pEnumerator);
        
        if (FAILED(hres))
        {
    //        cout << "Query for NetworkAdapter failed."
    //            << " Error code = 0x"
    //            << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();
            CoUninitialize();
            return false;               // Program has failed.
        }
        
        // Step 7: -------------------------------------------------
        // Get the data from the query in step 6 -------------------
        
        pclsObj = NULL;
        uReturn = 0;

        bool trincoprimero = false;    //!! nuevo
        
        while (pEnumerator)
        {
            HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
                &pclsObj, &uReturn);

            if(0 == uReturn)
            {
                break;
            }

            VARIANT vtProp;


            // Get the value of the ... property
            hr = pclsObj->Get(L"NetConnectionStatus", 0, &vtProp, 0, 0);    // Win32_NetworkAdapter

            //if( vtProp.uintVal == 1 || vtProp.uintVal == 2 || vtProp.uintVal == 9 ) {
            if( vtProp.uintVal == 1 || vtProp.uintVal == 2 || vtProp.uintVal == 9  || vtProp.uintVal == 7) {  //!! nuevo , que tambien puede estar desconectado si utilzando por ejemplo el wifi

                VariantClear(&vtProp);
                hr = pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0);    // Win32_NetworkAdapter
                //wcout << "Value : " << vtProp.bstrVal << endl;
                wsprintf( macAddress, "%.128S", vtProp.bstrVal);
                VariantClear(&vtProp);

                trincoprimero = true;
            }

            pclsObj->Release();

            if (trincoprimero == true)
                break;
        }

        // Cleanup
        // ========
        
        pEnumerator->Release();
        pSvc->Release();
        pLoc->Release();

        CoUninitialize();

    La cosa es que en el paso 6 al inicializar el puntero " IEnumWbemClassObject* pEnumerator = NULL;" el programa compila perfectamente pero al depurar salta el error System.TypeInitializationException.

    He intentado de todo para solventar el problema pero no hay manera, si me pudieseis ayudar estaría muy agradecido xq mi jefe empieza a estar ya mosqueado.

    Muchas gracias de antemamo!

    miércoles, 9 de diciembre de 2015 21:22

Todas las respuestas

  • IEnumWbemClassObject *pEnum = 0;
    jueves, 10 de diciembre de 2015 13:53
  • Primero gracias por responder,

    pero lamentablemente ya he probado de inicializarlo a cero en vez de nulo, no funciona, para mi desgracia sigue saliendo el mismo error.

    Gracias de todos modos, salut.

    jueves, 10 de diciembre de 2015 14:45
  • lo inicializas de manera global?, a nivel de clase me refiero
    tienes el include?

    include Wbemidl.h

    • Editado legolas2024 jueves, 10 de diciembre de 2015 15:21
    jueves, 10 de diciembre de 2015 15:17
  • El codigo que he posteado es una función dentro de un proyecto windows forms en c++, así que no lo incializo de manera global sinó que de manera local para la función, y si que tengo el include Wbemidl.h, ampliaré un poco la información porque me parece muy extraño lo que pasa, esta función se utiliza en otro proyecto que tengo, no hice yo esa parte, y no da ningun error.

    Gracias de nuevo.

    jueves, 10 de diciembre de 2015 16:47
  • Vale, una puntualización, no parece que sea al inicializar la clase que genera el error sino que es cuando se hace el pSvc->ExecQuery(....), disculpad el error!


    • Editado Vaelgnor jueves, 10 de diciembre de 2015 23:38
    jueves, 10 de diciembre de 2015 23:26