2009年7月5日 星期日

不用說我愛妳! 妳也能感受的到, 因為我們是親兄妹

http://mqjing.blogspot.com/2009/07/blog-post.html

月有陰晴圓缺, 人有聚散離合.  人生就是這樣, 天下沒有不散的宴席, 我們總有一天會面對父母離開自己.

我一直認為, 有兄弟姊妹的好處是到緊要時刻到的時候, 可以多一個人一起分擔傷痛. 這樣的道理推演至自己的生兒育女觀念上, 也會希望自己的孩子在人生的旅途上, 多一個伴侶.

 在人生中, 我能 給予孩子無可取代的人生禮物是: 兄弟姊妹.

可是我卻忘記了一件事: 除了父母之外, 你有幾個兄弟姊妹, 當他們走的時候, 你就會傷心幾次

我不是其他動物, 不知道動物有沒有七情六欲. 我是人 … 我深深地知道什麼是感覺.

我們一起搶東西, 打架, 一起出去玩, 妹妹總是喜歡當跟屁蟲.
每次吃東西時,  她都吃雙份, 而我總是被打的那個.

但是我真的感謝我的父母讓我擁有有兄弟姊妹, 我非常的幸運, 我擁有兄弟姊妹.

大家走的時間都不一樣….. 我討厭人生是這樣. 我討厭這樣的人生. 

我愛妳, 哥哥不用說我愛妳. 妳也能感受的到,  因為我們是親兄妹!

哥哥祝妳健康快樂.

                                                                              畢業口試前, 交大自動化資訊實驗室.

2009年7月4日 星期六

[程式設計] 把修正好的程式碼合併到目前工作副本 – svn merge

http://mqjing.blogspot.com/2009/07/svn-merge.html

老實說, 我不太敢作 svn merge!

因為 source code 實在太重要了, 特別是要合併兩個不同的 source tree.


當時的直覺反應是:
[若沒有仔細瞭解 merge 的機制, 絕對不要動它.] 我擔心會搞爛整個 source tree.

後來才知道, 原來只要不 commit, 怎麼亂搞都不會出事  ^_^

 

緣起

當有一天你要同時管理 3 個以上的專案時, 同步管理專案的問題就會出現. 例如:  A 專案修正後的程式碼, 想要同時讓 B 與 C 分享.


我們的問題可以分類成:
1. 少於 10 行而且集中在一起的程式碼: 直接手動把你要的部分, 複製到想要被更新的專案中, 這樣最快.

2. 當修正的程式碼, 散佈在多個檔案而且多個位置: 這時候與其他專案的同步修正, 就會是一個問題.

我遇到了 case 2! 而且我的組員還不斷地新增程式碼.


心理障礙

主要是 B 和 C 的程式碼已經有各自的功能了, 不能直接把 A 的 code 複製進去.
必須先把有修改的程式檔找出來, 找出需要修正的段落, 然後把適當的程式填進去.

這樣須要花費巨大的比對與校正心力, 為了解決專案同步的問題, 我還使用一個 Excel 檔記錄專案之間, 有哪些 bug 的修正還沒同步.

通常做完這些修正後, 我都會找 Larry 一起去買香雞排.


面對問題

其實我是標準程序的守護者, 我善於寫文件.

我寫文件的重點是:[創造一個不需要我的工作環境],


我希望任何人無論你是高手還是初學者, 只要拿到文件, 就能做的和我一樣. 而且有效率的完成工作.

根據這樣的理念, 所以最好的文件是不用文件, 一切都用批次作業自動完成.

我總是認為如果我花費太多時間在某件困難的事物上, 那就表示這件事有必要寫份文件或自動化, 讓我花的時間不用重複的浪費.


手冊越簡單越好

我希望連沒有 svn 觀念的人, 只要按照手冊描述的步驟就能完成.

通常我認為步驟若超過 7 個以上, 那就表示這份文件太複雜了, 有必要修改文件內容.
基本上,

我喜歡看到 4 個步驟就完成的工作項目. 第四個步驟的內容是 Enjoy!


請放心

merge 改的是你硬碟中的程式工作副本(working copy), 除非你 commit, 否則不會改到 repository.

如果你發現你的工作副本已經一團亂了, 直接下 revert 即可將整個 source code 恢復原狀


把修正好的程式碼合併到主線最簡單的步驟

其實只要閱讀一下 help, 我們就可以大概瞭解 merge 的功用了

Step 1: 進入 cmd.exe

Step 2: set LANG=en (if you don’t, 你可能會遇到一堆數字的亂碼)

Step 3: svn help merge

merge: Apply the differences between two sources to a working copy path.

