2010年6月4日 星期五

Qt Windows Mobild on Qt Creator

Qt Windows XP Path [C:\Qt\2010.02.1]
Qt Windows Mobile Path [C:\Qt_embedded\wince4.5.3]

以Qt Windows XP下的範例[C:\Qt\2010.02.1\qt\examples\widgets\digitalclock]示範
將digitalclock.cpp,digitalclock.h,main.cpp,digitalclock.pro
複製到C:\Qt_embedded\wince4.5.3\workspace\digitalclock\

C:\Qt_embedded\wince4.5.3\workspace\digitalclock>qmake -tp vc -o digitalclock.vcproj
使用Visual studio 2005開啟剛剛建立的digitalclock.vcproj即可

qmake -tp vc的錯誤

在做.pro轉換到Visual studio project的轉換中如果target路徑不在Qt的路徑下,則可能會出現如下錯誤

D:\workspace\spinboxes>qmake -tp vc
WARNING: Unable to generate output for: D:/workspace/spinboxes//Makefile.Debug [TEMPLATE vcapp]
WARNING: Unable to generate output for: D:/workspace/spinboxes//Makefile.Release [TEMPLATE vcapp]
如果要解決如下問題,設定下列環境變數,便可解決
D:\workspace\spinboxes>set QMAKESPEC=win32-msvc2005

2010年6月2日 星期三

QT for windows Mobile6+visual studio 2005

step 1 .軟體準備
1.Visual studio 2005 Professional
2.ActiveSync 4.5
3.Windows Mobile Professional 6.0 SDK
4.Qt for Windows Mobiles此處所使用的版本為 qt-embedded-wince-opensource-src-4.5.3.zip
關於Qt的各個平台版本 可以到下列網址去下載
http://ftp3.ie.freebsd.org/pub/trolltech/pub/qt/source/
詳細的官方說明 http://doc.trolltech.com/4.5/install-wince.html

Step 2. 安裝
1.將上述軟(1,2,3)安裝完後,並將qt-embedded-wince-opensource-src-4.5.3.zip解壓到 C:\Qt_embedded\wince4.5.3
2.將路徑"C:\Qt_embedded\wince4.5.3\bin"加到windows XP的環境變數PATH中 "ControlPanel->System->Advanced->Environment variables"
3.執行Configure C:\Qt_embedded\wince4.5.3\configure -platform win32-msvc2005 -xplatform wincewm60professional-msvc2005 其中的-xplatform選項可以參考C:\Qt_embedded\wince4.5.3\README,此版本共有下列選項可選,此處約花10min

wince50standard-x86-msvc2005
wince50standard-armv4i-msvc2005
wince60standard-armv4i-msvc2005
wincewm50pocket-msvc2005
wincewm50smart-msvc2005
wincewm60professional-msvc2005
wincewm60standard-msvc2005
4.設定環境變數,可以用setcepaths這個script來完成
C:\Qt_embedded\wince4.5.3\setcepaths wincewm50pocket-msvc2005

5.nmake ...這邊大概要花2 Hour以上...

2008年1月24日 星期四

Member Initialization List

Member Initialization List

常常有人搞不清楚example 1 & example 2的效果有何差異,在大多數的情況下,此兩方法的結果相等,
然而在某些情況下,變不一樣.因此往往也會有暗藏陷阱存在.
對於example 1而言,此方法稱之為在建構式中賦予值(assignment),此時對Class data member來說早已
執行過其construct,因此此時不過是在付予值而已,所以對_name=""變顯得沒必要.
對於example 2而言,此時期Data member尚未逕行Initialization,所以此時寫在:之後的都是指定
成員函數所使用的construct


1.在進行member initialization,其initialiation的順序是根據Class內的member順序而來,而非在
Initialization所指定的順序
2.每一個data member只能Initialization 一次
3.另外,對於兩種資料型態const ,reference 兩種值,因為要在事先必須付予值,所以就必須要採用
member initialization的方式指定值,而不是在事後的construct中賦予值


參考:C++ primer 3/e

Template

2007年11月29日 星期四

C++ Builder 通過 WMI 獲取系統信息

C++ Builder 通過 WMI 獲取系統信息

Victor Chen, (C++ 愛好者)


--------------------------------------------------------------------------------
WMI: Windows Management Instrumentation (Windows 管理工具)
通過 WMI 可以獲取主板、BIOS、磁盤、顯卡、網絡等幾乎所有的系統信息。
利用這個工具可以管理本地或客戶端系統中幾乎所有的信息。
很多網絡管理工具都是基於WMI開發的。在 Windows NT/2000/XP/2003 都有這個工具, 在 Windows 98 裡面可以選擇安裝這個工具。

--------------------------------------------------------------------------------
BCB 的 WMI 庫文件 wbemuuid.lib 由本站提供, 包含在本頁下面的程序源碼下載裡面

--------------------------------------------------------------------------------
1 初始化 COM 接口:
訪問 WMI, 必須先初始化 COM 接口, 在程序的一開始調用 CoInitialize(NULL); 初始化, 在結束時調用 CoUninitialize(); 釋放資源。
這兩個函數在 #include 裡面定義。

2 獲取訪問 WMI 權限:
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
如果這個函數返回 S_OK 獲取權限成功, 否則為失敗。

3 通過 IWbemLocator 和 IWbemServices 這兩個 COM 接口訪問 WMI, 獲取系統信息:
這個函數的參數: lpList 返回信息, wsClass 為要查找的系統信息類, 這些 COM 接口在



#include < wbemidl.h > 裡定義。

void GetWmiInfo(TStrings *lpList, WideString wsClass)
{
IWbemLocator *pWbemLocator = NULL;
if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
{
IWbemServices *pWbemServices = NULL;
WideString wsNamespace = (L"root\\cimv2");
if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
{
IEnumWbemClassObject *pEnumClassObject = NULL;
WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
{
IWbemClassObject *pClassObject = NULL;
ULONG uCount = 1, uReturned;
if(pEnumClassObject->Reset() == S_OK)
{
int iEnumIdx = 0;
while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == 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++;
}
}
if(pClassObject)pClassObject->Release();
}
if(pEnumClassObject)pEnumClassObject->Release();
}
if(pWbemServices)pWbemServices->Release();
}
if(pWbemLocator)pWbemLocator->Release();
}
//---------------------------------------------------------------------------

// 通過 WIN32_bios 獲取 BIOS 信息:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Add("================== [WIN32_bios] =================");
GetWmiInfo(Memo1->Lines, "WIN32_bios");
Memo1->Lines->Add("");
}

--------------------------------------------------------------------------------

WMI 可以訪問的信息類型有:
Win32_1394Controller
Win32_BaseBoard
Win32_Battery
Win32_BIOS
Win32_Bus
Win32_CacheMemory
Win32_CDROMDrive
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

以上類型(字符串值)通過前面寫的函數 GetWmiInfo 可以得到相應的信息, 例如 GetWmiInfo(Memo1->Lines, "WIN32_bios");