青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

#

主要翻譯自lua文檔,加上了programming lua中自己的一些理解

require(modname)

加載給定的模塊.函數首先檢查表package.loaded來判定modname是否已經存在.如果存在,則require返回package.loaded[modname]所存儲的值否則它嘗試為模塊找到一個加載器(loader).

要找到一個加載器,require首先查詢package.preloaded[modname].如果它有值,該值(應該是一個函數)就是加載器.如果沒值require使用package.path中存儲的路徑查找一個Lua的加載器.如果該查找也失敗,它使用package.cpath中存儲的路徑查找一個C語言加載器(C loader).如果還是失敗,它嘗試使用all-in-one加載器(如下)

當加載一個C庫的時候,require首先使用動態鏈接工具將應用程序與庫連接起來.之后它嘗試找到一個該庫中的C函數,該函數要被當做加載器使用.這個C函數的名稱是字符串"luaopen_"連接著復制的模塊名(模塊名稱中的每個點號"."都被替換為一個下劃線).此外,如果模塊名稱含有連字符"-",則第一個連字符的前綴(包括連字符)都被移除.比如,如果模塊名稱是a.v1-b.c,則函數名稱將是luaopen_b_c.

如果require即沒有為模塊找到一個Lua庫也沒有為模塊找到一個C庫,他將調用all-in-one加載器.該加載器為給定模塊的根名稱查找C路徑找到對應庫(原文:this loader searches the C path for a library for the root name of the given module).例如,當require a.b.c時,它將為a查找一個庫.如果找到,它查詢該庫內部為子模塊找到一個開放函數(open function);在我們這個例子中將會是luaopen_a_b_c.使用這個便利機制(facility),一個包可以將幾個子模塊打包進單個的庫中,同時每個子模塊保存著它本來的開放函數.

一旦找到一個加載器,require使用單個的參數modname調用加載器.如果加載器返回任何值,require將其賦值給package.loaded[modname].如果加載器沒有返回值且沒有給package.loaded[modname]賦與任何值,則require為該條目賦值為true.無論如何,require返回package.loaded[modname]的最終值.

如果加載或者運行模塊有任何錯誤,或者他不能為模塊找到一個加載器,則require發出一個錯誤信號.

require函數的實現原理如下:

 

  1. --require 函數的實現  
  2. function require(name)  
  3.     if not package.loaded[name] then  
  4.         local loader = findloader(name) //這一步演示在代碼中以抽象函數findloader來表示  
  5.         if loader == nil then  
  6.             error("unable to load module" .. name)  
  7.         end  
  8.         package.loaded[name] = true  
  9.         local res = loader(name)  
  10.         if res ~= nil then  
  11.             package.loaded[name] = res  
  12.         end  
  13.     end  
  14.     return package.loaded[name]  
  15. end  

 

package.cpath

由require使用查找C加載器的路徑

Lua初始化C路徑package.cpath的方法與初始化Lua路徑package.path的相同,使用LUA_CPATH中的環境變量(另外一個默認的路徑在luaconf.h中定義)

package.loaded

一個用于控制哪些模塊已經加載的表,該表由require使用.當require一個模塊名為modname的模塊且package.loaded[modname]不為false時,require僅返回package.loaded[modname]存儲的值.

package.loadlib(libname,funcname)

使用C庫libname動態鏈接到宿主程序.在這個庫中,尋找函數funcname并將該函數作為一個C函數返回.(所以,funcname必須遵守協議(參見lua_CFunction)).

這是一個底層函數.它完全繞過了package和module系統.與require不同,它不執行任何路徑查找且不自動添加擴展名.libname必須是C庫中完整的文件名,如果必要的話還要包含路徑和擴展名.funcname必須是原封不動的C庫中導出的名字(這可能取決于使用的C編譯器和鏈接器).

這個函數不被ANSI C支持.就其本身而言,它只在一些平臺上才能使用(Windows,Linux,Mac OS X,Solaris,BSD,加上其他支持dlfcn標準的Unix系統)

package.path

require用于查找Lua加載器的路徑