意思就是把兩個 source 的差異部分合併到目前的工作副本中

所以若要將修改前與修改後的程式碼, 全部合併到目前的工作副本中, 那麼作法很簡單


Step 1: 點選要接受合併的 working copy

例如: 我們希望把 branch source tree 的解決 bug 片段, 也放到 trunk source tree 中. 作法只要在 trunk 目錄上點選滑鼠右鍵選Merge即可.

01_choose_working_copy

 

Step 2:  Merge Type 選 “Merge a range of revision”, 在裡面指定修改前與修改後的 branch source 版本號碼.

02_type1

  a. 選擇已經除錯完成的 branch source tree

03_Merge  

    b. 選擇在 branch source tree 中, 哪個 bug 片段要被取出來.

         例如: 我們只想取出 Bug2 修正後的片段, 進行合併

         作法如下: [Revision range to merge] ->[Show log]

choose_bug_fixed

Step 3: 點選 [Next], 然後 [Merge], 就會將你在 branch 修改過的程式碼, 合併到指定的 working copy.

merge_final 

Step 4: 完成, Enjoy.

 

合併的結果
狀況 1: 若你選擇的程式碼中, 修正的部分剛好你的 working copy 版本也改了. 這時候就會發生衝突. (這種情況很常發生, 所以你要會用小烏龜解衝突!)

conflict01

我們在這時候出手, 選擇哪一部份程式碼是你要的修正, 那一部份是不要的.

(小烏龜可以幫你快速找出要改的地方, 幾乎可以不用鍵盤的改衝突)

 

狀況 2: 在你選擇的程式碼中, 剛好修正的部分可以完全鑲入你的 working copy.

merge_ok

 

合併完成後的檢查

Step 1: 合併後, 在你的 working copy 中有檔案變動時, 檔案會變成紅色驚嘆號.

Step 2: 執行 diff (小烏龜滑鼠右鍵), 觀察程式碼片段中的每項更改是否為你想要的.

abc

Working copy 狀態: 左邊是原來的, 右邊是目前更新的內容

Step 3: 處理完後, 在小烏龜 diff 視窗左上角, 點選 save 完成手動合併工作. 接者取下一個驚嘆號檔

Step 4: commit 修改後的 working copy.

 

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

命令列的作法:

有一個主線, 為了修一個 bug 建立另一個分支.  現在 bug 已經修正完畢, 如何將修正後的 code 合併到主線的 working copy 呢?

作法如下:
Step 1: 先執行 cmd.exe, 並且切換到主線的 working copy 中.

Step 2: 查出發現 bug 之前的那段起始號碼

svn -log [分支的 svn source tree] (查詢開始修改 bug 前的版本號碼)

Step 3: 只合併修改 Bug 的部分到目前所在的 working copy 中

svn merge -r [修改 bug 前的號碼]:HEAD [分支的 svn source tree]

Step 4: 主線即擁有你修改的 bug.

 

Enjoy!

by Jing.

2009年6月28日 星期日

[生活] 我清醒的時間有多久? (五年前的文章)

http://mqjing.blogspot.com/2009/06/blog-post.html

這是一篇我在 Eastshare 論壇發表的回文(最初原稿節錄), 是我五年前的自己.
現在讀起來像是在解析與回顧我的生命歷程.

感謝 Eastshare , 陪我度過一段了苦澀的人生旅程, 雖然站長們都不認識我, 卻是一個能讓我大放厥詞的好地方.

請見諒文章的不通順

文章開始 (最初草稿並且節錄的版本)

選擇

時間: 2004 年 9 月 24 日 凌晨 2:25 分

地點: 靠近新竹中華大學附近的宿舍

我遇到了選擇的問題.... 且頭痛不已. 選擇作自己呢? 還是要當別人的眼中的自己.

感覺讀書讀到一定的程度,也花了大半輩子的時間唸書
,但是對自己想要追求的人生一點幫助也沒有.

痛苦了好幾個月... 很難想開.... 後來還想到人生的意義.... 快不快樂的問題(問自己什麼叫做快樂?) 等問題.

[做一些現在不做, 將來 10 年 20 年之後會後悔的事情]

這樣對嗎? 什麼事情有那麼重要?

我想只有當親人真正要離開自己後, 在回憶中體驗後悔的感覺,

這種滋味才真正不好受.

選擇是很困難的事情, 尤其是要短時間做決定更是困難.

不知道你有沒有注意到:

人生其實並不短暫, 有時候我反而覺得人生很長.

當我在看電影時,兩個小時很快就過去了,睡覺六個小時一下子就過去了.

但是要我安安靜靜的兩個小時,時間就好像停止一般.

