2015年3月10日 星期二

DLL


動態連結檔的目的, 就只是共用程式而已, 很單純.

為什麼要共用程式? 如果某段程式, 有許多程式都要用到, 如果都直接寫在exe裡, 那麼一個程式就一份, n個程式便有n份, 使用dll便可以節省成為一份, 這樣共用程式佔用的記憶體便會比較少. 如果該dll已有別人使用, 再執行需要該dll的程式時, 便不必再將該dll重新由硬碟載入, 初始執行的時間相對地也減少. 

使用dll的另一個好處是, 可以不公開程式碼便能分享給別人使用.

*** 其他的相關知識 ***

傳統動態連結檔都可以採用靜態呼叫或動態呼叫. 靜態呼叫指的是經由.lib連結 (Linux則是用-l指定連結, 但檔名必須lib開頭). 當程式執行時, 系統會自動載入該動態連結檔.

動態呼叫是, 當程式有需要時, 才去載入動態連結檔進行呼叫. Windows是使用LoadLibrary配GetProcAddress, Linux是使用dlopen配dlsym.

Windows的.dll檔, 除了傳統的動態連結檔外, 還包括COM與.net元件檔, 這三者的程式架構與呼叫法都完全不同, 雖然副檔名都是dll, 但並不能混為一談.

對於VC++的傳統動態連結檔, 還區分為regular dll與MFC extension dll, 前者指的是可給其他程式(例如VB)使用的dll, 後者是專門給有使用MFC的執行檔使用, 兩者間還是有點差異.




2007/6/12 上午 09:15:55
VC++ DLL 網友的實作經驗如下:

靜態連結: (指的是Compiler階段就連結)
1.先把寫好的DLL compiler,compiler後會產生xxx.DLL 跟xxx.LIB,然後這兩個檔案複製到xxx.c (你的執行檔的原碼)目錄下(印象中好像只要xxx.LIB就可以了。)
2. 然後Compiler xxx.c 變成xxx.EXE。
3. 呼叫xxx.DLL內的函數的時候,直接使用原本名稱就可以了。
4.執行的時候xxx.EXE 要跟xxx.DLL放一起

動態聯結: (指的是執行階段才連結)
1.在你的xxx.c 中去呼叫API LoadLibary()方式去使用你在xxx.DLL中的函數
2.直接Compiler xxx.c 變成xxx.exe
3.把xxx.exe 跟xxx.dll 放一起才能執行。

不管哪一種連結方式,都是把一些程式碼放在xxx.DLL中,只是呼叫的方式跟Compiler方式不太一樣,有時間你自己比較一下就會知道了。

DLL的函數匯出(Export ,簡單說就是哪些函數可以被你的xxx.exe呼叫):
看你要不要使用xxx.def or 利用標頭檔 Export 你的函數,我的經驗是而使用xxx.def 方式最簡單,其他細節請參閱DLL相關說明。

P.S DLL有分成MFC DLL/一般DLL...我是初學者,剛摸沒多久,所以沒寫過MFC,所以上述是一般標準VC++ DLL方式,如有誤請前輩指正。



什麼是DLL?

DLL 是動態連結程式庫, DLL提供一種方法,讓處理序 (Process) 呼叫不是可執行程式碼部分的函式。函式的可執行程式碼位於 DLL 裡,它包含一或多個已編譯、連結的函式,並且儲存在與使用它們的處理序不同的地方。 例如, 我們開發的Canvas, Gesture Handler, Rubik's Cube...等一些應用程式, 都會利用OTMUT.dll來開發Touch/Gesture的相關功能。 這有助於提升程式碼重複使用及有效率的記憶體使用量。

應用程式和 DLL 之間的差異?
雖然 DLL 和應用程式都是可執行程式模組, 但是它們在許多方面卻是不同。對使用者而言,最明顯的差異在於 DLL 不是可以直接執行的程式. 從系統觀點來看,應用程式和 DLL 之間有兩個基本差異: 
  • 應用程式本身可以同時在系統中執行多個執行個體,而 DLL 只能有一個執行個體。
  • 應用程式可以擁有如堆疊、全域記憶體、檔案控制代碼 (File Handle) 和訊息佇列等,而 DLL 則不含這些
動態連結與靜態連結的差異?

動態連結(Dynamic Link Libraries)允許可執行模組 (.DLL 或 .EXE 檔) 只包含在執行階段時用來找出 DLL 函式可執行程式碼的所需資訊。
在靜態連結(Static-Link Libraries)中,連結器 (Linker) 會從靜態連結程式庫取得所有參考函式,並且將它與您的程式碼一起放入可執行檔,它的內容除了程式設計者所設計的程式碼之外,還包含了所使用程式庫的程式碼,所以其檔案變得相當大。

http://support.microsoft.com/kb/815065/zh-tw

DLL 的優點

  • 使用較少的資源
    當多個程式使用相同的媒體櫃的函式, DLL 可以減少重複的程式碼, 會在磁碟上及實體記憶體中載入。 這會大幅影響效能的執行在前景, 不只是程式還 Windows 作業系統上正在執行的其他程式。
  • 模組化結構升級
    DLL 有助於提升開發模組化的程式。 這可協助您開發大型的程式需要有多個語言版本或需要模組化結構的程式。 範例的模組化的程式是帳戶程式有許多可在 Run Time 動態載入的模組。
  • 簡化部署和安裝
    當函式在 DLL 內需要的更新程式或修正程式, 部署和安裝的 DLL 不需要程式, 以與 DLL 重新連結。 除此之外, 如果多個程式使用同一個 DLL, 多個程式將所有獲益更新或修正程式。 當您使用協力廠商 DLL, 定期更新或修正這個問題的發生原因, 是更頻繁地。


在 Windows 作業系統中的檔案:
  • ActiveX 控制項 (. ocx) 檔案
    ActiveX 控制項的範例是行事曆控制項, 可讓您從行事曆中選取一個日期。
  • 控制台 ] (cpl) 檔案
    cpl 檔案的範例是一個項目是位於 [ 控制台 ] 中。 每個項目都是特定的 DLL。
  • 裝置驅動程式 (drv) 檔案
    範例的裝置驅動程式是印表機驅動程式, 以控制列印至印表機。

DLL 相依性

當程式或 DLL 會在另一個 DLL 中使用的 DLL 函式時,會建立相依性。
  • ActiveX 控制項 (.ocx) 檔案
  • ActiveX 控制項的一個例子是可讓您從行事曆選取日期的行事曆控制項。
  • 控制控制台 (.cpl) 檔案
  • .Cpl 檔案的範例是位於 [控制台] 中的項目。
這些動作通常稱為 「 DLL 衝突。




在系統檔案中,有一種類型的檔案常常被各種程式所使用,而且當程式發生錯誤時,也常常會顯示這類檔案的訊息。這個檔案就是DLL檔。當程式出現問題時,我們可能常常會看到類似這種訊息:「xxx.dll發生錯誤,請關閉程式或洽系統管理人員」。

DLL的全名為Dynamic Link Library,一般翻為「動態連結資料庫」。它是系統中的一種「公用檔」,可以視為作業系統與許多應用程式的「共用材料」。當某個DLL發生問題時,所有必須使用這個「共用材料」的程式功能就無法順利執行,然後就可能出玩上述那種錯誤訊息。Windows含有一大堆各式各樣的DLL檔,它們所執掌的功能,大多屬於各種程式所常見的功能,例如當我們在任何程式中開啟視窗時,都會看到相同的外觀(例如它們的右上角都有三個分別代表「縮小」、「放大」、「關閉」的按鈕),操作方式也都相同,這就是Windows內建的標準DLL元件之一,任何程式想要執行視窗的開啟功能時,只要呼叫這個元件來執行即可。同樣,例如對話框、按鈕等常見的必備功能,都是由相關的DLL檔案來負責。

事實上,Windows可以看成由許DLL檔所組成的一套作業系統,這種方式可以讓作業系統容易開發與擴充,例如當作業系統相要對原有功能予以強化或加入一些新功能時,只要對舊有的DLL檔予以更新,或加上新的DLL檔即可,不必重撰寫整套程式碼,節省許多時間與複雜度。

這種做法不僅可以簡化作業系統本身的開發與擴充工作,對任何應用程式的開發而言也較方便。因為開發者可以專注在自己的特定功能,其他一 些Windows環境的標準功能,就交給作系統去負責即可。

