
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <Wbemidl.h> // wymagana biblioteka
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma comment(lib, "wbemuuid.lib")
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
CoInitializeEx(0, COINIT_MULTITHREADED);
if(CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
{
ShowMessage("Błąd inicjowania interfejsu WMI");
Button1->Enabled = false;
Button2->Enabled = false;
CoUninitialize();
}
}
//---------------------------------------------------------------------------
String TranslateWMI(String text)
{
String TableWMI[] =
{
"Caption", "Name", "Description", "Manufacturer", "DeviceID",
"Description", "SystemName", "SystemCreationClassName", "BIOSVersion", "Version",
"ReleaseDate"
};
String TableTranslate[] =
{
"Nagłówek", "Nazwa", "Typ urządzenia", "Producent", "Identyfikator wystąpienia urządzenia",
"Opis", "Nazwa komputera", "Klasa systemu", "Wersja BIOS'u", "Wersja",
"Wersja danych"
};
for(DWORD i = 0; i < ARRAYSIZE(TableWMI); i++)
{
if(SameText(text, TableWMI[i])) return TableTranslate[i];
}
return text;
}
//---------------------------------------------------------------------------
void WMIInfo(TStrings *lpList, String wsClass)
{
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 = "root\\cimv2";
if(pWbemLocator->ConnectServer(wsNamespace.w_str(), NULL, NULL, 0, NULL, 0, 0,
&pWbemServices) == S_OK)
{
HRESULT hres = CoSetProxyBlanket(
pWbemServices,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if(FAILED(hres))
{
ShowMessage("Could not set proxy blanket");
pWbemServices->Release();
pWbemLocator->Release();
CoUninitialize();
return;
}
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)
{
lpList->Add("");
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(!lValue.IsEmpty())
lpList->Add(TranslateWMI(String(wsName)) + ": " + lValue); // tutaj podłączono tłumaczenie
}
VariantClear(&vValue);
SysFreeString(wsName);
}
}
if(pvNames) SafeArrayDestroy(pvNames);
}
}
if(pClassObject) pClassObject->Release();
}
if(pEnumClassObject) pEnumClassObject->Release();
}
if(pWbemServices) pWbemServices->Release();
}
if(pWbemLocator) pWbemLocator->Release();
}
//---------------------------------------------------------------------------
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
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
::SetCursor(LoadCursor(NULL, IDC_WAIT));
Button1->Enabled = false;
Button2->Enabled = false;
Memo1->Lines->Clear();
Memo1->Lines->Add("• =============== [Win32_BIOS] =================");
WMIInfo(Memo1->Lines, "Win32_MotherboardDevice");
Memo1->Lines->Add("");
WMIInfo(Memo1->Lines, "Win32_DiskDrive");
::SetCursor(LoadCursor(NULL, NULL));
Button1->Enabled = true;
Button2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
::SetCursor(LoadCursor(NULL, IDC_WAIT));
Button1->Enabled = false;
Button2->Enabled = false;
Memo1->Lines->Clear();
for(int i = 0; WMIResources[i]; i++)
{
Memo1->Lines->Add("• =============== [" + String(WMIResources[i]) + "] =================");
WMIInfo(Memo1->Lines, WMIResources[i]);
Memo1->Lines->Add("");
}
::SetCursor(LoadCursor(NULL, NULL));
Button1->Enabled = true;
Button2->Enabled = true;
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1() // destruktor klasy formularza
{
CoUninitialize();
}
//---------------------------------------------------------------------------





if( wsName == "SerialNumber" )
{
if( lValue.IsEmpty() ) return "0";
return lValue;
} 
&& wsName == "SerialNumber"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
::SetCursor(LoadCursor(NULL, IDC_WAIT));
Button1->Enabled = false;
Memo1->Lines->Clear();
Memo1->Lines->Add(WMIInfo("Win32_DiskDrive WHERE Index = 0", "SerialNumber"));
::SetCursor(LoadCursor(NULL, NULL));
Button1->Enabled = true;
}


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


//---------------------------------------------------------------------------
#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);
if(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT/*RPC_C_AUTHN_LEVEL_DEFAULT*/, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ) != S_OK)
{
ShowMessage("Błąd inicjowania interfejsu WMI");
}
CoUninitialize();
::SetCursor(LoadCursor(NULL, IDC_WAIT));
AnsiString SN0;
if (MV1 == 6) {
if (MiV1 >= 0) {
SN0 = WMIInfo("Win32_DiskDrive WHERE Index = 0", "SerialNumber");
}
}
::SetCursor(LoadCursor(NULL, NULL));
return SN0;
}
extern "C" __declspec(dllexport)void Un1(void) { //zamknięcie interfejsu WMI
CoUninitialize();
}int Fn1 = SystemVer1(); //funkcja pobierająca Major Version systemu (z innej biblioteki)
int Sn2 = SystemVer2(); //funkcja pobierająca Minor Version systemu (z innej biblioteki)
AnsiString Snu1 = HDD_SN_0(Fn1, Sn2); //wywołanie funkcji z powyższej biblioteki (strjckrWMI.dll) do pobrania seriala HDD
AnsiString asaq = Form1->Caption; //pobranie nazwy aplikacji
rej1(asaq); //wywołanie funkcji, która wpisze nazwę aplikacji do formularza z innej biblioteki
rej4(); //pobranie informacji z rejestru o różnych elementach komputera (np. procesor) z innej biblioteki
ace:
if (Snu1 != NULL) {
rej5(Snu1); //wpisanie serial HDD do formularza z innej biblioteki
}
else {
goto ace;
}
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości