2019年7月30日 星期二

BCB6 擷取作業系統的版本

1. 了解Windows作業系統版本的號碼 : Operating System Version
2. 針對Windows8以上版本,需要使用: Version Helper functions
3. 針對Windows8以下版本,需要使用: GetVersionExA function

以下程式顯示如何取得作業系統的版本


//---------------------------------------------------------------------------
AnsiString GetSystemName()
{
    AnsiString Name=""; //先判斷是否為win8.1或win10
    typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*);
    HINSTANCE hinst=LoadLibrary("ntdll.dll");
    DWORD dwMajor, dwMinor, dwBuildNumber;
    NTPROC proc=(NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
    proc(&dwMajor, &dwMinor, &dwBuildNumber);
    dwBuildNumber&=0xffff;
    if(dwMajor==6 && dwMinor==3)    //win 8.1
    {
        Name="Microsoft Windows 8.1";
    }
    else if(dwMajor==10 && dwMinor==0)  //win 10
    {
        Name="Microsoft Windows 10";
    }
    else
    {
        //判斷win8.1以下的版本
        SYSTEM_INFO info;       //用SYSTEM_INFO結構判斷64位AMD處理器
        GetSystemInfo(&info);   //呼叫GetSystemInfo函式填充結構
        OSVERSIONINFOEX os;
        os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
        #pragma warning(disable:4996)
        if(GetVersionEx((OSVERSIONINFO *)&os))
        {   //下面根據版本資訊判斷作業系統名稱
            switch (os.dwMajorVersion)
            {   //判斷主版本號
                case 4:
                    switch (os.dwMinorVersion)
                    {
                        case 0:
                            if(os.dwPlatformId==VER_PLATFORM_WIN32_NT)
                                Name="Microsoft Windows NT 4.0";
                            else if(os.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
                                Name="Microsoft Windows 95";
                            break;
                        case 10:
                            Name="Microsoft Windows 98";
                            break;
                        case 90:
                            Name="Microsoft Windows Me";
                            break;
                    }
                    break;
                case 5:
                    switch(os.dwMinorVersion)
                    {
                        case 0:
                            Name="Microsoft Windows 2000";
                            break;
                        case 1:
                            Name="Microsoft Windows XP";
                            break;
                        case 2:
                            if(os.wProductType==VER_NT_WORKSTATION && info.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
                                Name="Microsoft Windows XP Professional x64 Edition";
                            else
                                Name="Microsoft Windows Server 2003";
                    }
                    break;
                case 6:
                    switch(os.dwMinorVersion)
                    {
                        case 0:
                            if(os.wProductType==VER_NT_WORKSTATION)
                                Name="Microsoft Windows Vista";
                            else
                                Name="Microsoft Windows Server 2008";
                            break;
                        case 1:
                            if(os.wProductType==VER_NT_WORKSTATION)
                                Name="Microsoft Windows 7";
                            else
                                Name="Microsoft Windows Server 2008 R2";
                            break;
                        case 2:
                            if(os.wProductType==VER_NT_WORKSTATION)
                                Name="Microsoft Windows 8";
                            else
                                Name="Microsoft Windows Server 2012";
                            break;
                    }
                    break;
            }
        }
    }
    return Name;
}
//---------------------------------------------------------------------------

[+/-] 繼續閱讀...

2019年3月28日 星期四

BCB 動態載入DLL


因應Win XP to Win 7 to Win 10的驅動程式可能使用的DLL不同,所以到網路上找了一些方法來解決。

PS. 由於BCB 6.0只支援32bit的Compiler,所以作業系統也只能同時都是32bit

1. 下載工具程式,確認DLL內的Function名稱
               DLL Export Viewer


2. 編寫軟體,目前的寫法是用來判斷是不是64位元作業系統,但是因為BCB不支援64bit,所以就算可以正常載入MN200DLL_64.dll,軟體也沒辦法執行。


#include windows.h
typedef bool(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
HINSTANCE hInst;

short __stdcall (*Dll_mn_open_all)(BYTE* pNumLine);

bool IsWow64()  //判斷是不是64位元作業系統
{
    int bIsWow64=0;
    //IsWow64Process is not available on all supported versions
    //of Windows. Use GetModuleHandle to get a handle to the
    //DLL that contains the function and GetProcAddress to get
    //a pointer to the function if available.
    fnIsWow64Process=(LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process");
    if(NULL!=fnIsWow64Process)
    {
        if(!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
        {
            //handle error
        }
    }
    return bIsWow64;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    if(IsWow64())  //如果是64位元作業系統
    {
        Button1->Caption="X64";
        hInst=LoadLibrary("MN200DLL_64.dll");
        (FARPROC &)Dll_mn_open_all=GetProcAddress(hInst, "_mn_open_all");
    }
    else
    {
        Button1->Caption="X32";
        hInst=LoadLibrary("MN200DLL.dll");
        (FARPROC &)Dll_mn_open_all=GetProcAddress(hInst, "_mn_open_all@4");  //Function名稱由DLL Export Viewer裡面確認
    }

    int X=GetLastError();  //確認是否有錯誤碼
}

[+/-] 繼續閱讀...

BCB / C++ 時間相關函式




1. time :

精度只到秒,這應是最不準的計時器。

2. clock:

精度為 1/CLOCKS_PER_SEC,大多系統 CLK_TCK 為 1000,故精度為毫秒。


3. GetTickCount:

呼叫此函式時,將傳回從系統開機至當時經過多少毫秒,由於傳回值為DWORD,故最多只能計時 49.7 天

4. timeGetTime: 

此函式與 GetTickCount 解釋並無不同,但有一說 timeGetTime 精度較 GetTickCount 高,也有一說此函式實際精度只到 50ms,待查證。

5. QueryPerformanceCount / QueryPerformanceFrequency:

這應是目前精度最高之函式,精度達微秒,但在 MSDN 上亦註明,此函式若硬體不支援,將只傳回 1000,再用 GetTickCount 代替它 (如果我沒意會錯的話應為如此)。使用此函式時將較耗資源。


6. GetSystemTimeAsFileTime:

這方法較少見。FILETIME 結構體為兩個 32 位元之 unsigned integer,一個是 high , 一個是 low,所代表意義為,從 1601 年 1 月 1 日至現在時間經過了多少個 (100 ns)。精度與準度待查證。



windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime


 實際的Code,使用BCB6.0在我的i7電腦上跑出來數據如下:

[+/-] 繼續閱讀...

2018年3月18日 星期日

居家改造


一開始總覺得房間客廳能省則省,所以很多家具都是使用現有的,或是便宜的鍍鉻鐵架當衣櫥。
但是時間久了總覺得很難進行清理與清潔,因此在存了好久有點積蓄了之後,開始決定要來做點改造。


第一步:房間裡的衣櫥改成頂天立地的方式,整體規劃設計,讓灰塵不會再出現在衣櫥的上方或是下方難以清理。



第二步:客廳的部分,修改了動線,換了新的電視櫃;某天在尋找沙發的時候,發現了歐得葆家具這個MIT的公司。主打使用通過CertiPUR認證的MDI泡綿生產沙發與床墊,加上特力屋西屯店的業務員耐心的介紹,最終下手買了這組藍底白背的沙發。


在新的家具挑選過程中,不管是電視櫃或是沙發,我都希望是有高腳的版本,這樣才方便擺個掃地機器人幫忙做家事。
PS.以前的櫃子下面的縫隙塞滿了毛髮跟小玩具,要進行清潔真的是非常的麻煩。


第三步:床的部分因為舊的床墊也用了10年以上,加上常常會落枕或是腰酸背痛,所以就興起換掉他的想法。當然在坐過歐得葆的沙發之後,買床墊的時候也會想說看看他們有啥不錯的產品。

床墊的表布使用 Outlast® 雙向溫度調節材質最早是 Outlast® 與 NASA(美國航太總署)專為太空人所共同開發的技術,用來對抗外太空惡劣環境。歐得葆取得 Outlast® 專利授權,將 Outlast® 雙向溫度調節材質用在床墊床面布,可以在睡眠中減少溫差變化,整夜舒適好眠。
床墊的內部一樣採用歐洲 MDI 健康泡棉有別於市面上的獨立筒彈簧;使用整塊 MDI 健康泡棉所製成的床墊不用定期轉頭換面,不會有金屬摩擦的聲音,翻身時完全不會干擾鄰睡者,支撐度更佳,耐用度更長(保固時間長達15 年),並有耐燃認證保護您的安全。


PS.本來想要去買席夢思的,可是想到每季要做旋轉,然後保固只有3年;最後還是選擇了MIT的歐得葆。而且索性連小朋友的也一起換了。

PS2. 老媽因為睡覺時候翻下床受了傷,所以就決議把床架一起換掉。這床架挑選時考慮到四個邊要軟軟的才不怕撞傷,然後腳要升高點才方便使用掃地機器人去床底下進行清潔,所以選用了BM863這組床架。床頭的部分大家都覺得不愛,所以另外選了BM812的床頭來進行搭配。最後配色老媽選了個大花布,本來都怕成品會有點怪,不過最後看起來還真不錯的感覺。



床墊的部分一樣是使用MDI泡棉床墊,搭配內嵌式床架,整體高度才42cm,方便老媽上下床。
PS3.看完我也想要換床架了~~~

天才老媽的巧手,自己裁縫了幾塊花布當床單,跟那床頭大抱枕挺搭的。
另外把兩個舊的床墊疊在一起又生出一張新的雙人床,方便孫子們陪他睡覺。


[+/-] 繼續閱讀...

2012年6月23日 星期六

[Sarang Shop] Nature Republic Foot Therapy 去角質足膜

感覺超咕溜
夏天到了 又是涼鞋當道的季節
別忘了 腳也是很需要好好保養的喔!!
一個小時之後
你們看~~~!!原本厚厚又粗糙的角質層 不見了耶!!

用好之後只要 稍微戳一戳 再用清水洗乾淨即可
原來擺脫當灰姑娘的姐姐 是這麼簡單的事~~~~哈哈哈
 使用後第三天,根據個人體質會開始脫皮~
脫皮之後,感覺整個腳就是煥然一新,粉嫩粉嫩的唷!
 


[+/-] 繼續閱讀...

[Sarang Shop] LG護髮膜

很俏皮 可愛的包裝 讓人眼睛一亮 打開後有一股淡淡花香味 不會嗆鼻 是很舒服的味道 很貼心的附贈一頂浴帽 今天就帶大家來看看這髮膜的效果吧!


 利用洗澡時 將頭髮打濕 然後用乾毛巾將多餘的水吸乾 擠出髮膜 直接塗到頭髮上 用梳子稍微梳開 一般來說頭髮濕濕的時候 是很難將它梳開的 它會糾結在一起 硬梳它還會因此扯掉很多頭毛 可是塗上髮膜梳頭 居然不糾結 一路暢通到底耶 接著將頭髮捲成包 利用附贈的浴帽將頭髮包起來 等30分鐘之後 用清水沖掉即可........迫不及待要看看效果囉!!

 將~將~將~將~ 來看看30分鐘後的效果吧!! 在吹乾的過程 很明顯就可以感受到觸感很滑順 梳髮時 很滑順 不打結 而長期綁髮的勒痕 也明顯變淡囉!! 在家就可以輕輕鬆鬆的護髮


來看看兩天過後的不同吧!! 使用完髮膜後 我依然每天綁著馬尾 但是兩天了 居然沒有綁髮的勒痕 而且比剛用完時更滑順 (這兩天都還沒洗頭喔 也沒刻意用吹風機去吹它 一整個直順到底)   





[+/-] 繼續閱讀...

2012年6月17日 星期日

我的新加坡出差

繼上海與韓國之後,我們的機器也進入新加坡這個國家拉~
因為已經多次出國了,所以這次不像以前一樣會害怕,就是抱持平常心來這裡出差。
唯一比較害怕的就是,因為這台機器是新的Model,就怕他會出現任何問題~

樟宜機場,因為趕著出關,就沒有多待,等回家前再來逛逛囉。


 代理商老闆帶我們來吃肉骨茶,新加坡因為很多福建人,所以很多東西都是用台語(福建話)發音;肉骨茶在新加坡就是用台語發音的:Bak Koot Teh


這裡的東西都是從隔壁的馬來西亞來的,所以可以吃到超新鮮的榴槤唷~ 購買的時候,其實買3 for 10(3顆10元新幣)的那種會比較便宜,但也比較小顆;選擇用秤的真的超貴,我們吃的這一顆要價46新幣,約台幣一千出頭呢。



Singapore Flyer 號稱是全球最大的摩天輪,上去一次要價30SGD,約700台幣,轉一圈約半個小時多,要不是老闆請客,真的是不太會想上去捏。另外他有提供用餐的服務,邊轉邊吃飯的感覺不知道如何~有興趣的只要花70SGD/人就可以拉 :p


Formula 1 Night Race - Singapore Grand Prix
F1賽事,在新加坡是全球唯一一個夜間的比賽與街道賽;2012年在9月23日開賽,有興趣的可以來看看唷~
圖片是從Flyer上拍到F1起跑點



新加坡由於沒有地方儲水,所以政府把一個海灣的入口堵住,就地造起人造湖儲蓄淡水;所以現在看到金沙百貨那塊地,都是填海造陸出現的。

對於風水深信不疑的當地人,蓋房子都會算風水;著名的興達城(SunTec City) 就是由五個大樓(意指五隻手指)抓住中間的財富之泉。

由於地理位置剛好在麻六甲海峽附近,加上有馬來人,印尼人,福建人,客家人,廣東人,印度人...多國人種集聚在這裡,所以房子可以看到許多不一樣的風情;在文字上,官方用語為英文,但是公共設施上,通常會同時出現馬來文,印度文,中文跟英文四種語言。




同上,在食物方面,同時也就可以吃到來自各國的各種風味。這邊吃飯大多是在Kopi Tian(咖啡廳) 裡面,形式大概就是以一攤賣飲料(這裡都叫'水'),然後旁邊有幾攤不一樣菜色的美食街。基本上我覺得很多都不是很乾淨,畢竟這美食街的桌子都是共用的,在打掃方面沒有很落實,所以整體感覺就不優。


在消費方面,幾乎到處都是Mall,尤其是烏節路,整條路從頭到尾都是百貨公司跟賣場;
然後當地有兩個退稅的機構,好像只要可以刷卡的,就都可以退稅。最低消費金額(含稅)要超過100新幣,才可以退5~7%的貨物與服務稅
另外就是每年會有一到兩個月的GSS (新加坡特賣會),很多百貨賣場都會推出特惠組。
信用卡方面,只要是星展或大華銀行在大部分的店面都會有一點折扣;另外花旗在這邊也推得很兇,像我在Adidas買衣服用花旗卡就有額外10%的折扣。HSBC匯豐銀行的信用卡在興達城的某些店面也有10%的折扣。

所以說來新加坡買東西,最好就是帶著星展或花旗卡+GSS+GST,這樣可以獲得15%以上的折扣喔!!





[+/-] 繼續閱讀...

2011年4月23日 星期六

我的三星無限機 VS 手工皮套

前幾週看到同事用,結果我隔天就跑去神腦用網卡續約了一台三星無限機..

當然很快的,就多了一些周邊,例如座充阿、原廠送的後蓋皮套啦和USB充電插頭等

後來我發現,幾乎市面上的USB充電器都只提供了500mA的電流;可是我的Tab卻要2A的電流

難怪充了一個晚上都充不飽 =.=

然後陸續使用了GPS衛星導航功能,7"放車上導航真的很讚!!

也開啟車用藍牙功能,可以講電話,也可以放音樂,比之前的兩支Nokia的相容性都好

(說到這就很想講,Nokia不是市占率第一大嗎,為何連一個藍牙的相容性都做不好 =.=)

今天收到了一個大箱子,一看原來是我一個月前在Y購物下單的手工皮套。

包的真的很誇張,明明就是個小東西,用了一個大紙箱

紙箱裡面有一個DM,一個紙袋,還有一個紙盒子。

然後紙盒子裡面還有一個防塵套,裡面裝的才是今天的主角:Tab專用手工皮套

偽裝成筆記本了

座充塞不下裝了皮套的Tab
封面右下角有刻字

內側可以放名片唷~~

[+/-] 繼續閱讀...

2011年3月16日 星期三

我用過的數位相機

現在幾乎每個人都有一台數位相機,甚至是數位單眼,這就來看一下我用過的幾台數位相機~~


首先是我家裡的第一台數位相機:Sony MVC-FD88。大約是1999年出現在我家吧,是住美國的姑姑帶回來的。使用的儲存媒介是1.44"的軟碟,一張磁片只能存幾張照片,不過在那時候已經是很厲害了。唸書的時候,帶到學校去,結果都被Sundow借去拍社團。

Sony MVC-FD88


 後來家裡買了Fujifilm的 Z2800,用SM記憶卡。陪我渡過了大學生的生涯。
Fujifilm Z2800

用了6X小砲後,目光就放在高倍率的像機上面,所以就買了12X光學變焦的FZ-20。當時還花錢買了微距鏡和套統。還有一堆濾鏡和腳架。根本就是到了瘋狂的境界。
Panasonic FZ-20

研二的時候,有一天小白忽然拿了一台Nikon D70出來,隨便拍拍都有淺景深,害我也心癢癢的,左思右看後,買了當時水貨最便宜的Olympus E-300。當然除了價格便宜之外,柯達CCD搭配O家調配的濃郁顏色,也是吸引我的主因。當初還被唸說O家都沒啥便宜鏡頭可以用,好的鏡頭又都非常貴,可是我還是買了。

這台一直從研二到畢業,拍了許多同學的婚禮;也跟我去了蜜月旅行,最後在我家周小妹出生前掛點。雖然機器效能沒有說很好,但是真的是拍了很多很多的歷史鏡頭。

中間接過ZD 14-45mm、ZD 35mm F3.5 Marco、ZD 40-150mm、Sigma 30mm F1.4、ZD 11-22mm F2.8~3.5、FL-36、FL-50、電池手把與閃燈延長線。
Olympus E-300
在周小妹出生的前兩天,買了當時很轟動的E-P1。主要是因為他是第一台提出取消反光鏡,直接用相位對焦的可換鏡頭相機(就是不能說他是單眼)

這台相機的主要任務就是拍周小妹,對我來說是還算稱職。畢竟搭配餅乾鏡的體積比E300小太多了,每次出門都要背尿布,又不希望用小DC,當下是不二人選。
Olympus E-P1
 這台是我哥買低,因為他要當志工,需要一台對焦速度快一些的像機。可能是習慣O家的操作方式了吧,我不是很熟悉他的操作模式。
Sony a550
Sony去年推出了新一代的LiveView模式的像機,主要是採用了半透明的反光鏡,好處是可以用原本的對焦屏進行對焦,比用相位對焦或是Olympus E-System的Liveview都更快更直覺。

因為想說要試試看這樣的對焦速度,所以就買啦~~~(2011/03/12入手)
Sony a55
本來買a55前,有考慮要入手Olympus E-5,可是有鑒於E系列的LiveView都挺鳥的,相機店也不借我試試看E-5是不是有進步,最後還是買了a55。

但是防潮箱內的11-22mm還挺孤單的,二手價位也不好,所以當下就想要找一台便宜的像機來接11-22mm。剛好在DcView上看到有一台只拍了43xx張,品項非常好的E-330,當下就詢問買家,然後就衝啦~~~(2011/03/14)

這台其實在剛出來的時候,由於採用雙CCD的LiveView方式,在當時是一大突破。當時還有一堆人看衰這樣的設計,沒想到才過幾年,幾乎所有單眼都可以LiveView了 。當年我也是挺想入手的,可是37K的價位讓我狠不下心,沒想到竟然可以在最近用7.5K入手,真是太開心了~~


Olympus E-330

以下是目前躺在防潮箱內的像機 (拍攝的是a55),都快滿出來啦~~

[+/-] 繼續閱讀...

2011年1月1日 星期六

結婚紀念禮物

每年總是得要想個新的梗,去年是Burberry Trench Coat,真是有夠奢侈的,所以要想點便宜的禮物。

剛好有去上海出差,所以就噹噹噹的出現這個橘色的商標:


 很辛苦的藏在行李箱裡面,不能被發現~~內容物就是下面這隻表啦~~


查了一下官網,原來他叫做
       

以下是官方網站抓來的~~



The "H", the emblem of the House, entered the watchmaking scene in 1996. The watch is representative of the graphical purity of this perfectly balanced letter and the twelve-division dial creates the impression of a sundial.

H-our Watch, Swiss-made, quartz movement, gold-plated case with white dial, natural barenia leather strap

品牌故事:

始於1837年,Thierry Hermes開創了他的馬具製作生涯。之後,在第三代也就是Thierry Hermes的孫子手中,有了突破性的創舉,因為面臨20世紀初汽車發明的危機,馬車遭到汰換,因此Charles-Emile HERMES及Adolphe即決定將原本窄小的企業擴展至皮件系列和「馬鞍針步」的行李箱,就此開啟多元化經營旅程。

1920年代初,HERMES企業更拓展到手提袋、珠寶、皮帶、手套及筆記本、手錶、煙灰缸、絲巾等。

1951 年起,由Charles-Emile HERMES &Egrave的女婿Robert DUMAS接掌,並由另外兩位女婿一同輔助經營,他們最大的貢獻在於1960年將香水引介於世人之前,更在陸續20年後,推出領帶、西裝、鞋飾、沐浴巾、 瓷器、男女服飾等,版圖橫跨西歐、美國及太平洋。

時至今日,HERMES已成為舉世聞名之跨國企業品牌,今日體系共分三大部分,即 HERMES Sellier(皮革用品)、La Montre HERMES(手錶)及HERMES Parfums(香水),但不管從何方向切入,保留以人為本及尊重傳統手工技藝卻是亙古不變,在手錶的表現上我們更是可見一斑。


=============我是禮物分隔線====================

上面是女生的,下面是瑩如送我的:

我已經變成百寶莉控了~~


目前手上的皮夾們:
長夾:負責放不常用的會員卡之類的。
短夾:負責放現金和零錢。
名片夾:擺擺名片跟身分證還有悠遊卡。

以後可以依照需求帶出門,不用再讓口袋鼓鼓的啦。

[+/-] 繼續閱讀...