此外,這還有一種好處,就是使用者不論使用任何程式,都會接觸相同的基本操作方式,不必每次都重新學習新的操作方法,否則若每個程式都有自己獨特的操作方式,那使用者鐵定受不了。

DLL不僅負責許多基本功能,它還負責一些特定應用的常見功能,例如在Internet環境中,就有一個相當知名的Winsock.dll檔來負責Internet環境中兩台電腦之間的底層溝通。

DLL會出問題,常常發生在兩種情形,一種是某個程式「秀逗」時,它所用到的DLL檔也連帶被系統鎖死,無法被其他程式所用使用,當這個DLL檔屬於核心檔案時,就可能導致一連串的錯誤,甚至當機。

另一種則是DLL檔的版本錯誤。由於功能的不斷強化,各種DLL檔都會常常更新。在更新作業系統時,新版的DLL檔會取代舊的,而在應用程式的安裝過程中,也會出現這種新版取代舊版的情形。當程式在安裝過程中,偵測出系統中已經擁有較新的版本時,一般都會出現訊息告知使用者,並建議保留新版,但若您不小心反而用舊版取代新版時,則日後如果有其他程式也要用到這個DLL時,就可能發生問題囉!

Windows dll 遺失


網站:DLL-files.com

如何將下載好的.dll檔加入電腦?
下載後的檔案是 ZIP 壓縮檔,你必須先解壓縮並將 .dll 檔複製到Windows系統目錄。
通常是 C:\Windows\System (Windows 95/98/Me), 
C:\WINNT\System32 (Windows NT/2000), 或
C:\Windows\System32 (Windows XP) 。
你也許要將 dll 檔放到應用程式指定的資料夾內,
若使用上述的方式還無法解決問題,你可能就必須使用 regsvr32 ,方法如下:
  1. 點選開始 -> 執行
  2. 輸入 CMD 後按下確認
  3. 輸入 regsvr32 “檔名.dll” 然後在按下確認。這樣做就能解決問題。
如果要尋求更多的線上支援服務,可以在 DLL-files.com 的 Live Support 系統註冊。

如果.dll要覆蓋的時候出現檔案使用中或無法覆蓋怎麼辦?
不用急,你可以試著先重新開機,然後在開機時按F8進到安全模式,在安全模式裡再做一次檔案覆蓋,應該就可以覆蓋過去了。
備註:通常會遺失或毀損的dll檔都是放在windows資料夾中的system32中。



2014年12月11日 星期四

DOS指令

設定組態檔位置C:\【config.sys】


md \a\b\c\d 建多層目錄
copy C:\a.lrc + C:\y.txt D:\Folder
move C:\a.txt D:\b.txt /-Y : 提示是否覆蓋
DIR介紹 #Dir microsoft 說明
print a list of the folders and subfolders of a directory to a file.
I only need the folders and sub folders.
dir /s /b /o:n /ad > f.txt

DIR /4 
顯示檔案清單以列出目錄中的檔案及子目錄
DIR /S /A:-D /B /O:N > list.txt
DIR /? 說明
說明指令/? 或執行 help 



Linux相似架構可參考鳥哥
檔案架構
沒有 C:\,取而代之的是根目錄 / ,下面有 /etc, /usr, /mnt, /boot, /home家目錄 等等,可以把任一個指定資料夾分到任一磁碟分割區,如 / 分到第一個分割區, /home 分到第二個分割區,這樣下次重灌不用再備份資料。 
權限 
分為rwx
Linux 的權限是很複雜的,尤其多了一個要有可「執行」權限才可執行程式。 
正規表示法
用來處理字串的方法,幾乎可以處理大部份的問題
指令查詢
除了 /? 、-h 、--help 的方法, Linux 還多了 man 的指令,如可用 man echo 查詢 echo 的用法。 
文字編輯
內建命令列的文字編輯器 vi 有很多指令要記但很重要

參考

簡單的DOS 指令

CMD 命令速查手冊

命令提示字元 00:教學目錄

How do i get a list of folders and subfolders without the files

[CMD] 目錄與檔案管理常用指令

Netbeans之tomcat部署 Deployment error: Starting of Tomcat failed. '127.0.0.1' 不是內部或外部命令、可執行的程式或批次檔

測試netbeans要添加外部tomcat


