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

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>
            久久在精品线影院精品国产| 国产精品国产三级国产普通话三级| 欧美国产日韩一区二区| 久久久中精品2020中文| 亚洲在线观看视频网站| 亚洲性人人天天夜夜摸| 亚洲精品欧美一区二区三区| 亚洲欧洲一区二区三区在线观看| 亚洲精品国产日韩| 99天天综合性| 亚洲欧美国产视频| 午夜国产精品视频| 久久精品亚洲| 欧美天天影院| 欧美性理论片在线观看片免费| 欧美日韩在线综合| 国产日韩综合| 国产一区二区三区av电影 | 亚洲精品一区在线观看香蕉| 一本色道久久综合亚洲精品按摩| av成人黄色| 欧美伊久线香蕉线新在线| 久久成人精品无人区| 久久超碰97人人做人人爱| 免费永久网站黄欧美| 欧美精品三级| 国产一区二区三区网站| 亚洲国产美国国产综合一区二区| 99视频在线观看一区三区| 午夜视频一区二区| 亚洲电影一级黄| 国产精品99久久久久久人| 久久字幕精品一区| 国产精品女主播在线观看 | 国产婷婷色一区二区三区在线| 樱桃成人精品视频在线播放| 欧美国产视频一区二区| 国产精品二区二区三区| 亚洲电影一级黄| 欧美在线|欧美| 亚洲第一页中文字幕| 亚洲综合欧美日韩| 欧美超级免费视 在线| 国产精品久久午夜夜伦鲁鲁| 亚洲欧洲精品天堂一级| 亚洲欧美成人一区二区三区| 老司机精品导航| 亚洲欧美bt| 欧美日韩另类在线| 亚洲国产日韩欧美一区二区三区| 久久国产天堂福利天堂| 99天天综合性| 欧美91福利在线观看| 影音先锋亚洲电影| 亚洲免费一在线| 亚洲精品一区二区三区蜜桃久| 久久久久久综合网天天| 国产在线国偷精品产拍免费yy| 午夜电影亚洲| 亚洲一区二区四区| 欧美三区美女| 宅男噜噜噜66国产日韩在线观看| 乱中年女人伦av一区二区| 欧美在线观看网址综合| 国产精品国产福利国产秒拍| 亚洲一区三区视频在线观看| 一区二区av在线| 亚洲欧美影音先锋| 欧美午夜电影在线观看| 亚洲自拍高清| 99精品热视频| 国产精品s色| 亚洲欧美一区在线| 亚洲欧美一区在线| 伊人伊人伊人久久| 欧美成人日韩| 欧美激情小视频| 一区二区高清在线| 亚洲综合清纯丝袜自拍| 国产在线一区二区三区四区| 嫩草国产精品入口| 欧美精品一区二区三区一线天视频| 在线亚洲电影| 亚洲男人第一网站| 1000部国产精品成人观看| 91久久中文字幕| 欧美特黄一级大片| 久久av红桃一区二区小说| 久久婷婷国产综合精品青草| 亚洲欧洲日本mm| 一二美女精品欧洲| 精品动漫3d一区二区三区免费版 | 久久偷窥视频| 99国产麻豆精品| 亚洲欧美伊人| 亚洲精品欧美精品| 亚洲字幕在线观看| 在线视频观看日韩| 9色精品在线| 国产一区在线观看视频| 最新亚洲激情| 国产午夜精品久久久久久免费视| 免费不卡在线视频| 欧美日本免费| 久久精品日韩| 欧美精品久久99| 久久成人精品视频| 欧美精品久久99久久在免费线| 久久精品国产清自在天天线| 美女国内精品自产拍在线播放| 一个色综合av| 久久男女视频| 亚洲欧美在线另类| 蜜臀久久99精品久久久画质超高清 | 亚洲日韩成人| 国产精品高潮呻吟视频 | 这里是久久伊人| 国产视频亚洲| 亚洲精品美女免费| 在线观看一区二区视频| 一二三区精品| 夜夜嗨一区二区三区| 久久久久国产精品麻豆ai换脸| 亚洲欧美日韩国产另类专区| 亚洲高清一二三区| 亚洲一区二区三区午夜| 亚洲人成高清| 久久gogo国模裸体人体| 亚洲专区一区二区三区| 久久人人爽人人| 久久久久综合一区二区三区| 国产精品久久久久9999| 亚洲区中文字幕| 亚洲精品美女在线观看| 久久激情中文| 久久精品99国产精品| 国产精品男女猛烈高潮激情| 亚洲久久视频| 夜夜夜精品看看| 久久久综合香蕉尹人综合网| 欧美在线影院在线视频| 国产精品一区在线观看你懂的| 亚洲精品视频在线观看免费| 一区二区三区精品国产| 欧美日韩日本网| 亚洲日本aⅴ片在线观看香蕉| 亚洲美洲欧洲综合国产一区| 欧美高清在线一区| 欧美日韩国产综合新一区| 亚洲精品久久嫩草网站秘色 | 欧美激情视频一区二区三区在线播放 | 欧美一区二区三区免费视| 亚洲在线一区二区三区| 国产精品jvid在线观看蜜臀| 亚洲欧美日韩精品久久久| 亚洲午夜在线视频| 欧美日韩1区2区| 亚洲在线成人| 久久全球大尺度高清视频| 激情亚洲网站| 欧美黄色成人网| 一本色道久久综合亚洲精品高清| 亚洲免费在线观看| 国产一区二区三区不卡在线观看| 性做久久久久久| 欧美成年视频| 亚洲片区在线| 欧美日韩妖精视频| 性色av一区二区三区在线观看| 久久久999国产| 91久久久亚洲精品| 欧美日韩亚洲一区三区| 亚洲欧美日韩国产一区二区| 麻豆乱码国产一区二区三区| 亚洲激情六月丁香| 国产精品美女xx| 另类春色校园亚洲| 亚洲欧洲综合另类在线| 欧美亚洲视频在线观看| 亚洲国产成人一区| 国产精品av久久久久久麻豆网 | 欧美日韩成人在线| 久久综合网络一区二区| 亚洲激情不卡| 国产日韩欧美三区| 免费h精品视频在线播放| 亚洲永久在线| 亚洲卡通欧美制服中文| 香蕉久久精品日日躁夜夜躁| 亚洲精品在线免费| 国产在线乱码一区二区三区| 欧美日韩美女在线| 久久三级福利| 亚洲男人的天堂在线aⅴ视频| 91久久香蕉国产日韩欧美9色| 久久亚洲综合色| 欧美一区二区三区视频在线观看| 亚洲第一久久影院| 国产在线不卡| 国产欧美精品|