在啟動時,Lua使用環境變量LUA_PATH或者如果環境變量未定義就使用luaconf.h中定義的默認值來初始化該值.環境變量中的任何"::"都被替換為默認路徑.

路徑是一系列由分號隔開的模板(templates).對于每個模板,require將每個模板中的問號替換為filename,filename是modname中每個點都被替換成"目錄分隔符"(比如Unix中的"/")(這句感覺翻譯不準確,原文:For each template,require will change each interrogation mark in the template by filename,which is modname with each dot replaced by a "directory separator"(such as "/" in Unix));之后他將加載產生的文件名.因此,舉個例子,如果Lua路徑是"./?.lua;./?.lc;/usr/local/?/init.lua",為模塊foo查找一個Lua加載器將會嘗試以如下順序加載文件./foo.lua,./foo.lc和/usr/local/foo/init.lua

package.preload

為特定模塊存儲加載器的一個表(參見require)

package.seeall(module)

為module設置一個元表,module的__index只想全局環境(global environment),以便該module繼承全局環境中的值.作為函數module中的一個選項來使用.

在Programming Lua中是這么講的:

默認情況下,module不提供外部訪問.必須在調用它之前,為需要訪問的外部函數或模塊聲明適當的局部變量.也可以通過繼承來實現外部訪問,只需在調用module時附加一個選項package.seeall.這個選項等價于如下代碼:

 

  1. setmetatable(M,{__index = _G})  
因而只需這么做:

 

 

  1. module(...,package.seeall)  

module(name,[,...])

 

創建一個模塊.如果在package.loaded[name]中有表,該表便是創建的模塊.否則,如果有一個全局表t其名稱與給定名稱相同,則該全局表便是創建的模塊.否則創建一個新的表t

posted @ 2015-04-06 16:31 Enic 閱讀(318) | 評論 (0)編輯 收藏

