Navigation




Как скомпилировать TChromium на C++ Builder XE

Для создание приложения со встроенным браузером понадобится Delphi и C++ Builder XE.
Исходники проекта Chromium Embedded Framework здесь.
Пример использования компоненты на Delphi на русском здесь.
Для компиляции в среде C++Builder необходимо скачать:
CEF4Delphi.zip - из этого архива нужно открыть проект Delphi (CEF4Delphi-master/packages/CEF4Delphi.dproj), нажать правой кнопкой на CEF4Delphi в окне Project Manager. Сначала Build, как только закончится - Install
cef.zip - этот архив нужно будет поместить в папку скомпилированной программой (путь до проекта/Debug/Win32/)
Project1.zip - сам проект на C++ Builder - открыть и скомпилировать

Как выполнить любой запрос WMI на C++ Builder XE

#define _WIN32_DCOM
#include 
using namespace std;
#include 
#include 

//---------------------------------------------------------------------------
void GetWmiInfo(TStrings *lpList, wchar_t* wsQuery)
{
    HRESULT hres;
    // устанавливаем контекст бехопасности
    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
    );

    IWbemLocator *pWbemLocator = NULL;    // провайдер WMI
    // инициализируем провайдера
    if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) {
        IWbemServices *pWbemServices = NULL;    // обьект, которому будем скармливать запрос (целевая машина)
        wchar_t* wsNamespace = (L"ROOT\\CIMV2"); // пространство имён
        // подключаемся к целевой машине
        if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK){
            IEnumWbemClassObject *pEnumClassObject = NULL; // энумератор записей
            wchar_t* wsWQL=(L"WQL"); // язык запросов WQL
            //wchar_t* wsQuery=(L"select * from WIN32_diskdrive");//+wsClass; // сам запрос к классу
            // выполняем запрос
            if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK){
                // параметры для перебора коллекции записей
                IWbemClassObject *pClassObject = NULL;
                ULONG uCount = 1, uReturned = 0;
                if(pEnumClassObject->Reset() == S_OK) { // ?????????
                    int iEnumIdx = 0;
                    hres = pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned);
                    // перебираем колекцию
                    while( hres == S_OK) {
                        lpList->Add("---------------- ["+IntToStr(iEnumIdx)+"] -----------------");
                        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 s;
                                    Variant v = *(Variant*)&vValue;
                                    if(v.IsArray()){
                                        for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++){
                                            Variant a = v.GetElement(i);
                                            if(!s.IsEmpty()) s+=", ";
                                            s+=VarToStr(a);
                                        }
                                    } else {
                                        s = VarToStr(v);
                                    }
                                    lpList->Add(AnsiString(wsName)+"="+s);
								}
                                VariantClear(&vValue);
                                SysFreeString(wsName);
                            }
                        }
                        if(pvNames)SafeArrayDestroy(pvNames);
                        iEnumIdx++;
                        hres = pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned);
                    } // конец по WHILE
                    if(hres != S_OK) lpList->Add((hres&0xFFFF));
                } // конец по pEnumClassObject->Reset()
                if(pClassObject)pClassObject->Release();
            } // конец по выполнению запроса
            if(pEnumClassObject)pEnumClassObject->Release();
        } // конец по подключению
        if(pWbemServices)pWbemServices->Release();
    } // конец инициализации провайдера
    if(pWbemLocator)pWbemLocator->Release();
}
	 Memo1->Lines->Add("================== [WMI WQL] =================");
	
	wchar_t* ss=(L"select * from WIN32_diskdrive");
 //	wchar_t* ss=(L"SELECT * FROM Win32_Process where name='notepad.exe'");


	GetWmiInfo(Memo1->Lines, ss);
	Memo1->Lines->Add("");

здесь полный список всех таблиц Win32...