一直失敗搞了兩天,終於找到解決的方法

如果跑測試時出現錯誤


Deployment error: Starting of Tomcat failed. 
log檔有跑到
ContextListener: contextDestroyed().......
在netbeans啟動tomcat視窗中出現
'127.0.0.1' 不是內部或外部命令、可執行的程式或批次檔。
('127.0.0.1*' is not recognized as an internal or external command)

確定tomcat單獨執行是沒有問題的,但在netbeans無法順利部署
解決方法:

在tomcat中編輯 bin/catalina.bat

拿掉原本JAVA_OPTS字串的雙引號""
例如
:noJuliConfig
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"
......

:noJuliManager
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"
改成
:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%
.. ....

:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%


再跑一次測試OK

來源:

Error starting Tomcat from NetBeans - '127.0.0.1*' is not recognized as an internal or external command

網路停用IPv6

window 8 停用IPv6
不需要IPv6可以在控制台>網路>網路和共用中心>網際網路>內容>取消勾選IPv6
過程可參考:

How To Disable IPv6 On Windows 7


其他參考:
Disabling IPv6 in Microsoft Windows 8 and Server 2012

2014年12月8日 星期一

neabean 安裝新版本jdk移除舊版本, jdkhome對照路徑找不到

如果更新jdk後,移除在安裝netbean一併安裝的舊版本jdk,或者安裝時路徑的更動
會導致netbean找不到jdk來源,開啟時會跳出類似下列訊息

Cannot locate Java installation in specified jdkhome:
C:\Program Files\Java\jdk1.8.0_20
Do you want to try to use default version?
解決方法:找到安裝目前jdk路徑(或者找不到趕快安裝)
C:\Program Files (x86)\Java\jdk1.8.0_25後
到netbean安裝目錄C:\Program Files\NetBeans 8.0\etc\netbeans.conf
編輯這個檔案內的jdkhome位置
netbeans_jdkhome="C:\Program Files\Java\jdk1.8.0_20"
改為netbeans_jdkhome="C:\Program Files (x86)\Java\jdk1.8.0_25"

參考:
NetBeans “Cannot locate java installation in specified jdkhome”?

2014年12月7日 星期日

blog搬家參考

目前用blogger來寫練習程式的筆記,
(點這裡看其他文章寫blogger原因Five reasons I recommend daily blogging (even if you disagree))
雖然blogger是最容易上手功能也很像word一樣簡單
但是總覺得版面看得很不順眼哪~
最近打算改用wordpress來寫blog
bloger幾乎成了顯學, 如何編輯一個blogger的資源實在很多,
常見blog平台:
1.blogger
2.wordpress
3.Tumblr.
4.ghost(有人介紹)
5.痞客邦(台灣)
6.微博(大陸)
7. Live Journal(俄國)
其他適合用來架站的還有: Joomla! , Drupal
(好文推THE Best Places to Start a Blog (Updated 2014 Edition))
recommended-blogging-resources/

Ghost 是比較後來推出的平台,有人寫了PK文可以參考看看個人需求

WordPress vs. Ghost – Which Blogging Platform Is Right For You?

wordPress還蠻多人寫中文的架站教學文可以參考




One idea of Computer Technology Trend


I want to apologize I might express not good, but I try my best in the words.

so far as I know google only for crawler from pages of every web site on the internet.
but how about the information through system or the apps ?
Think that one day we don't need to type a lot word into your computer in front of the table.
we can do more like siri, make a virtual reality that time . And we don't wanna a search bar, we want some more anthropocentric that can interact with people. something call automation.
I think this concept occurred in lots of movies ,like in the movie of Resident Evil there is a little robot girl which is a computer can communicate with you.

but Steve Jobs create this possibility, I think so far only little people knew what he was doing is "one little step for man one giant leap for mankind". I think he foresee this great change of computer technology, but what he cannot do is the technique all we have enough technique fulfill this big step for now. so Steve Jobs choose take a little step to lead human forward a least before he died, pretty smart guy right?
What I really want to mention is, I know I'm not the first or only one to think about this.
That's why I want to share this here.With the limitation I know,I believe this rudimentary idea might be down in some way in near future. I present here for I know some will accomplish it or maybe in decades I'm able to make it.



If  you have anything for discussion ,I glad to know your opinion. :)