java建站
老魏建議學習php建站,這樣成本低,而且速度快,上手難度也低。
php建站程序可用的太多了。常見的是wordpress,帝國cms,dedecms,phpcms等等,這類的程序數不勝數。這里不一一例舉了。
這些都可以叫 CMS建站系統。
wordpress的很多主題都支持移動端自適應,主題會自動檢測當前訪問客戶的是PC端還是移動端,並且提供不同的主題形式,很方便。
現在使用第三方php面板搭建環境,然後上傳建站程序,安裝,域名解析到伺服器ip上,去建站面板中添加域名,就可以通過域名訪問網站了。雲主機上面安裝第三方一鍵php包的配置。好在國人也開發了這方面的面板,可以免費的使用。藉助這些 php面板,可以輕松配置php環境,mysql資料庫,phpmyadmin、nginx等環境軟體。
B. 問題:建動態網站(java)需要學那些
1,前台展示 語言:html,css(樣式),javascript(頁面腳本),jsp(動態網頁,這個重要)
前邊的是基礎的 JSP是Java特有的 動態網站前端展示
2,語言:Java 沒什麼特別需求 Java基礎就夠了,
3,網站程序:servlet 基礎的 ,不含有任何框架的。
以後 為了方便可以採用 SSH 框架。
以後 可能用到dwr jquery等等。
4,資料庫部分 :mysql Oracle 等等 ,用來存數據的。
網站 就是前段 頁面發起請求 servlet接受請求(或者struct框架) Java處理業務 去資料庫檢索數據 然後做出響應返回數據到 頁面展示。
代碼:
搜 javaweb項目實例、JavaEE項目實例 有的是 去網路文庫呀挑一個下載一下就好。
C. Java網站系統建設有什麼好處
1、開發成本低廉,Sun公司免費提供用來開發Java應用程序的一切,您不必付任何的版稅,這意味著您在為自己的公司建設網站時,找了一家公司,如「環球信息」幫您建站,那麼您 只需要為您的網站代碼跟空間買單而並不需要涉及其他方面的費用。
2、跨平台,「一次編寫,隨處運行」,Java系統可以運行在不同的操作系統和硬體上。隨著Linux的持續增長以及Mac OSX完全支持Java技術,跨平台的特性變得越來越有分量。
3、資源佔用較少,Java系統中,你可以任意申請內存,Java系統會在適當的時候自動釋放無用的內存資源。這個神奇的機制叫做「垃圾回收」,節約了許多調試錯誤的時間,也減輕了伺服器的負擔。
4、企業應用的成熟平台,CIO視角重點圍觀,Java技術的企業應用旨在提升企業競爭力,所以Java技術受到了企業的欣賞,市場份額是同類技術中最大的。同時,Java是開放標准,所以供應商眾多。市面上有許多的應用伺服器、工具與構件可以選擇,從高端的BEA WebLogic、IBM WebSphere等商業軟體,到Tomcat、JBoss等開源的免費工具,一應俱全。
5、可靠性和安全性,相信這一點也是眾多公司的CIO所關注的事情,畢竟自己的網站關繫到公司的利益,Java最初設計目的是應用於電子類消費產品,因此要求較高的可靠性。Java雖然源於C++,但它消除了許多C++不可靠因素,可以防止許多編程錯誤。首先,Java是強類型的語言,要求顯式的方法聲明,這保證了編譯器可以發現方法調用錯誤,保證程序更加可靠;其次,Java不支持指針,這杜絕了內存的非法訪問;第三,Java的自動單元收集防止了內存丟失等動態內存分配導致的問題;第四,Java解釋器運行時實施檢查,可以發現數組和字元串訪問的越界,最後,Java提供了異常處理機制,程序員可以把一組錯誤代碼放在一個地方,這樣可以簡化錯誤處理任務便於恢復。
由於Java主要用於網路應用程序開發(網站建設等),因此對安全性有較高的要求。如果沒有安全保證,用戶從網路下載程序執行就非常危險。Java通過自己的安全機制防止了病毒程序的產生和下載程序對本地系統的威脅破壞。當Java位元組碼進入解釋器時,首先必須經過位元組碼校驗器的檢查,然後,Java解釋器將決定程序中類的內存布局,隨後,類裝載器負責把來自網路的類裝載到單獨的內存區域,避免應用程序之間相互干擾破壞。最後,客戶端用戶還可以限制從網路上裝載的類只能訪問某些文件系統。
D. 用java建一個c2c網站平台。不知道是自己學習java建站, 還是外包好
要學習的東西,包括JAVA基礎,JAVA WEB,資料庫SQL,還有前端的HTML、CSS、JAVASCRIPT,如果你有編程基礎的話,從學習到建站,大概8-12個月,如果沒有編程基礎的話,時間更長。如果你單純是想運營個網站的話,個人建議你外包。如果你是想學技術的話。。當然是自己做。
你可以網路一下,想飛社區,這是我業余時間做的網站,JAVA做的。。也做了好久。
E. 學製作網站需要多少JAVA知識
製作網站可以學習一些框架,Java的有struts/tapestry/..., Ruby的有rails,Python的有Django,PHP的有CakePHP。這些框架都有很好的文檔以及實例。
對於Java,推薦PlayFramework(http://playframework.org)。這個框架吸收了ROR (Ruby On Rails)等一些優秀設計,簡單優美。討論組的響應也非常快。唯一的問題是文檔都是英文的,討論組(http://groups.google.com/group/play-framework)也只能使用英文
F. java 搭建網站怎麼搭建框架最好
最好不要用java,一是java比較煩,效率也算不上高,二是java的空間比較貴。最好直接到網上下載一個模板,然後根據自己的需要適當的修改一下。這樣布局也比較美觀,比較省時省力。最好用asp頁面+access資料庫。這種模板很多,而且有很多免費空間。
java一般做的都是大型的商業項目。如果你是想練手的話可以用ssh框架。如果是建站,勸你不要用java。
G. 我想學用JAVA建網站,應該怎麼學
Java是一門涵蓋比較廣的編程語言,自學起來相對比較困難,網上有視頻資料,可以下載來看,下面我把Java入門需要學的一些東西做一個整理,僅供參考,有問題的話可以繼續問我。
第一階段:JavaEE初級
JDK的下載安裝配置、Eclipse開發工具介紹、Java基本程序的編譯運行、關鍵字、標示符、注釋、常量、變數、數據類型、進制轉換、數據類型轉換、各種運算符的使用、各種判斷循環語句的使用、函數的使用、數組的使用
面向對象入門、用Java來描述對象、局部變數和成員變數、Java對象內存分析、匿名對象、封裝、構造函數、Main函數詳解、繼承、重寫、抽象類、介面、多態、內部類、異常、包機制、JAR包
StringBuffer類、Date和Calendar類,System類、Runtime類、Math類,正則表達式、基本數據類型包裝類
集合類(Collection)、List、ArryList、LinkList、Vector、迭代器、Set、HashSet、TreeSet、LinkedHashSet、Map、HashTable、HashMap、TreeMap、泛型等各種數據集合的分析和使用
異常處理、多線程基礎、IO系統、網路編程、Java反射機制、Java註解、JavaSE 8.0新特性SVN介紹、SVN服務端的安裝及使用、SVN客戶端的安裝及使用、SVN團隊開發注意事項
第二階段:JavaEE進階
認識Web前端、常見標簽及用途、選擇器及分類、浮動、定位、表格和表單、HTML進階、HTML5基礎、HTML5新技術特點WebSocket、地理定位、canvas
CSS的作用、CSS的各種選擇器、行內樣式、內部樣式、外部樣式、選擇器及樣式的優先順序問題、盒子模型、層的浮動、游覽器調試工具的使用、採用DIV+CSS設計頁面
BOM瀏覽器對象模型、DOM文檔對象模型、JS操作CSS、JS操作DOM、JS操作DIV、protoype、js基於對象編程
jQuery基本技術、jQuery使用插件、jQuery EasyUI、jQuery mobile
Bootstrap基礎知識、Bootstrap預定義的CSS樣式、Bootstrap內置的布局組件、Bootstrap支持的JavaScript插件、Less、Sass、Chart.JS、Two.JS、實際使用Bootstrap
MySQL5.5/5.6資料庫、navicat客戶端軟體,基本建表、插入數據、修改數據、查詢數據操作、數據備份與移植
JDBC連接MySQL資料庫,CRUD操作
XML的概念與基本作用、XML的基本語法、XML的約束模式、DTD、Schema、名稱空間。XML解析介紹、DOM4J解析XML、XPath的使用
HTTP協議詳解,Web伺服器的工作原理、Tomcat的安裝與啟動運行、Tomcat的體系結構、在Tomcat中配置Web虛擬目錄與發布Web應用程序的方式、設置目錄的默認網頁、使用Tomcat配置虛擬主機、WAR文件生成與使用
安裝使用MyEclipse進行JavaEE程序開發和調試,以及和Tomcat的集成
什麼是Servlet、Servlet接收客戶端請求信息、Servlet響應客戶端信息、Servlet的生命周期、Servlet過濾器和AOP編程;Servlet監聽器
什麼是JSP、JSP的內置對象、透析JSP的本質、JSTL+EL、JSP內置對象與狀態管理
Tomcat和JDBC連接池配置、JDBC的事務、JSP整合進行分頁,條件查詢
MVC核心思想、MVC基本入門JSP+Servlet+Bean整合
AJAX技術基礎、XMLHttpRequest對象詳解、jQuery的AJAX、AJAX技術調試技巧、JSON介紹、JSON語法、JSON類庫
LoggingAPI日誌管理、JUnit單元測試技術、Ant打包
第三階段:JavaEE高級
SpringWeb MVC介紹、Web MVC應用、Spring WebMVC架構、Spring MVC入門程序、非註解處理器映射器和適配器、註解開發處理器映射器和適配器、Spring MVC整合Mybatis、RequestMapping、Controller方法返回值、參數綁定(簡單類型、pojo、包裝類型、數組、集合類型等)、SpringMVC與Struts2區別、Spring MVC上傳圖片、json數據交互、Validation、異常處理器、RESTful支持、攔截器
Mybatis介紹、單獨使用jdbc編程問題總結、Mybatis架構、Mybatis入門程序、Mybatis開發Dao、SqlMapConfig.XML配置、ParameterType輸入映射、ResultType及ResultMap輸出映射、動態SQL、商品訂單數據模型、關聯查詢(一對一、一對多)、Mybatis與Spring整合、Mybatis逆向工程
Spring框架介紹,IoC思想、DI依賴注入、Bean的實例方式、Bean種類、Bean作用域范圍、依賴注入、p命名空間、SpEL?Spring表達式、註解裝配Bean、整合Junit測試、Web開發集成Spring、AOP思想、使用AspectJ切面編程、JdbcTemplate模板使用、C3P0數據源配置、DBCP數據源配置、聲明式事務管理、SSH整合
Struts2框架介紹、工作原理與架構分析、6大配置文件分析、Struts.XML詳解及使用,使用通配符定義action、動態方法調用,ActionContext及ServletActionContext使用,模型驅動ModelDriven、屬性驅動、Struts2文件上傳、默認攔截器分析、自定義攔截器、OGNL表達式、值棧ValueStack分析及操作、Struts2標簽
學會基於Spring?Boot實現減少XML配置,快速搭建Java Web項目,減少Java開發的笨重的工作量,減少項目周期
Maven的介紹、Maven的構建、Maven的依賴管理、Maven和Eclipse的整合、Maven構建SSM應用
Oracle基礎管理,SQL語言、序列、索引、視圖對象、數據備份與移植
第四階段:JavaEE熟練
基於JFreeChart生成餅圖、曲線圖、柱狀圖
基於iText生成pdf文件
基於POI組件生成EXCEL文件
Quartz定時任務管理器以及和Spring的繼承
HttpClient/HTMLParser,採用HttpClient如何抓取網頁、GET提交和POST提交、採用HTMLParser解析HTML。
NIO介紹、netty入門
Activiti工作流:掌握工作流的基本概念,什麼叫流程定義、什麼叫流程實例、什麼叫任務、工作流中的相關概念將如何應用
異構系統整合方案,JNI、CORBA、基於Web?Services的中國電信消息系統規范介紹、SOAP、WSDL、UDDI、如何採用CXF/Axis2開發WebService伺服器端和客戶端的相關知識
git介紹、git版本管理。
掌握Linux的常用命令,熟悉Linux上下文編輯器,掌握Linux的文件管理控制等
JbossWeblogic企業級JavaEE應用伺服器安裝、配置
基本的Apache和Tomcat整合,最新的Tomcat和Apache集群和負載均衡配置
掌握Nginx負載均衡及和Tomcat的整合
掌握ActiveMQ消息隊列的安裝以及和Java的集成、JMS介面規范
MySQL主從配置、MySQL分庫分表實際演練、MySQL集群配置
MongoDB安裝,基本使用,和Java集成、Spring框架集成
Redis安裝,基本使用,和Java集成、Spring框架集成
安卓基礎開發:了解Android和開發環境搭建、Activity、UI布局和UI組件、AsyncTask非同步任務、網路應用、資訊APP實戰基於JFreeChart生成餅圖、曲線圖、柱狀圖
H. 如何在本地測試Java 建站系統
一、 介紹
本文將討論在.NET應用程序中全局系統鉤子的使用。為此,我開發了一個可重用的類庫並創建一個相應的示常式序(見下圖)。
你可能注意到另外的關於使用系統鉤子的文章。本文與之類似但是有重要的差別。這篇文章將討論在.NET中使用全局系統鉤子,而其它文章僅討論本地系統鉤子。這些思想是類似的,但是實現要求是不同的。
二、 背景
如果你對Windows系統鉤子的概念不熟悉,讓我作一下簡短的描述:
・一個系統鉤子允許你插入一個回調函數-它攔截某些Windows消息(例如,滑鼠相聯系的消息)。
・一個本地系統鉤子是一個系統鉤子-它僅在指定的消息由一個單一線程處理時被調用。
・一個全局系統鉤子是一個系統鉤子-它當指定的消息被任何應用程序在整個系統上所處理時被調用。
已有若干好文章來介紹系統鉤子概念。在此,不是為了重新收集這些介紹性的信息,我只是簡單地請讀者參考下面有關系統鉤子的一些背景資料文章。如果你對系統鉤子概念很熟悉,那麼你能夠從本文中得到你能夠得到的任何東西。
・關於MSDN庫中的鉤子知識。
・Dino Esposito的《Cutting Edge-Windows Hooks in the .NET Framework》。
・Don Kackman的《在C#中應用鉤子》。
本文中我們要討論的是擴展這個信息來創建一個全局系統鉤子-它能被.NET類所使用。我們將用C#和一個DLL和非託管C++來開發一個類庫-它們一起將完成這個目標。
三、 使用代碼
在我們深入開發這個庫之前,讓我們快速看一下我們的目標。在本文中,我們將開發一個類庫-它安裝全局系統鉤子並且暴露這些由鉤子處理的事件,作為我們的鉤子類的一個.NET事件。為了說明這個系統鉤子類的用法,我們將在一個用C#編寫的Windows表單應用程序中創建一個滑鼠事件鉤子和一個鍵盤事件鉤子。
這些類庫能用於創建任何類型的系統鉤子,其中有兩個預編譯的鉤子-MouseHook和KeyboardHook。我們也已經包含了這些類的特定版本,分別稱為MouseHookExt和KeyboardHookExt。根據這些類所設置的模型,你能容易構建系統鉤子-針對Win32 API中任何15種鉤子事件類型中的任何一種。另外,這個完整的類庫中還有一個編譯的HTML幫助文件-它把這些類歸檔化。請確信你看了這個幫助文件-如果你決定在你的應用程序中使用這個庫的話。
MouseHook類的用法和生命周期相當簡單。首先,我們創建MouseHook類的一個實例。
mouseHook = new MouseHook();//mouseHook是一個成員變數
接下來,我們把MouseEvent事件綁定到一個類層次的方法上。
mouseHook.MouseEvent+=new MouseHook.MouseEventHandler(mouseHook_MouseEvent);
// ...
private void mouseHook_MouseEvent(MouseEvents mEvent, int x, int y){
string msg =string.Format("滑鼠事件::(,).",mEvent.ToString(),x,y);
AddText(msg);//增加消息到文本框
}
為開始收到滑鼠事件,簡單地安裝下面的鉤子即可。
mouseHook.InstallHook();
為停止接收事件,只需簡單地卸載這個鉤子。
mouseHook.UninstallHook();
你也可以調用Dispose來卸載這個鉤子。
在你的應用程序退出時,卸載這個鉤子是很重要的。讓系統鉤子一直安裝著將減慢系統中的所有的應用程序的消息處理。它甚至能夠使一個或多個進程變得很不穩定。因此,請確保在你使用完鉤子時一定要移去你的系統鉤子。我們確定在我們的示例應用程序會移去該系統鉤子-通過在Form的Dispose方法中添加一個Dispose調用。
protected override void Dispose(bool disposing) {
if (disposing) {
if (mouseHook != null) {
mouseHook.Dispose();
mouseHook = null;
}
// ...
}
}
使用該類庫的情況就是如此。該類庫中有兩個系統鉤子類並且相當容易擴充。
四、 構建庫
這個庫共有兩個主要組件。第一部分是一個C#類庫-你可以直接使用於你的應用程序中。該類庫,反過來,在內部使用一個非託管的C++ DLL來直接管理系統鉤子。我們將首先討論開發該C++部分。接下來,我們將討論怎麼在C#中使用這個庫來構建一個通用的鉤子類。就象我們討論C++/C#交互一樣,我們將特別注意C++方法和數據類型是怎樣映射到.NET方法和數據類型的。
你可能想知道為什麼我們需要兩個庫,特別是一個非託管的C++ DLL。你還可能注意到在本文的背景一節中提到的兩篇參考文章,其中並沒有使用任何非託管的代碼。為此,我的回答是,"對!這正是我寫這篇文章的原因"。當你思考系統鉤子是怎樣實際地實現它們的功能時,我們需要非託管的代碼是十分重要的。為了使一個全局的系統鉤子能夠工作,Windows把你的DLL插入到每個正在運行的進程的進程空間中。既然大多數進程不是.NET進程,所以,它們不能直接執行.NET裝配集。我們需要一種非託管的代碼代理- Windows可以把它插入到所有將要被鉤住的進程中。
首先是提供一種機制來把一個.NET代理傳遞到我們的C++庫。這樣,我們用C++語言定義下列函數(SetUserHookCallback)和函數指針(HookProc)。
int SetUserHookCallback(HookProc userProc, UINT hookID)
typedef void (CALLBACK *HookProc)(int code, WPARAM w, LPARAM l)
SetUserHookCallback的第二個參數是鉤子類型-這個函數指針將使用它。現在,我們必須用C#來定義相應的方法和代理以使用這段代碼。下面是我們怎樣把它映射到C#。
private static extern SetCallBackResults
SetUserHookCallback(HookProcessedHandler hookCallback, HookTypes hookType)
protected delegate void HookProcessedHandler(int code, UIntPtr wparam, IntPtr lparam)
public enum HookTypes {
JournalRecord = 0,
JournalPlayback = 1,
// ...
KeyboardLL = 13,
MouseLL = 14
};
首先,我們使用DllImport屬性導入SetUserHookCallback函數,作為我們的抽象基鉤子類SystemHook的一個靜態的外部的方法。為此,我們必須映射一些外部數據類型。首先,我們必須創建一個代理作為我們的函數指針。這是通過定義上面的HookProcessHandler 來實現的。我們需要一個函數,它的C++簽名為(int,WPARAM,LPARAM)。在Visual Studio .NET C++編譯器中,int與C#中是一樣的。也就是說,在C++與C#中int就是Int32。事情並不總是這樣。一些編譯器把C++ int作為Int16對待。我們堅持使用Visual Studio .NET C++編譯器來實現這個工程,因此,我們不必擔心編譯器差別所帶來的另外的定義。
接下來,我們需要用C#傳遞WPARAM和LPARAM值。這些確實是指針,它們分別指向C++的UINT和LONG值。用C#來說,它們是指向uint和int的指針。如果你還不確定什麼是WPARAM,你可以通過在C++代碼中單擊右鍵來查詢它,並且選擇"Go to definition"。這將會引導你到在windef.h中的定義。
//從windef.h:
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
因此,我們選擇System.UIntPtr和System.IntPtr作為我們的變數類型-它們分別相應於WPARAM和LPARAM類型,當它們使用在C#中時。
現在,讓我們看一下鉤子基類是怎樣使用這些導入的方法來傳遞一個回叫函數(代理)到C++中-它允許C++庫直接調用你的系統鉤子類的實例。首先,在構造器中,SystemHook類創建一個到私有方法InternalHookCallback的代理-它匹配HookProcessedHandler代理簽名。然後,它把這個代理和它的HookType傳遞到C++庫以使用SetUserHookCallback方法來注冊該回叫函數,如上面所討論的。下面是其代碼實現:
public SystemHook(HookTypes type){
_type = type;
_processHandler = new HookProcessedHandler(InternalHookCallback);
SetUserHookCallback(_processHandler, _type);
}
InternalHookCallback的實現相當簡單。InternalHookCallback在用一個catch-all try/catch塊包裝它的同時僅傳遞到抽象方法HookCallback的調用。這將簡化在派生類中的實現並且保護C++代碼。記住,一旦一切都准備妥當,這個C++鉤子就會直接調用這個方法。
[MethodImpl(MethodImplOptions.NoInlining)]
private void InternalHookCallback(int code, UIntPtr wparam, IntPtr lparam){
try
catch {}
}
我們已增加了一個方法實現屬性-它告訴編譯器不要內聯這個方法。這不是可選的。至少,在我添加try/catch之前是需要的。看起來,由於某些原因,編譯器在試圖內聯這個方法-這將給包裝它的代理帶來各種麻煩。然後,C++層將回叫,而該應用程序將會崩潰。
現在,讓我們看一下一個派生類是怎樣用一個特定的HookType來接收和處理鉤子事件。下面是虛擬的MouseHook類的HookCallback方法實現:
protected override void HookCallback(int code, UIntPtr wparam, IntPtr lparam){
if (MouseEvent == null)
int x = 0, y = 0;
MouseEvents mEvent = (MouseEvents)wparam.ToUInt32();
switch(mEvent) {
case MouseEvents.LeftButtonDown:
GetMousePosition(wparam, lparam, ref x, ref y);
break;
// ...
}
MouseEvent(mEvent, new Point(x, y));
}
首先,注意這個類定義一個事件MouseEvent-該類在收到一個鉤子事件時激發這個事件。這個類在激發它的事件之前,把數據從WPARAM和 LPARAM類型轉換成.NET中有意義的滑鼠事件數據。這樣可以使得類的消費者免於擔心解釋這些數據結構。這個類使用導入的 GetMousePosition函數-我們在C++ DLL中定義的用來轉換這些值。為此,請看下面幾段的討論。
在這個方法中,我們檢查是否有人在聽這一個事件。如果沒有,不必繼續處理這一事件。然後,我們把WPARAM轉換成一個MouseEvents枚舉類型。我們已小心地構造了MouseEvents枚舉來准確匹配它們在C ++中相應的常數。這允許我們簡單地把指針的值轉換成枚舉類型。但是要注意,這種轉換即使在WPARAM的值不匹配一個枚舉值的情況下也會成功。 mEvent的值將僅是未定義的(不是null,只是不在枚舉值范圍之內)。為此,請詳細分析System.Enum.IsDefined方法。
接下來,在確定我們收到的事件類型後,該類激活這個事件,並且通知消費者滑鼠事件的類型及在該事件過程中滑鼠的位置。
最後注意,有關轉換WPARAM和LPARAM值:對於每個類型的事件,這些變數的值和意思是不同的。因此,在每一種鉤子類型中,我們必須區別地解釋這些值。我選擇用C++實現這種轉換,而不是盡量用C#來模仿復雜的C++結構和指針。例如,前面的類就使用了一個叫作GetMousePosition的 C++函數。下面是C++ DLL中的這個方法:
bool GetMousePosition(WPARAM wparam, LPARAM lparam, int amp; x, int amp; y) {
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lparam;
x = pMouseStruct->pt.x;
y = pMouseStruct->pt.y;
return true;
}
不是盡量映射MOUSEHOOKSTRUCT結構指針到C#,我們簡單地暫時把它回傳到C++層以提取我們需要的值。注意,因為我們需要從這個調用中返回一些值,我們把我們的整數作為參考變數傳遞。這直接映射到C#中的int*。但是,我們可以重載這個行為,通過選擇正確的簽名來導入這個方法。
private static extern bool InternalGetMousePosition(UIntPtr wparam,IntPtr lparam, ref int x, ref int y)
通過把integer參數定義為ref int,我們得到通過C++參照傳遞給我們的值。如果我們想要的話,我們還可以使用out int。
五、 限制
一些鉤子類型並不適合實現全局鉤子。我當前正在考慮解決辦法-它將允許使用受限制的鉤子類型。到目前為止,不要把這些類型添加回該庫中,因為它們將導致應用程序的失敗(經常是系統范圍的災難性失敗)。下一節將集中討論這些限制背後的原因和解決辦法。
HookTypes.CallWindowProcere
HookTypes.CallWindowProret
HookTypes.ComputerBasedTraining
HookTypes.Debug
HookTypes.ForegroundIdle
HookTypes.JournalRecord
HookTypes.JournalPlayback
HookTypes.GetMessage
HookTypes.SystemMessageFilter
六、 兩種類型的鉤子
在本節中,我將盡量解釋為什麼一些鉤子類型被限制在一定的范疇內而另外一些則不受限制。如果我使用有點偏差術語的話,請原諒我。我還沒有找到任何有關這部分題目的文檔,因此,我編造了我自己的詞彙。另外,如果你認為我根本就不對,請告訴我好了。
當Windows調用傳遞到SetWindowsHookEx()的回調函數時它們會因不同類型的鉤子而被區別調用。基本上有兩種情況:切換執行上下文的鉤子和不切換執行上下文的鉤子。用另一種方式說,也就是,在放鉤子的應用程序進程空間執行鉤子回調函數的情況和在被鉤住的應用程序進程空間執行鉤子回調函數的情況。
鉤子類型例如滑鼠和鍵盤鉤子都是在被Windows調用之前切換上下文的。整個過程大致如下:
1. 應用程序X擁有焦點並執行。
2. 用戶按下一個鍵。
3. Windows從應用程序X接管上下文並把執行上下文切換到放鉤子的應用程序。
4. Windows用放鉤子的應用程序進程空間中的鍵消息參數調用鉤子回調函數。
5. Windows從放鉤子的應用程序接管上下文並把執行上下文切換回應用程序X。
6. Windows把消息放進應用程序X的消息排隊。
7. 稍微一會兒之後,當應用程序X執行時,它從自己的消息排隊中取出消息並且調用它的內部按鍵(或松開或按下)處理器。
8. 應用程序X繼續執行...
例如CBT鉤子(window創建,等等。)的鉤子類型並不切換上下文。對於這些類型的鉤子,過程大致如下:
1. 應用程序X擁有焦點並執行。
2. 應用程序X創建一個窗口。
3. Windows用在應用程序X進程空間中的CBT事件消息參數調用鉤子回調函數。
4. 應用程序X繼續執行...
這應該說明了為什麼某種類型的鉤子能夠用這個庫結構工作而一些卻不能。記住,這正是該庫要做的。在上面第4步和第3步之後,分別插入下列步驟:
1. Windows調用鉤子回調函數。
2. 目標回調函數在非託管的DLL中執行。
3. 目標回調函數查找它的相應託管的調用代理。
4. 託管代理被以適當的參數執行。
5. 目標回調函數返回並執行相應於指定消息的鉤子處理。
第三步和第四步因非切換鉤子類型而註定失敗。第三步將失敗,因為相應的託管回調函數不會為該應用程序而設置。記住,這個DLL使用全局變數來跟蹤這些託管代理並且該鉤子DLL被載入到每一個進程空間。但是這個值僅在放鉤子的應用程序進程空間中設置。對於另外其它情況,它們全部為null。
Tim Sylvester在他的《Other hook types》一文中指出,使用一個共享內存區段將會解決這個問題。這是真實的,但是也如Tim所指出的,那些託管代理地址對於除了放鉤子的應用程序之外的任何進程是無意義的。這意味著,它們是無意義的並且不能在回調函數的執行過程中調用。那樣會有麻煩的。
因此,為了把這些回調函數使用於不執行上下文切換的鉤子類型,你需要某種進程間的通訊。
我已經試驗過這種思想-使用非託管的DLL鉤子回調函數中的進程外COM對象進行IPC。如果你能使這種方法工作,我將很高興了解到這點。至於我的嘗試,結果並不理想。基本原因是很難針對各種進程和它們的線程(CoInitialize(NULL))而正確地初始化COM單元。這是一個在你可以使用 COM對象之前的基本要求。
我不懷疑,一定有辦法來解決這個問題。但是我還沒有試用過它們,因為我認為它們僅有有限的用處。例如,CBT鉤子可以讓你取消一個窗口創建,如果你希望的話。可以想像,為使這能夠工作將會發生什麼。
1. 鉤子回調函數開始執行。
2. 調用非託管的鉤子DLL中的相應的鉤子回調函數。
3. 執行必須被路由回到主鉤子應用程序。
4. 該應用程序必須決定是否允許這一創建。
5. 調用必須被路由回仍舊在運行中的鉤子回調函數。
6. 在非託管的鉤子DLL中的鉤子回調函數從主鉤子應用程序接收到要採取的行動。
7. 在非託管的鉤子DLL中的鉤子回調函數針對CBT鉤子調用採取適當的行動。
8. 完成鉤子回調函數的執行。
這不是不可能的,但是不算好的。我希望這會消除在該庫中的圍繞被允許的和受限制的鉤子類型所帶來的神秘。
七、 其它
・庫文檔:我們已經包含了有關ManagedHooks類庫的比較完整的代碼文檔。當以"Documentation"構建配置進行編譯時,這被經由Visual Studio.NET轉換成標准幫助XML。最後,我們已使用NDoc來把它轉換成編譯的HTML幫助(CHM)。你可以看這個幫助文件,只需簡單地在該方案的解決方案資源管理器中點擊Hooks.chm文件或通過查找與該文相關的可下載的ZIP文件。
・增強的智能感知:如果你不熟悉Visual Studio.NET怎樣使用編譯的XML文件(pre-NDoc output)來為參考庫的工程增強智能感知,那麼讓我簡單地介紹一下。如果你決定在你的應用程序中使用這個類庫,你可以考慮復制該庫的一個穩定構建版本到你想參考它的位置。同時,還要把XML文檔文件 (SystemHooks\ManagedHooks\bin\Debug\Kennedy.ManagedHooks.xml)復制到相同的位置。當你添加一個參考到該庫時,Visual Studio.NET將自動地讀該文件並使用它來添加智能感知文檔。這是很有用的,特別是對於象這樣的第三方庫。
・單元測試:我相信,所有的庫都應有與之相應的單元測試。既然我是一家公司(主要負責針對.NET環境軟體的單元測試)的合夥人和軟體工程師,任何人不會對此感到驚訝。因而,你將會在名為ManagedHooksTests的解決方案中找到一個單元測試工程。為了運行該單元測試,你需要下載和安裝 HarnessIt-這個下載是我們的商業單元測試軟體的一個自由的試用版本。在該單元測試中,我對這給予了特殊的注意-在此處,方法的無效參數可能導致 C++內存異常的發生。盡管這個庫是相當簡單的,但該單元測試確實能夠幫助我在一些更為微妙的情況下發現一些錯誤。
・非託管的/託管的調試:有關混合解決方案(例如,本文的託管的和非託管的代碼)最為技巧的地方之一是調試問題。如果你想單步調試該C++代碼或在C++代碼中設置斷點,你必須啟動非託管的調試。這是一個Visual Studio.NET中的工程設置。注意,你可以非常順利地單步調試託管的和非託管的層,但是,在調試過程中,非託管的調試確實嚴重地減慢應用程序的裝載時間和執行速度。
八、 最後警告
很明顯,系統鉤子相當有力量;然而,使用這種力量應該是有責任性的。在系統鉤子出了問題時,它們不僅僅垮掉你的應用程序。它們可以垮掉在你的當前系統中運行的每個應用程序。但是到這種程度的可能性一般是很小的。盡管如此,在使用系統鉤子時,你還是需要再三檢查你的代碼。
我發現了一項可以用來開發應用程序的有用的技術-它使用系統鉤子來在微軟的虛擬PC上安裝你的喜愛的開發操作系統的一個拷貝和Visual Studio.NET。然後,你就可以在此虛擬的環境中開發你的應用程序。用這種方式,當你的鉤子應用程序出現錯誤時,它們將僅退出你的操作系統的虛擬實例而不是你的真正的操作系統。我已經不得不重啟動我的真正的OS-在這個虛擬OS由於一個鉤子錯誤崩潰時,但是這並不經常。
I. java技術會怎麼快速建站
建站需要一些前段的知識像html與css這樣的 你可以去網上找一下建站的知識。
J. 國內有哪些較好的Java開源CMS建站系統
下面給你推薦幾個Java開源CMS建站系統:
1、DoraCMS是基於Nodejs+express+mongodb編寫的一套內容管理系統,結構簡單,較目前一些開源的cms,doracms易於拓展,特別適合前端開發工程師做二次開發。
2、PublicCMS是採用2017年最新主流技術開發的免費開源JAVACMS系統。架構科學,輕松支持上千萬數據、千萬PV;支持全站靜態化,SSI,動態頁面局部靜態化等為您快速建站,建設大規模站點提供強大驅動,也是企業級項目產品原型的良好選擇。
3、電子商務平台及CMS建站系統 CmsWing
一款基於ThinkJS(Node.js MVC)和MySQL的功能強大的(PC端,手機端和微信公眾平台)電子商務平台及CMS建站系統。