LogServer
日志服務器看起來是一個完全獨立的服務器,啟動以后直接向某個邏輯服務器發起一個連接,然后根據如下的映射表工作起來:
QLOG_MSG_ENTRY( GMSG_LOG_SERVER_INFO,gmsg_log_server_info)
QLOG_MSG_ENTRY( GMSG_LOG_ITEM,gmsg_log_item)
QLOG_MSG_ENTRY( GMSG_LOG_CHAT,gmsg_log_chat)
QLOG_MSG_ENTRY( GMSG_LOG_ACCOUNT,gmsg_log_account)
QLOG_MSG_ENTRY( GMSG_LOG_SYS,gmsg_log_sys)
QLOG_MSG_ENTRY(GMSG_LOG_PLAYER,gmsg_log_player)
QLOG_MSG_ENTRY(GMSG_LOG_SAMPLE,gmsg_log_sample)
QLOG_MSG_ENTRY( GMSG_LOG_STAT,gmsg_log_stat)
QLOG_MSG_ENTRY( GMSG_LOG_GM,gmsg_log_gm)
QLOG_MSG_ENTRY(GMSG_LOG_QUEST,gmsg_log_quest)
QLOG_MSG_ENTRY(GMSG_LOG_MAIL,gmsg_log_mail)
QLOG_MSG_ENTRY(GMSG_LOG_SCRIPT,gmsg_log_script)
QLOG_MSG_ENTRY(GMSG_LOG_TENCENT_CLIENT_WG, gmsg_log_tencent_client_wg)
QLOG_MSG_ENTRY(GMSG_LOG_PING, gmsg_log_ping)
key是網絡協議,value是對應的處理函數,對應的邏輯類是QLoggerHandler
QLoggerHandler管理著LogServer唯一的socket句柄,連接建立后就做一件事,把接受到的數據塞到日志數據庫囧。
日志服務器協議命令碼
enum EServerLogProtocol
{
GMSG_LOG_SERVER_INFO = 1,
LMSG_LOG_SERVER_CLOSE = 2,
LMSG_LOG_SERVER_ERROR = 3,
GMSG_LOG_ITEM = 4,//物品相關log
GMSG_LOG_CHAT = 5,//聊天log
GMSG_LOG_ACCOUNT = 6,//account活動log
GMSG_LOG_SYS = 7,//系統警告log
GMSG_LOG_PLAYER = 8,//玩家log
GMSG_LOG_SAMPLE = 9,//玩家log
GMSG_LOG_STAT = 10,//系統統計log
GMSG_LOG_GM = 11,//gm log
GMSG_LOG_QUEST = 12,//quest log
GMSG_LOG_MAIL = 13,//mail log
GMSG_LOG_SCRIPT = 14,//script log
GMSG_LOG_CLIENT_WG = 15,//客戶端檢測外掛
GMSG_LOG_TENCENT_CLIENT_WG = 16,//騰訊的檢測外掛log
GMSG_LOG_PING = 17,//檢測LogServer是否死掉
};
編碼技巧:
1.在網絡協議風暴解包中MSG_X系列宏算一個亮點。
用法舉例:
msg標識一個消息數據,實際上一個ACE_Message_Block
MSG_NEW(MSG_OP_CODE, msg)  // 定義一個消息包,opcode是MSG_OP_CODE
MSG_SET_STR(  // 調用ACE_Message_Block相關接口寫入需要攜帶的數據,數據大小變化會被ace自動感知到
MSG_DEL(smsg);  // 銷毀消息
2.利用map做的消息映射表:
#define QLOG_MSG_MAP_BEGIN \
class __LOG_MSG_MAP__{ public:__LOG_MSG_MAP__(); }; \
static __LOG_MSG_MAP__  __log_msg_map__; \
__LOG_MSG_MAP__::__LOG_MSG_MAP__(){ \
QLoggerHandler::msg_map_.clear();
#define QLOG_MSG_ENTRY( QMSG, FUNC ) \
if(QLoggerHandler::msg_map_.find(QMSG)==QLoggerHandler::msg_map_.end()) \
{ QLoggerHandler::msg_map_.insert(QLoggerHandler::Msg_Map::value_type(QMSG,QLoggerHandler::FUNC));}
#define QLOG_MSG_MAP_END }
#define QLOG_MSG_ENTRY( QMSG, FUNC ) bool FUNC( ACE_Message_Block* msg );
這種設計要求網絡響應函數參數是一致的,函數內部各自做解包操作。
3.統一分離出來的數據庫操作:
class DBProxy
{
public:
static bool save_sys_log(const char* sys_l
static bool save_item_log(const char* serv
int left_credit,int item_guid,int item
static bool save_gm_log(int gm_log_type, c
static bool save_chat_log(int chat_type,co
static bool save_account_log( int log_type
static bool save_player_log(int log_type,c
static bool save_sample_log(int log_type,c
static bool save_stat_log(const char* serv
static bool save_quest_log(int log_type, c
static bool save_mail_log(int log_type, co
static bool save_script_log(int log_type, 
const char* log_p_2,const char* log_p_
static bool save_tencent_wg_log(const char
};
#endif//__DBProxy_H_
整個設計顯得非常清晰:
QLoggerHandler接受到網絡消息通過映射表static Msg_Map msg_map_;分解到各自的解包函數,然后通過DBProxy執行最終的數據庫操作。
posted @ 2015-03-18 00:26 Enic 閱讀(241) | 評論 (0)編輯 收藏

GatewayManager(網關管理器)
起初我以為這是一個單獨的進程,專門用來管理網關,后來發現他實際上是被編譯為".lib"的。
代碼開起來很簡單,除了協議一共三只有三個類:GatewatManager、GWClientProxy、GWSVProxy
猜測一下:
GWClientProxy表示在Gateway上的客戶端
GWSVProxy表示服務器
GatewayManager做協調邏輯
簡單瀏覽了一下代碼實際應該是這樣:
GatewayManager、GWClientProxy猜對了,而GWSVProxy標識的是GatewayServer。這樣來看在GatewayManager的抽象中GatewayServer、Client都是獨立的實體,可以通過代理做到直接訪問。
整個網關的設計,應該是一個邏輯服務器做為一個GatewayManager連接并管理了多個GateWayServer來負載自己的并發連接數,同時提供了GWSVProxy和GWClientProxy來實現“透明控制”
GatewayManager類分析:
1.從GatewayManager可以獲取到GWClientProxy,可以通過GUID來獲取
2.GatewayManager能感知到新的客戶端連接事件,事件參數包括實際連接客戶端的GWSVProxy和客戶端在該網關上的id,以及客戶端實際連接地址
3.GatewayManager能感知到新的網關服務器連接事件
一句話描述GatewayManager的功能:
直接和網關服務器連接,管理網關服務器,透過網關服務器直接訪問、管理客戶端連接。
posted @ 2015-03-17 23:22 Enic 閱讀(328) | 評論 (0)編輯 收藏

星座物語客戶端分析---01物品編輯器
一、整體設計思路猜測
1.前期目標數據結構盡可能單一化,配置化。
2.盡可能讓程序和策劃的接口無人化,工具化,歸納需求以后程序提供工具給策劃人員。
二、數據結構分析
所有的道具都被冗余到同一個數據結構中了。
優勢:編碼、和配置文件的制作上非常方便
劣勢:內存略高,后期編碼肯能會有負擔
*所有游戲世界中任何道具都可以用_ITEM_TABLE結構體來描述
三、類型邏輯分析
目前分析到的代碼,可以看出來,道具是“二級”分類,前期考慮也不夠充分,后面添加的代碼略顯混亂。
第一級:醫療道具、裝備道具、輔助道具、任務道具(道具觸發任務、道具觸發技能、道具觸發循環任務)
第二級:
  醫療道具二級分類:HP、MP、HPMP、Fealty(寵物忠誠度)、Health
  裝備道具二級分類:武器、頭部、衣服、手套、鞋子、項鏈、戒子、肩部
  *任務道具二級分類(實際代碼被卸載一級分類中了):道具觸發任務、道具觸發循環任務
  *輔助道具二級分類(實際代碼被卸載一級分類中了):道具觸發技能、ect.
四、細節分析:
1.對武器強化(打寶石,打孔)的支持不夠好。
猜測_ITEM_TABLE.nNextLevel用于支持強化。實際使用可能強化前,和強化后是完全不同的兩個物品,通過nNextLevel關聯起來。這種設計中每個武器只要是同一類型,那么一定是統一屬性的。
一個更好的方案是,給每個武器一個GUID,然后可以為武器添加全局唯一的屬性,方便“小極品”,允許更多個性化的存在,同時也可以更好的追蹤物品的交易流轉。這樣需要一個查詢效率足夠高的數據庫來保存游戲中每一個物品的數據。目測可以用KV來解決。如果查詢壓力太大,可以允許數據冗余,將道具的GUID數據和持有玩家綁定起來,一個玩家ID可以批量查詢出其對應的所有道具的GUID數據,直接用blob字段保存起來,同時GUID字段作為日志表保持,只在發生更改的時候才會有寫操作?;蛘哌@部分數據用KV數據庫系統保存。
2.有沒有辦法把_ITEM_TABLE結構體拆分,或者把道具做的靈活一點,變成組建系統或者屬性系統。
比如:道具看成是一個組建/屬性容器,放了一個裝備組建進去他就具有裝備的功能,放了一個醫療屬性就是一個醫療物品。這樣道具可以更加靈活,比如:將一個裝備作為藥品吃掉。(這個時候一級類型不再是類型,而是屬性,具有裝備道具屬性同時具有道具類型屬性)
3.降內存
使用protobuf代替直接使用結構體會不會好一點?_ITEM_TABLE中還使用了std::string作為字段,一個不小心memset就會掛掉。此外protobuf的優勢還有支持optional等配置,可能會有優勢,比如不用更具一級類型去復用二級類型的字段,而是將不同的部分獨立出來作為optional字段。
五、道具屬性
基礎屬性(三圍數據):力量(Strength)、敏捷(Agility)、耐力(Stamina)、精神(Energy)、智力(Intellect)、物攻(Attack)、魔攻(Magic)、物防(Recovery)、魔防(Mrecovery)、攻速(AckSpeed)、準確(Nicety)、躲閃(Dodge)
MP、HP
體力消耗
磨損
價格
職業
ect.待續,改天直接分析策劃案子,這個樣子太累
posted @ 2015-03-16 17:43 Enic 閱讀(335) | 評論 (1)編輯 收藏

網關服務器入網流程:
s1.連接網關管理器
s2.上報自身信息給網關管理器
s3.從網關管理器獲取自己的管理信息
*s4.按照管理信息預分配好需要的資源
s5.網關服務器打開客戶端監聽端口
s6.網關服務器開始轉發“管理器”和客戶端的數據
*網關服務器完全不理解來自客戶端的數據(對客戶端而言是透明的)
*網關服務器和“管理器”之間存在協議棧,有五個高級命令:轉發,廣播轉發,T下線1,T下線2,關閉網關
*網關服務器會定時給“管理器”發送心跳請求ping
*網關服務器會維護客戶端狀態機:Freed、Starting、InUse、Stoping
GateWayServer抽象網關邏輯以及和管理器的連接,處理管理器命令,并且轉發客戶端和管理器的消息
GWClient抽象網關到客戶端連接,負責處理網關和客戶端的邏輯
網關啟動后,GateWayServer會打開監聽端口,當新的連接上來以后,會創建一個新的GWClient對象,并且將新的socket連接郊游GWClient管理。GWClient管理客戶端和網關服務器之間的通訊數據:接受到客戶端的數據會交由GameWayServer對象轉發到指定的管理器,GameWayServer也會將管理器發送給客戶端的數據交由GWClient發送到客戶端。
即在網關服務器內部:GWClient做為客戶端的代理,GateWayServer做為管理器(邏輯服務器)的代理。
// 禁用nagles算法
int nodelay = 1;
if(ACE_OS::setsockopt(new_handle,IPPROTO_TCP, TCP_NODELAY,(char*)&nodelay,sizeof(nodelay))==-1)
{
ACE_ERROR( ( LM_ERROR, ACE_TEXT("Set socket TCP_NODELAY failed!!\n")) );
}
缺陷:
1.缺少對客戶端的安全檢測,也許是放到后面的邏輯服務器上去做了。不能排除惡意連接,或者誤操作的連接,所有的連接都被accept上來,然后做數據交換。
2.數據的分發上,好像一個網關服務器只能對應一個管理器(邏輯服務器)
3.網關只能標識到連接(SettionID是用戶邏輯無關的),無法識別到具體邏輯客戶端
嘗試做低級抽象:
IGateWayClientAccpetor
  OnClientAccept
IGateWay2ClientSession
  SessionID
  OnConnect
  OnRead
  OnWrite
IGateWay2ManagerSession
  SessionID
  OnConnect
  OnRead
  OnWrite
  
IGateWayDataRouter
  OnAccessRouting(IGateWay2ClientSession)
  OnAccessRouting(IGateWay2ManagerSession)
  OnGateWay2ClientSessionRead(來自客戶端的數據,當前代碼下,會轉發給唯一的管理器處理)
  OnGateWay2ManagerSession(來自管理器的數據,如果是需要轉發給客戶端的數據,會包含有客戶端SessionId)

協議概覽:
網關管理服務器 協議:
enum EGWMgrMsgType
{
GWMMT_Msg, // Route server msg to clients.
GWMMT_MsgAll, // Route server msg to all clients.
GWMMT_Droped, // *A client has been droped by manager( actively or disconnect ack ).
GWMMT_DropedDiscard, // *A client has been droped by manager( actively or disconnect ack ).
GWMMT_Shutdown, // Shutdown gateway server.
GWMMT_Max,
};
GWMMT_Msg: 轉發消息到指定客戶端
GWMMT_MsgAll: 轉發廣播消息到全部客戶端
GWMMT_Droped: 網關管理器T掉指定客戶端
GWMMT_DropedDiscard: 網關管理器T掉指定客戶端
GWMMT_Shutdown: 關閉網關服務器
---------------------------------------------------------------------------------------
網關服務器 協議:
enum EGWSVMsgType
{
GWSMT_CLJoin, // New client join.
GWSMT_CLDisconnected, // Client disconnected.
GWSMT_Msg, // Route client message to server.
GWSMT_Ping, // gateway ping message to server.
GWSMT_Max,
};
GWSMT_CLJoin: 新連接客戶端
GWSMT_CLDisconnected: 客戶端連接斷開
GWSMT_Msg: 將客戶端的消息轉發到服務器
GWSMT_Ping: 網關服務器到邏輯服務器的ping
-----------------------------------------------------------------------------------
網關服務器消息頭:
struct GWMsgHdr
{
GWMsgHdr( u_int type, u_int len ):type_( type ), data_len_(len){}
u_int type_; // Msg type.
u_int data_len_; //
};
------------------------------------------------------------------------------------
網關上報給網關管理器的自身信息
struct GWLocalInfo  // 監聽客戶端連接的endpoint
{
u_int addr_; // Gateway listen address.
u_short port_;
};
------------------------------------------------------------------------------------
網關從網關管理器接受的信息
struct GWInfo
{
u_int id_; // Gateway server id.
u_int cl_num_; // Client num.
};

設計特點:
1.啟動參數通過內存共享,本地,可以被其他程序訪問到,也許直接被共享到集群了,沒有深入去看
posted @ 2015-03-15 22:24 Enic 閱讀(307) | 評論 (0)編輯 收藏

 64位windows平臺,編譯環境是VS2005,進入Visual Studio 2005 x64 Win64 Command Prompt(單純的cmd也不一定不行,我沒試)。把bjam.exe放在boost根目錄下,進入根目錄,執行:

    bjam --toolset=msvc address-model=64 --with-thread stage
    bjam --toolset=msvc address-model=64 --with-date_time stage
    關鍵選項:“address-model=64 ”
    64位Linux平臺,使用gcc編譯。進入boost根目錄,執行:
    ./bjam --toolset=gcc --with-thread stage
    ./bjam --toolset=gcc --with-date_time stage
    linux平臺下倒是簡單,不過網上有篇文章介紹用如下命令編譯,不知道是多此一舉,還是適用于某些情況(非64位linux主機?)。
    ./bjam --toolset=gcc "-sBUILD=release <cxxflags>-m64" --with-thread stage
    ./bjam --toolset=gcc "-sBUILD=release <cxxflags>-m64" --with-date_time stage
 
    唉。命令都很簡單,可浪費了我不少時間。usage根本沒寫,去看boost build的嘛,頁數n多不說,看完之后能否找到答案還是未知數。網上相關資料很少而且大多南轅北轍,只好一直搜索+嘗試。其實我只是想要個64位版本的庫而已,這應該不是啥稀罕的需求吧?
   在windows平臺下,編譯出來的是否是64位類庫,只有link 64位程序的時候才能發現。如果不是,link程序無法找到類庫中定義的函數或者類。linux不知道,因為我整出來直接就是64位了,我也懶得再找一臺32位linux主機折騰了。
posted @ 2015-03-08 17:57 Enic 閱讀(382) | 評論 (0)編輯 收藏

并發編程幾個基礎庫:
C++ REST SDK

C++ PPL
C++ TBB

OpenMP
OpenAMP
OpenCL
CUDA

posted @ 2015-02-10 19:03 Enic 閱讀(147) | 評論 (0)編輯 收藏

前言

    在大家使用github的過程中,一定會碰到這樣一種情況,就是每次要push 和pull時總是要輸入github的賬號和密碼,這樣不僅浪費了大量的時間且降低了工作效率。在此背景下,本文在網上找了兩種方法來避免這種狀況,這些成果也是先人提出來的,在此只是做個總結。

1.方法一 

1.1 創建文件存儲GIT用戶名和密碼

在%HOME%目錄中,一般為C:\users\Administrator,也可以是你自己創建的系統用戶名目錄,反正都在C:\users\中。文件名為.git-credentials,由于在Window中不允許直接創建以"."開頭的文件,所以需要借助git bash進行,打開git bash客戶端,進行%HOME%目錄,然后用touch創建文件 .git-credentials, 用vim編輯此文件,輸入內容格式:

touch .git-credentials

vim .git-credentials

https://{username}:{password}@github.com

1.2 添加Git Config 內容

進入git bash終端, 輸入如下命令:

git config --global credential.helper store

執行完后查看%HOME%目錄下的.gitconfig文件,會多了一項:

[credential]

    helper = store

重新開啟git bash會發現git push時不用再輸入用戶名和密碼

2.方法二

2.1 添加環境變量

在windows中添加一個HOME環境變量,變量名:HOME,變量值:%USERPROFILE%

2.2 創建git用戶名和密碼存儲文件

進入%HOME%目錄,新建一個名為"_netrc"的文件,文件中內容格式如下:

machine {git account name}.github.com
login your-usernmae
password your-password

重新打開git bash即可,無需再輸入用戶名和密碼

posted @ 2015-01-31 12:59 Enic 閱讀(195) | 評論 (0)編輯 收藏

個人的成功:從依賴到獨立
習慣一:積極主動——個人愿景的原則
習慣二:以終為始——自我領導的原則
習慣三:要事第一——自我管理的原則
第三部分 公眾的成功:從獨立到互賴
習慣四:雙贏思維——人際領導的原則
習慣五:知彼知己——同理心交流的原則
習慣六:統合綜效——創造性合作的原則
習慣七:不斷更新——平衡的自我更新的原則
再次由內而外造就自己
posted @ 2015-01-27 10:24 Enic 閱讀(130) | 評論 (0)編輯 收藏

隱藏MFC對話框程序主窗口:
1.不在桌面任務欄顯示
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
2.使用SetPos設置0
::SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0, 0);

關閉主窗口對話框:
CDialog* pDlg =reinterpret_cast<CDialog*>(AfxGetApp()->GetMainWnd());
  pDlg->EndDialog(IDOK);

posted @ 2015-01-19 19:34 Enic 閱讀(504) | 評論 (0)編輯 收藏

僅列出標題
共22頁: First 3 4 5 6 7 8 9 10 11 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久亚洲午夜电影| 亚洲在线成人精品| 欧美自拍丝袜亚洲| 欧美成人高清视频| 美日韩精品视频免费看| 国产一区二区观看| 亚洲精品影院| 久久午夜电影| 欧美亚洲网站| 国产欧美一区二区三区沐欲 | 一本大道久久精品懂色aⅴ| 久久九九久精品国产免费直播| 亚洲国产小视频| 欧美美女喷水视频| 91久久亚洲| 国产美女搞久久| 午夜精品久久久久久久| 国产伦精品一区二区三区在线观看 | 亚洲女人天堂成人av在线| 免费91麻豆精品国产自产在线观看| 国产一区二区三区丝袜| 午夜日韩激情| 亚洲天堂av在线免费| 欧美日本亚洲视频| 亚洲视频碰碰| 夜夜嗨av一区二区三区中文字幕| 欧美黑人在线观看| 亚洲美女中出| 一区二区高清在线观看| 国产精品福利久久久| 欧美一区二区黄| 欧美一级视频精品观看| 狠狠色狠狠色综合| 欧美高清视频在线| 欧美成人精品一区| 亚洲精品日韩欧美| 国产精品美女久久久久久久| 亚洲乱码国产乱码精品精可以看| 蜜桃av一区二区| 亚洲精品在线观看视频| 亚洲精品视频免费观看| 国产精品乱子乱xxxx| 久久福利一区| 可以看av的网站久久看| 99国产一区| 亚洲一区二区三区成人在线视频精品| 国产精品白丝jk黑袜喷水| 香蕉亚洲视频| 久久综合影音| 亚洲综合色视频| 欧美一区二区三区免费看| 久久久久久久久伊人| 久久精品天堂| 在线观看欧美| 亚洲免费av片| 国产专区精品视频| 亚洲激情视频网站| 国产久一道中文一区| 亚洲高清久久网| 国产精品尤物福利片在线观看| 久久野战av| 欧美午夜精品久久久久久久| 久久综合九色欧美综合狠狠| 欧美亚洲日本网站| 午夜精品一区二区三区在线视 | 亚洲欧美日韩区| 亚洲免费精品| 中文在线资源观看网站视频免费不卡 | 久久免费精品视频| 亚洲午夜精品网| 久久久久在线| 欧美一区二区三区精品| 欧美久色视频| 巨乳诱惑日韩免费av| 国产精品第2页| 亚洲国产精品第一区二区| 国产亚洲一区二区在线观看| 一本色道**综合亚洲精品蜜桃冫| 在线播放中文字幕一区| 亚洲一区二区三区精品视频| 欧美一区午夜精品| a91a精品视频在线观看| 母乳一区在线观看| 久久久久久夜精品精品免费| 国产精品美女www爽爽爽视频| 亚洲全部视频| 亚洲乱码国产乱码精品精| 玖玖玖国产精品| 欧美sm视频| 亚洲国产另类精品专区| 久久综合久久久| 免费观看成人www动漫视频| 好吊色欧美一区二区三区四区 | 中国成人黄色视屏| 99爱精品视频| 欧美精品久久久久久久久老牛影院 | 国产精品第一区| 久久综合色一综合色88| 亚洲欧美日韩国产成人精品影院| 欧美高清视频一区| 亚洲国产高清一区| 亚洲精品免费在线播放| 欧美本精品男人aⅴ天堂| 欧美激情国产精品| 91久久精品一区二区三区| 麻豆freexxxx性91精品| 亚洲成色777777女色窝| 亚洲精品久久久久久久久久久| 美女视频黄 久久| 最新热久久免费视频| 一区二区三区毛片| 国产精品日本精品| 欧美伊久线香蕉线新在线| 男女精品视频| 一区二区高清视频在线观看| 欧美午夜电影一区| 欧美在线免费视频| 亚洲成色777777女色窝| 亚洲综合色在线| 国产日韩在线看片| 久久综合久久88| 99这里只有久久精品视频| 欧美一区观看| 亚洲国产精品第一区二区三区| 欧美成人免费在线| 一区二区欧美国产| 久久久久成人精品| 日韩视频在线观看免费| 国产精品女主播在线观看| 久久不见久久见免费视频1| 欧美黄在线观看| 亚洲午夜精品视频| 黄色一区二区三区| 欧美日韩另类字幕中文| 欧美一区二区视频网站| 亚洲国产精品尤物yw在线观看| 亚洲综合成人在线| 亚洲国产高清在线| 国产精品网站在线观看| 久久久www成人免费无遮挡大片 | 欧美日韩成人在线观看| 久久精品国产欧美激情| 日韩一区二区精品在线观看| 久久久久久久久岛国免费| 日韩一二在线观看| 国内久久精品| 国产精品区一区二区三| 欧美精品日韩综合在线| 久久精品水蜜桃av综合天堂| 国产字幕视频一区二区| 亚洲一区二区三区四区在线观看| 欧美国产在线电影| 久久久之久亚州精品露出| 国模精品一区二区三区色天香| 亚洲一区二区高清| 亚洲一级电影| 国产一区再线| 欧美激情小视频| 欧美日韩高清在线一区| 久久精品国亚洲| 亚洲视频一区在线| 亚洲永久免费观看| 欧美一区二区三区视频在线| 亚洲欧洲中文日韩久久av乱码| 国产欧美综合一区二区三区| 欧美日韩成人一区二区| 欧美成人日本| 蜜臀91精品一区二区三区| 久久精品国产久精国产爱| 香蕉久久国产| 亚洲专区一二三| 日韩视频免费观看高清在线视频| 欧美国产日韩一区二区| 美女精品在线| 美女精品视频一区| 女女同性女同一区二区三区91| 欧美高清视频一区二区三区在线观看 | 久久一区视频| 午夜亚洲影视| 欧美伊人久久久久久午夜久久久久| 亚洲国产高潮在线观看| 18成人免费观看视频| 好吊色欧美一区二区三区四区 | 六月天综合网| 亚洲电影中文字幕| 99国产精品久久久久久久| 欧美日韩情趣电影| 女生裸体视频一区二区三区| 国产一区二区三区四区老人| 亚洲香蕉网站| 欧美一区=区| 亚洲欧洲一区二区在线播放| 久久久一本精品99久久精品66| 欧美日本亚洲视频| 亚洲私人影院在线观看| 久久久女女女女999久久| 欧美一区二区三区啪啪| 国产精品国色综合久久| 亚洲精品系列| 亚洲一本视频|