CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - WMI - problem z różnymi komputerami

WMI - problem z różnymi komputerami

dział ogólny

Re: WMI - problem z różnymi komputerami

Nowy postprzez polymorphism » wtorek, 14 września 2010, 11:15

  • Masz tag CPP do kodu. Użyj go, to znacznie ułatwi czytanie Twoich kodów.
  • Dałeś CoUninitialize przed użyciem WMIInfo. Tę funkcję powinieneś wywołać w momencie, gdy już nie będziesz używał funkcji i interfejsów biblioteki COM.
  • _
    Co do pobrania rodzaju błedu: przejrzalem MSDN a i tak nie zdolalem tego zrobic.

    No proszę Cię :shock: Żeby pobrać wartość błędu, nie trzeba zaglądać do MSDN-u (tzn. trzeba, jeśli chcesz się dowiedzieć, co ona oznacza). Prosiłem Cię, żebyś podał liczbę, którą zwraca ta funkcja. Wystarczy użyć debuggera, ewentualnie na msg-boxa sobie tę liczbę wyprowadzić.
  • Co to za szajs?!
    KOD cpp:     UKRYJ  
    ace:
    if (Snu1 != NULL) {
            rej5(Snu1); //wpisanie serial HDD do formularza z innej biblioteki
    }
    else    {
            goto ace;
    }      
     

    Nie można w ten sposób:
    KOD cpp:     UKRYJ  
    while(Snu1 == NULL); /* choć lepiej by było tak*/ while(Snu1 == NULL) Sleep(1);
    rej5(Snu1);
    :?:

    Chyba sam przyznasz, że jest czytelniej, nie wspominając już o tym, że z użyciem właściwego wyrażenia.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: WMI - problem z różnymi komputerami

Nowy postprzez starjacker0 » wtorek, 14 września 2010, 17:11

Biblioteka strjckrWMI.dll:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include <Wbemidl.h>
#pragma hdrstop

#pragma argsused
//---------------------------------------------------------------------------

String WMIInfo(String wsClass, String wsType)
{
 String Result = "brak wartości";

 IWbemLocator *pWbemLocator = NULL;
 if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL,
     CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator)
     == S_OK)
 {
  IWbemServices *pWbemServices = NULL;
  String wsNamespace = L"ROOT\\CIMV2";

  if(pWbemLocator->ConnectServer( wsNamespace.w_str(), NULL, NULL, NULL, 0, NULL,
     NULL, &pWbemServices) == S_OK)
  {
    if (CoSetProxyBlanket(
                   pWbemServices,
                   RPC_C_AUTHN_WINNT,
                   RPC_C_AUTHZ_NONE,
                   NULL,
                   RPC_C_AUTHN_LEVEL_CALL,
                   RPC_C_IMP_LEVEL_IMPERSONATE,
                   NULL,
                   EOAC_NONE
               ) != S_OK)
    {
      return "błąd Proxy";
    }

   IEnumWbemClassObject *pEnumClassObject = NULL;
   String wsWQL = "WQL", wsQuery = "SELECT * FROM " + wsClass;

   if(pWbemServices->ExecQuery( wsWQL.w_str(), wsQuery.w_str(),
      WBEM_FLAG_RETURN_IMMEDIATELY,
      NULL, &pEnumClassObject) == S_OK)
   {
    IWbemClassObject *pClassObject = NULL;
    ULONG uCount = 1, uReturned;
    if(pEnumClassObject->Reset() == S_OK)
    {

     while(pEnumClassObject->Next( WBEM_INFINITE, uCount, &pClassObject, &uReturned)
            == S_OK)
     {
      SAFEARRAY *pvNames = NULL;

      if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN,
         NULL, &pvNames) == S_OK)
      {
       long vbl, vbu;

       SafeArrayGetLBound(pvNames, 1, &vbl);
       SafeArrayGetUBound(pvNames, 1, &vbu);

       for(long idx = vbl; idx <= vbu; idx++)
       {
        long aidx = idx;
        wchar_t *wsName = 0;
        VARIANT vValue;
        VariantInit(&vValue);
        SafeArrayGetElement(pvNames, &aidx, &wsName);

        BSTR bs = SysAllocString(wsName);
        HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
        SysFreeString(bs);

        if(hRes == S_OK)
        {
         AnsiString lValue;
         Variant vVar = *(Variant*)&vValue;
         if(vVar.IsArray())
         {
          for(int i = vVar.ArrayLowBound(); i <= vVar.ArrayHighBound(); i++)
          {
           Variant vTmp = vVar.GetElement(i);

           if(!lValue.IsEmpty()) lValue += ", ";

           lValue += VarToStr(vTmp);
          }
         }
         else
         {
          lValue = VarToStr(vVar);
         }

        if( String(wsName).LowerCase() == wsType.LowerCase() )
        {
         if( lValue.IsEmpty() ) Result =  "brak wartości";
         else Result = lValue;
        }
       }
        VariantClear(&vValue);
        SysFreeString(wsName);
       }
      }
      if(pvNames) SafeArrayDestroy(pvNames);

     }
    }
    if(pClassObject) pClassObject->Release();
   }


   if(pEnumClassObject) pEnumClassObject->Release();
  }
  if(pWbemServices) pWbemServices->Release();
 }
 if(pWbemLocator) pWbemLocator->Release();

 return Result.Trim();
}
//---------------------------------------------------------------------------
char *WMIResources[] =
{
"Win32_1394Controller",
"Win32_BaseBoard",
"Win32_Battery",
"Win32_BIOS",
"Win32_Bus",
"Win32_CacheMemory",
"Win32_CurrentProbe",
"Win32_DesktopMonitor",
"Win32_DeviceMemoryAddress",
"Win32_DiskDrive",
"Win32_DisplayConfiguration",
"Win32_DisplayControllerConfiguration",
"Win32_DMAChannel",
"Win32_Fan",
"Win32_FloppyController",
"Win32_FloppyDrive",
"Win32_HeatPipe",
"Win32_IDEController",
"Win32_InfraredDevice",
"Win32_IRQResource",
"Win32_Keyboard",
"Win32_MemoryArray",
"Win32_MemoryDevice",
"Win32_MotherboardDevice",
"Win32_NetworkAdapter",
"Win32_NetworkAdapterConfiguration",
"Win32_OnBoardDevice",
"Win32_ParallelPort",
"Win32_PCMCIAController",
"Win32_PhysicalMemory",
"Win32_PhysicalMemoryArray",
"Win32_PnPEntity",
"Win32_PointingDevice",
"Win32_PortableBattery",
"Win32_PortConnector",
"Win32_PortResource",
"Win32_POTSModem",
"Win32_PowerManagementEvent",
"Win32_Printer",
"Win32_PrinterConfiguration",
"Win32_PrintJob",
"Win32_Processor",
"Win32_Refrigeration",
"Win32_SerialPort",
"Win32_SerialPortConfiguration",
"Win32_SMBIOSMemory",
"Win32_SoundDevice",
"Win32_SystemEnclosure",
"Win32_SystemMemoryResource",
"Win32_SystemSlot",
"Win32_TapeDrive",
"Win32_TemperatureProbe",
"Win32_UninterruptiblePowerSupply",
"Win32_USBController",
"Win32_VideoConfiguration",
"Win32_VideoController",
"Win32_VoltageProbe",
"Win32_CDROMDrive",
NULL
};