有時候沒有必要要逼自己短時間作決定.

問自己

我最近常常自己問自己,

我今天到底活了多久, 我清醒的時間有多久?
這不是以一天 24 小時來計算, 而是我真實的感受"自我"的時刻有多久?
在自我控制下, 覺察到自我的時間有多久?

隨時察覺"自我"

不否認, 不讓自己的心思被大量事情淹沒 對我來說很困難.
所以我常常會會鬼混一陣子,還不自覺.

也因此我寫紙條放在桌上,讓我

時時提醒自己. 讓真實的感受"自我"的時刻越久, 就活的越久這個道理.

隨時察覺"自我" , 可以讓我更專心與更有效率的處理事情. 也讓我知道我在做什麼?

雖然我不是什麼成功人士,但我知道我真實的活著,這個事實.
而且也認真的過每一小時.

就好像寫這篇回文一樣.
把自己的想法累積起來. 收藏起來.
因為對我而言,這是一種累積的動作.

我盡量做到

我知道我在做什麼. 不會讓我在往後因為做了什麼而後悔.

每當有所察覺自我時, 就會發現"時間的感受"有很大的不同. 有時候,回頭想想

自己真的花了很多時間在做沒有累積性的事情上.

當然, 我也常常渾渾噩噩的過了一天.

時間存在於心中

當我沒有抓住自己或根本忘了自己時, 根本就沒有時間這東西.
這也就是我們常常覺得"時間過得很快","一天就這樣過去" 的原因

認真的過每個分鐘每小時, 就不會覺得時間很快.

還會發覺時間很多.

有計畫地浪費生命

知道自己後,然後就可以有計畫的去浪費時間,在美好的事物上(廣告詞借用一下)
有計畫的使用時間, 讓自己更專心也知道目的前進.
有計畫的做一個 Feeling 的設計者, 製造讓別人體驗的美好經驗, 讓別人覺得世界美好.

我思故我在, 是不是就是這個道理呢?

我不知道,

但我知道的是
沒有自覺自己的生活,
就會像行屍走肉般的生活. 很容易就會覺得一天過的很快.

如果真實的感受自我,就會比較容易選擇自己的選擇並且忠於自己的選擇.

以上是我對付日子過的很快的方法也是我看了"可可"的文章感想.

 

by Jing.

老實說: 五年前的我想的還真多, 看來五年後我還是一樣不長進.


其他我寫的文章

[1] 綠草如茵, 陽光如此的燦爛, 2006/12

2009年6月15日 星期一

[程式設計] 自動產生說明文件 Doxygen: Visual Studio add-in

http://mqjing.blogspot.com/2009/06/doxygen-visual-studio-add-in.html

image

自動產生程式碼的文件, 我在之前的文章 [1] 中已經提到可以使用 Doxygen. 甚至連數學公式都可以用 Latex 描述, 真厲害.

可是呢…我討厭背東西,

尤其是還要我弄 Doxygen 的格式, 用滑鼠與鍵盤敲出那一堆 *, 真是暈倒. 一定有程式能幫我自動產生 Doxygen 的模版, 答案就是

DoxyComment add-in for Visual Studio

(Visual Studio 2005 與 2008 都支援)

先閱讀:

[程式設計] 為你的程式自動產生說明文件 -- Doxygen

 

在哪裡?

http://doxycomment.sourceforge.net/vs2005_addin.html

 

怎麼用?  (2 steps)

Step 1: 把滑鼠移到你要加註解 function 的前面

doxy_code                   (上面的程式碼: <stdafx.h> 請改成 “stdafx.h”)

 

Step 2: 移動滑鼠到左上方的 Toolbar, 選擇 Add Code Comment

doxy_add_code_comment

Step 3: 然後就會變成這樣

doxy_code2

 

選擇其他的 comment style

Step 1: 到 Visual Studio 上面的 menu 選擇 [Tools] –> [Options…]

doxy_option_menu 

Step 2: 選擇 [DoxyComment]

doxy_option

你可以調整簡單的 comment style .

例如:

             FirtLineTag 改成 JavaDoc Style. 如 /**

更多的格式參考: http://www.stack.nl/~dimitri/doxygen/docblocks.html

 

 

Reference

[1] “[程式設計] 為你的程式自動產生說明文件 – Doxygen,”Aug, 2007.

2009年5月30日 星期六

[生活] 在台灣用手機臨時打國際電話的方法

http://mqjing.blogspot.com/2009/05/blog-post.html

snap003

幾天前, 突然要打國際電話解決一些事情, 可是宿舍與實驗室都沒辦法直接打電話出國,  我不認為系辦會讓我打國際電話.

嗯… 只好打電話給中華電信 (0800-080-100) 求救, 沒想到用手機打國際電話是這麼簡單的事情.

有的時候, 真的是自己想太多了.

 

最簡單解答

 任何一台公共電話 solution:

     Step 1: 很簡單, 直接到 7-11 買一張國際經濟電話卡, 我買的面額是 300 元

    Step 2: 卡片後面用硬幣刮開, 卡號與密碼

     Step 3:  到國內任何一台公共電話, 打國際電話

                      a.  輸入: 0800-080-180

                      b.  輸入 1 (中文導引) + 輸入卡號與密碼

                      c.  輸入對方號碼

                            009+國碼+區碼+對方的電話號碼+ #字號

                            若對方留的是手機, 則作法如下:

                                                        009+國碼+對方手機號碼+ #字號

          ex: 台灣打大陸手機的例子:

                   009+86(大陸國碼)+15022799xxx (大陸手機號碼 11 碼) +#字號

手機 solution (建議的方法):

A. 儲值與設定 (2 steps)

     Step 1: 買國際經濟電話卡, 並在後面取得卡號與密碼

     Step 2: 將電話卡的錢儲值到你的手機

                    a.  輸入: 0800-080-280

                    b.  輸入 1 (中文導引) + 輸入卡號與密碼

                    c. 儲值完成

B. 手機打國際電話

     Step 1: 0800-080-280

     Step 2:  輸入 1 (中文導引)

     Step 3輸入對方號碼: 009+國碼+區碼+對方的電話號碼+ #字號

                       對方留的是手機, 則作法如下:

009+國碼+對方手機號碼+ #字號

      ex: 台灣打大陸手機的例子:

                   009+86(大陸國碼)+15022799xxx (大陸手機號碼 11 碼) +#字號

Enjoy!

by Jing.

 

延伸資訊

[1] 中華電信服務電話: 0800-080-100, http://www.cht.com.tw/PersonalCat.php?CatID=467

2009年5月26日 星期二

[C++] How to Build XmlLite Application

http://mqjing.blogspot.com/2009/05/c-how-to-build-xmllite-application.html

Step 1: set up the include directory

    [C/C++]->[General]->[Additional Include Directories]
    => "$(WSDK_DIR)Windows\v6.0\Include"

include

Step 2: set up the library directory
       a.  [Linker]->[Input]=> xmllite.lib

link_Input
        b.  [Linker]->[General]=>"$(WSDK_DIR)Windows\v6.0\Lib"

link

 

Reference

[1] http://msdn.microsoft.com/en-us/library/ms752863(VS.85).aspx

2009年5月1日 星期五

[軟体] 如何產生 certification 文件, 用來 sign 你的軟体

http://mqjing.blogspot.com/2009/05/certification-sign.html

基本上自己認證自己的 certification 文件是沒意義的, 就好像是一個陌生人, 拿著一張自製的證件, 告訴你他是好人, 你會信嗎?

所以一般而言, 我們通常會找一家認證的公司, 由它提供給我們認證文件. 接著我們用這個認證文件來 sign 軟体. 當散佈到網路上時, 由下載的人自行到公正的單位對你的軟体進行驗證.

舉例來說: 一個陌生人拿一張證件告訴你他是好人, 我們到警察局去驗證這張證件的真偽, 然後藉由相信警察局, 而相信這個陌生人是好人.

 

故對於軟体在網路上流通, 為了避免被人竄改, 一般軟体公司會去一家認證公司 (例如: verisign), 驗證身份, 繳年費後,  搭配指定的密碼, 取得認證檔 pvk 與 spc 檔.

有了這兩個檔, 你就可以用 signtool 簽署你的軟体了. 而使用者的軟体會自動連到已知公正機關檢查認證是否為真, if yes, 然後放心讓使用者繼續安裝軟体.

 

至於有沒有一家認證公司可以提供 Opensource 軟體, 免費的 certification 文件呢? 我記得有, 可是這還得仰賴高手的幫忙. 請高手出面說明一下吧. ^_^

 

有人問我: [如果要產生自己的 pvk 與 spc 自己玩, 也就是發行自己認證的 certification, 那該怎麼做呢?]

很簡單, 四個步驟

只不過你軟体裡面的證件, 沒有在公正的地方登記, 瀏覽器 (ex: IE) 會警告使用者.

Step 1:  建立自己認證自己的 certification 文件

指令:

     makecert -sv mykey.pvk -n "CN=Jing Software Inc." mycert.cer

產生文件:
        mykey.pvk
        mycert.cer

 

Step 2:  轉成工具能使用的 Software Publisher Certificate format

指令:

    cert2spc.exe mycert.cer mycert.spc

產生文件:

    mycert.spc

 

Step 3:  組成 pfx 文件 (PKCS #12)

指令:

    pvk2pfx.exe -pvk mykey.pvk -pi <password> -spc mycert.spc 
                              -pfx mycert.pfx -po <password>

例如:
     pvk2pfx.exe -pvk mykey.pvk -pi demo -spc mycert.spc
                                -pfx mycert.pfx -po demo

產生文件:

          mycert.pfx

 

Step 4: 簽署你的軟體

   signtool.exe sign /f mycert.pfx /p <password>
                             /t <timestamp URL> /v "<file to be signed>”

    例如:

      signtool.exe sign
             /f mycert.pfx
             /p demo 
             /t http://timestamp.verisign.com/scripts/timstamp.dll
             /v "<file to be signed>”

   

Enjoy!

by Jing.

 

延伸閱讀

[1] 井民全, “[Plugin] 如何為你的 ActiveX 元件 (cab 檔) 加入數位簽章 – signtool,” http://mqjing.blogspot.com/2009/03/plugin-activex-cab-signtool.html, 2009/03.

2009年4月27日 星期一

[程式設計] 裝了 IE8 後 Vistual Studio 2005 出現 Script 問題--解決

http://mqjing.blogspot.com/2009/04/ie8-vistual-studio-2005-script.html

症狀:

裝了 IE8 後, 在 Visual 2005 使用 新增 function 精靈, 會跳出下面錯誤視窗.

 

snap

下面是 Visual C++ Team Blog 提出來的解決方法, 我整理如下.

發生的原因我大致翻譯了一下, 如果要知道詳細情況請參考 Some VS2005 and VS2008 Wizards Pop Up Script Error.

原因  (這是翻譯, 正確性與我的程度相關, 如果有錯請來信提出修正)

VC++ 精靈裡面實作了一個介面 (IInternetSecurityManager),
這個介面實作了允許或不允許特別的動作在某些 polices, 而這些 polices IE 會 query 這些 polices.

若核心程式不在 ieplore.exe process 中被執行時,
在 IE8 中, 一個特製的 Security Manager 現在也會 query 一個稱為 URLACTION_ACTIVEX_OVERRIDE_REPURPOSEDETECTION 的 policy.

可是在IE7 與過去的版本並不會去委派(delegate) 這個 policy,

因此造成了過去的精靈可以執行,可是安裝 IE8 後, 卻導致 IE 引擎失敗.

我們正在調查IE8的這項設計上的改變並且進行這項問題的修正, 可能是修改精靈的設計或者是從 IE 的元件設計著手.

 

解法: 設定 registry 繞過這個問題

Step 1: 開啟 regedit.exe

regedit

Step 2: 在

“HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Internet Settings\Zones” 下輸入一個新的 Key 稱為 1000

         a) 新增 Key = 1000

 newkey

      1000

        b) 設定一個新的 entry

             Name=1207
             Type=REG_WORD
             Data=0x000000

dword

     1207

 

     Step 3: 完成

 

 

Reference

[1]  Visual C++ Team, “Some VS2005 and VS2008 Wizards Pop Up Script Error, “ http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx, 2009/3/28.

2009年4月22日 星期三

[文章] 深入探討 Vista User Account Control 的文章

http://mqjing.blogspot.com/2009/04/vista-user-access-control.html

Vista 引進了比較嚴謹的程式存取限制, 這導致在 Vista 下的使用者必須強迫使用 “管理者身份” 執行我的程式.

我不希望這樣, 所以就有了下面的文章.

 

本文內容包含

     1. Kenny Kerr 的文章: UAC 原理 (重點整理)

          * 系統提醒使用者是否需要系統管理者權限執行的流程

          * 如果不論程式的相容性與 manifest 如何,
              我就是要 elevation 我的程式, 該怎麼做?

          * 如何知道我現在的執行權限是不是 elevation?

     2. Understanding and Working in Protected Mode Internet Explorer
          重點整理

           * 如何知道目前我的程式是否處於 IE 的 Protected Mode?

           * 那檢測結果確實發現我的 ocx 在 IE 的 Protected Mode 下,
               那我該怎麼存取我的設定檔?

           * 可是我就是要把資料存到 User Profile 怎麼辦?

           *  Michael Dunn 提供的程式範例 [3]

 

開始!

snap003 Kenny Kerr 先生在 2006 年9 月發表了一篇有關 Vista User Account Control 的精彩文章.

 Windows Vista for Developers – Part 4 – User Account Control  

內容包含

  1. 介紹如何使用 CreateRestrictedToken 建立一個 Token
  2. 詳細解說 Vista 新功能 User Account Control 對程式的影響與運作機制
  3. 介紹如何建立一個 Token, 使得擁有該 token 的程式不能 restart, sleep, shutdown 你的電腦

             * 利用剛剛建立的 token 讓你的電腦完全不能關機

                (藉由修改 Explore.exe 的執行權限)

             如何讓公共的電腦限制執行權限 ? 我想答案應該在這裡吧.

    4. 你可以指定 child process 的 integrity levels (我翻譯成執行層級, 比較好理解)

      5. 他提供了一個例子, 讓 notepad.exe 只能開檔但是不能存檔.

VERIFY(::CreateProcessAsUser(duplicateToken,
                             L"C:\\Windows\\Notepad.exe",
                             0, // cmd line
                             0, // process attributes
                             0, // thread attributes
                             FALSE, // don't inherit handles
                             0, // flags
                             0, // inherit environment
                             0, // inherit current directory
                             &startupInfo,
                             &processInfo));

 

其他的重點摘要:

* 一般程式執行層級是 Medium, 而經過使用者允許過後的程式 token 執行層級是 High. 注意: IE 的 token 執行層級是 Low

* 你可以用 Mark 先生發表的軟体 Process Explorer 中, 看到每個 process 

    的執行權限層級 (開啟 integrity level 選項).

(Process Explorer 的執行狀況圖)

* 我們可以用 GetTokenInformation 得知目前 process 的 integrity level (順便驗證一下你的 ocx 在 IE 7 下的 integrity level是不是 Low)

 

 

系統提醒使用者是否需要系統管理者權限執行的流程

     Step 1:  當使用者點選需要系統管理需求的程式執行時

     Step 2: ShellExecute 呼叫 CreateProcess 建立新的 process, 隨後

                    CreateProcess 接手檢查這個 process 的相容性等工作

    Step 3: 若發現需要 elevation(系統管理者權限), 而呼叫的人沒有elevation

                   則 CreateProcess 回傳 ERROR_ELEVATION_REQUIRED

     Step 4: ShellExecute 發現這種狀況, 則交給 Application Information

                     Service 處理顯示提示視窗, 並且執行該需要 elevation 的程式.

 

 

如果不論程式的相容性與 manifest 如何, 我就要 elevation 我的程式的作法

<sol>  使用 runas 指令  (XP 就有這個指令了)

範例:

::ShellExecute(0, // owner window
               L"runas",
               L"C:\\Windows\\Notepad.exe",
               0, // params
               0, // directory
               SW_SHOWNORMAL);

 

 

 

如何知道我現在的執行權限是不是 elevation?

<sol>  呼叫 IsUserAnAdmin  即可

 

 

 

另外下面是 “Understanding and Working in Protected Mode Internet Explorer” [2]  的重點整理

1. 如何知道目前我的程式是否處於 IE 的 Protected Mode?

<sol> 呼叫  IEIsProtectedModeProcess

 

那檢測結果確實發現我的 ocx 在 IE 的 Protected Mode 下, 那我該怎麼存取我的設定檔? (LocalLow)

<sol> 當你程式被執行在 IE Protected Mode (low integrity level), 那麼你的 ocx 可以寫入 %userprofile%\AppData\LocalLow 目錄下面. 利用 SHGetKnownFolderPath 搭配 FOLDERID_LocalAppDataLow 可以取得這個目錄的位置.  (注意: 這段是 Vista 相關, 所以你的 ocx 必須要判斷作業系統而決定呼叫)

程式碼範例:

SHGetKnownFolderPath(FOLDERID_LocalAppDataLow, 0, 
NULL, szPath, ARRAYSIZE(szPath));

 


我們可以用上面的知識, 得知 low integrity level 的 process 可以自由存取放在  LocalLow 中的內容.


可是我就是要把資料存到 User Profile 怎麼辦?


<sol> 這個情況大多是你的 ocx 紀錄使用者設定檔資料.


        詳細的作法如下 (3 steps): 會跳出視窗提醒使用者


        Step 1: 先在 LocalLow 裡面建立你的設定檔
                      (用 IEGetWriteableFolderPath )


        Step 2: 呼叫 IEShowSaveFileDialog, 這個 function 是用 medium


                        integrity context 中執行, 會提醒使用者我們要存東西到其


                        他目錄.


        Step 3: 然後用 IESaveFile 把你的檔案放過去.


 


 Michal Dunn 文章 [3] 在他的文章也列出使用範例


// Step 1:  取出 Protected Mode 情況下可以存取的目錄
                     先把東西存過去

LPWSTR pwszCacheDir = NULL;// 暫存空間目錄
TCHAR szTempFile[MAX_PATH] = {0};//暫存空間中完整檔案路徑
hr = IEGetWriteableFolderPath (FOLDERID_InternetCache,
&pwszCacheDir );
if(S_OK !=hr) return FALSE;
// 在 cache 目錄中建立暫存檔, 放我們的設定檔
GetTempFileName ( CW2CT(pwszCacheDir), _T("bob"),
0, szTempFile );
CoTaskMemFree ( pwszCacheDir );
// 然後存檔到暫存空間 (szTempFile) …
 
// Step 2: 跳出視窗, 由使用者選擇目標目錄. 
HRESULT hr;
HANDLE hState;
LPWSTR pwszSelectedFilename = NULL;
const DWORD dwSaveFlags =
OFN_ENABLESIZING | OFN_HIDEREADONLY |
OFN_PATHMUSTEXIST |OFN_OVERWRITEPROMPT;


hr = IEShowSaveFileDialog (
m_hWnd, L"Saved log.txt", NULL,
L"Text files|*.txt|All files|*.*|",
L"txt", 1, dwSaveFlags, &pwszSelectedFilename,
&hState );

if ( S_OK != hr )
MessageBox(_T("IEShowSaveFileDialog 出問題”));

 


// Step 3:  最後用 IESave 存到目標目錄

hr = IESaveFile ( hState, T2CW(szTempFile) );
if(S_OK!=hr)
IECancelSaveFile ( hState );//出問題,取消存檔
else
DeleteFile ( szTempFile ); // 清除在 cache 中的暫存檔
 
如果我的 ocx 會呼叫其他執行檔工作, 該怎麼辦?
<sol> 告訴 IE 你要執行的 EXE 是可以信任的並且不要彈出視窗.
作法是: 在 
HKLM\Software\Microsoft\Internet Explorer\Low Rights\ElevationPolicy
下面, 建立一個新的 key. 並且包含 3 項資料.
AppName: 你的執行檔名稱. (例如: abc.exe)
AppPath: 執行檔位置
Policy: 這裡設定為 3
 
 
 

其他細節, 請參考延伸閱讀中他們的文章.


by Jing.


 


 


延伸閱讀


[1] M. Russinovich, “Inside Windows Vista User Account Control, “ http://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx, 2007,7.


[2] M. Silbey and P. Brundrett, “Understanding and Working in Protected Mode Internet Explorer, “ http://msdn.microsoft.com/en-us/library/bb250462.aspx#wpm_fliwl,  2009, 2.


[3] M. Dunn, “A Developer's Survival Guide to IE Protected Mode, “ http://www.codeproject.com/KB/vista-security/PMSurvivalGuide.aspx, 2007, 5.

2009年4月2日 星期四

[C++] 如何用 gcc 編出 library 讓其他人使用-- DLL

http://mqjing.blogspot.com/2009/04/c-gcc-library.html

若要看懂別人寫的 Makefile 內容, 最簡單的學習路徑可能是自己寫一個來玩玩看. 我們的環境是 Cygwin (Linux-like environment for Windows).

Makefile 簡單規則你可以參考 Ref[2], 這份文件內容專注於如何建立 static library 與 share library.

 

 文章內容

        1. 如何建立 static link  的程式庫

       2. 如何 link static 程式庫

       3. 如何建立 dynamic link 的程式庫

       4. 如何 link 動態連結程式庫

 

開始

// 函式標頭檔  (fun.h)

int add(int a,int b);

// 我們的函式  (fun.c)

int add(int a,int b){
    return a+b;
}

// 使用 library 的範例  (main.c)

#include <stdio.h>
#include "fun.h"

void main(){
    printf("1+2=%d",add(1,2));
    getchar();
}

 

1. 如何產生 static library 呢? 兩步驟完成

      Step 1: 先編成 .o 檔  (注意: –c )

       指令:  gcc –mno-cygwin –c 副程式(.c)

        例如:

                 snap003

      (-mno-cygwin 指令說明請參考 [3])

         Step 2: 用 ar 指令組合成 static library. 
                                                                         (注意: 你的程式庫一定要加 lib名稱)

                     -r:  新增 fun.o 到 libfun.a 中

                      -c:  建立新的程式庫

                      -s:  將一個 object 檔的 index 寫入程式庫

        指令ar rcs lib程式庫名稱 a.o b.o c.o

        例如:

snap003

2. 如何 link 你的程式庫?

指令:  gcc –mno-cygwin –static 測試程式.c –L程式庫位置  -l程式庫名稱

            (注意: 程式庫名稱不用加 lib, gcc 會自動抓有 lib開頭的程式庫檔)

例如:

// ---------- main.c -----

#include <stdio.h>
#include "fun.h"

void main(){
    printf("1+2=%d",add(1,2));
}

snap003

 

3. 如何產生 share library 呢?  (在 Windows 稱為 DLL)

     Step 1: 使用 gcc 的 –fPIC 指令產生相對索引位址的程式碼

     例如:

snap003

(注意: 剛好我的平台 –fPIC 會被忽略, 不管  我們還是最好加上參數)

 

   Step 2: 建立 DLL 檔 (使用 share 指令, Wl 後面接的是 link 指令)

                    注意: 你的程式庫名稱必須是 lib 開始

   指令: gcc –shared –Wl –o lib程式庫.dll 一堆fun.o

   例如:

snap003

 

4. 如何 link 剛剛產生的程式庫?

     直接用 –l 即可連結 (不用加 static)

指令: gcc –mno-cygwin 測試主程式.c –L程式庫位置 -l程式庫

            (注意: 程式庫名稱不用加 lib, gcc 會自動抓有 lib開頭的程式庫檔)

     例如:

snap003

 

Enjoy.

by Jing

 

References

[1]  Creating a shared and static library with the gnu compiler [gcc], “http://www.adp-gmbh.ch/cpp/gcc/create_lib.html“.

[2] GNU make Makefile 最簡單說明, “http://mqjing.blogspot.com/2007/08/mingw.html, “ 2007, 8.

[3] 如何在 Cygwin 下編出 Windows 可以直接執行的 code, “http://mqjing.blogspot.com/2009/03/c-cygwin-windows-code.html, “ 2009, 3.

 

 

English

If you want to understand what’s going on of a project’s Makefile, a possible way is to write it by yourself.

For Makefile rules, you can refer a document in [2].  Here, we focus on how to make a static/share library under Cygwin (Linux-like environment for Windows).

 

Contents

        1. How to create a static linked library?

       2. How to link a static library?

       3. How to create a shared library?

       4. How to link a shared library?

    

Let’s do it.

// fun.h

int add(int a,int b);

// fun.c

int add(int a,int b){
    return a+b;
}

// main.c

#include <stdio.h>
#include "fun.h"

void main(){
    printf("1+2=%d",add(1,2));
    getchar();
}

 

1. How to create a static linked library? (Two steps)

     Step 1: at first, build object files (.o files)   (Note: –c )

      Command

gcc –mno-cygwin –c Your_Function_Files (.c)

       Ex:

                 snap003

      (-mno-cygwin: please refer the ducument [3])

         Step 2: using ar instruct to create your libarary archieve.  
                           (Note: Your library name must begin with “lib”)

                      -r:  increasing the fun.o to libfun.a

                      -c:  create a new library

                      -s:  write a object file index to libfun.a

        Command:

  ar rcs libYourLibraryName a.o b.o c.o

        Ex:

snap003

2. How to link a static library?

Command:

             gcc –mno-cygwin –static Main.c –LYourLibraryLocation  -lLibraryName

              (Note: The LibraryName without “lib” prefix string).

Ex:

// ---------- main.c -----

#include <stdio.h>
#include "fun.h"

void main(){
    printf("1+2=%d",add(1,2));
}

snap003

 

3. How to create a shared library?  (If your are in Windows, this is a DLL library)

     Step 1: you must use –fPIC argument to generate independent code

     Ex:

snap003

(Note: In my system, the –fPIC is ignored. However, we should add this argument to ensure everything is ok).

 

   Step 2: Next, create a DLL file.

You can use a simple argument, shared, to tell gcc generating a DLL library. I given an example shown as below where the command followed the Wl is the options used for linker.

(Note: your library name should be named begin with “lib”).

                   

   Comm: gcc –shared –Wl –o libYourLibraryName.dll fun.o

   Ex:

snap003

 

4. How to link a shared library?

     It is simple. Directly use –l  (no static).

 

     Comm: gcc –mno-cygwin Main.c –LLibraryLocation –lYourLibraryName

     (Note:  without prefix string “lib” in your library name to reference the library file)

     Ex:

snap003

 

Enjoy.

by Jing

 

References

[1]  Creating a shared and static library with the gnu compiler [gcc], “http://www.adp-gmbh.ch/cpp/gcc/create_lib.html“.

[2] GNU make Makefile 最簡單說明, “http://mqjing.blogspot.com/2007/08/mingw.html, “ 2007, 8.

[3] 如何在 Cygwin 下編出 Windows 可以直接執行的 code, “http://mqjing.blogspot.com/2009/03/c-cygwin-windows-code.html, “ 2009, 3.