extern "C" __declspec(dllexport)AnsiString __fastcall HDD_SN_0(int MajV1, int MinV1) {    //pobiera numer seryjny dysku twardego zależnie od wersji systemu: int MajV1 - główny numer systemu (np. 5 dla WinXp), int MinV1 - podrzędny numer systemu, po kropce (np. 1 dla WinXP)
int MV1 = MajV1;
int MiV1 = MinV1;
 CoInitializeEx(0, COINIT_MULTITHREADED);


  ShowMessage(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT/*RPC_C_AUTHN_LEVEL_DEFAULT*/, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ));


::SetCursor(LoadCursor(NULL, IDC_WAIT));
AnsiString SN0;
if (MV1 == 6) {
    if (MiV1 >= 0) {
        SN0 = WMIInfo("Win32_DiskDrive WHERE Index = 0", "SerialNumber");
    }
}

  CoUninitialize();

 ::SetCursor(LoadCursor(NULL, NULL));

return SN0;
}

extern "C" __declspec(dllexport)void Un1(void)    {  //zamknięcie interfejsu WMI
  CoUninitialize();
}


Aplikacja:
KOD cpp:     UKRYJ  
void __fastcall TForm1::Rejestracja_1Execute(TObject *Sender)
{
int Fn1 = SystemVer1();
int Sn2 = SystemVer2();
AnsiString Snu1 = HDD_SN_0(Fn1, Sn2);
AnsiString asaq = Form1->Caption;
rej1(asaq);
rej4();
while (Snu1 == NULL)    Sleep(1);
rej5(Snu1);
}


Teraz ShowMessage pokazuje 0, gdy pierwszy raz (oraz bez uzywania opcji odczyt/zapis) uruchamiam rejestracje, natomiast podczas bledu pokazuje:
-2147417831

Oczywiscie serial HDD jest pobierany bez problemu i przekazywany do formularza w innej bibliotece, a nastepnie zapisywany w pliku.
Bestią jestem, by się bestią nie stać
Avatar użytkownika
starjacker0
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): wtorek, 20 lipca 2010, 11:37
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64-bit
Kompilator: C++ Builder 2010
Gadu Gadu: 0
    Windows 7Firefox

Re: WMI - problem z różnymi komputerami

Nowy postprzez polymorphism » wtorek, 14 września 2010, 17:39

No, jest tak, jak podejrzewałem - funkcja zwraca RPC_E_TOO_LATE. Błąd ten oznacza tyle, że funkcja CoInitializeSecurity została już wcześniej wywołana. Nie znam WMI, ale podejrzewam, że nie jest to błąd inicjacji sensu stricto. Po prostu zmień warunek, czyli wszystkie wartości z wyjątkiem S_OK i RPC_E_TOO_LATE niech będą błędem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
starjacker0
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: WMI - problem z różnymi komputerami

Nowy postprzez starjacker0 » środa, 15 września 2010, 08:26

Zdaje sie, ze juz wszystko w porzadku, takze z tymi oknami dialogowymi do odczytu/zapisu.
Bestią jestem, by się bestią nie stać
Avatar użytkownika
starjacker0
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): wtorek, 20 lipca 2010, 11:37
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64-bit
Kompilator: C++ Builder 2010
Gadu Gadu: 0
    Windows 7Firefox

Poprzednia strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości