shell 是作業系統的最外層。shell 合併程式語言以控制進程和檔案,以及啟動和控制其它程式。shell 通過提示您輸入,向作業系統解釋該輸入,然後處理來自作業系統的任何結果輸出來管理您與作業系統之間的互動。
基本介紹
- 外文名:shell
- 類別:作業系統
- 套用:編程技術
- 常見:在ARM技術里有很廣的套用
基本概述
實現方法
…… SHFILEOPSTRUCT FileOp; //外殼的檔案操作結構 FileOp.hwnd=m_hWnd; //設定句柄 //設定操作方式,拷貝用FO_COPY,刪除用 FO_DELETE FileOp.wFunc=FO_COPY; FileOp.pFrom=m_source; //源檔案路徑 FileOp.pTo=m_detect; //目標檔案路徑 FileOp.fFlags=FOF_ALLOWUNDO; //允許恢復 FileOp.hNameMappings=NULL; FileOp.lpszProgressTitle=strTitle; //設定標題 SHFileOperation(&FileOp); //執行外殼拷貝 if(FileOp.fAnyOperationsAborted) //監測有無中止 TRACE("An Operation was aborted!!!\n"); …… |
…… CoInitialize(NULL); //初始化COM …… CoUninitialize(); //終止COM代碼 …… |
…… EXTERN_C const IID IID_IShellDispatch; #if defined(__cplusplus) && !defined(CINTERFACE) interface DECLSPEC_UUID("D8F015C0-C278-11CE-A49E-444553540000") IShellDispatch : public Idispatch { public: …… virtual HRESULT STDMETHODCALLTYPE MinimizeAll( void) = 0; virtual HRESULT STDMETHODCALLTYPE UndoMinimizeALL( void) = 0; virtual HRESULT STDMETHODCALLTYPE FileRun( void) = 0; virtual HRESULT STDMETHODCALLTYPE CascadeWindows( void) = 0; virtual HRESULT STDMETHODCALLTYPE TileVertically( void) = 0; virtual HRESULT STDMETHODCALLTYPE TileHorizontally( void) = 0; virtual HRESULT STDMETHODCALLTYPE ShutdownWindows( void) = 0; virtual HRESULT STDMETHODCALLTYPE Suspend( void) = 0; virtual HRESULT STDMETHODCALLTYPE SetTime( void) = 0; virtual HRESULT STDMETHODCALLTYPE TrayProperties( void) = 0; virtual HRESULT STDMETHODCALLTYPE Help( void) = 0; virtual HRESULT STDMETHODCALLTYPE FindFiles( void) = 0; virtual HRESULT STDMETHODCALLTYPE FindComputer( void) = 0; }; …… |
…… HRESULT sc;//返回結果 IShellDispatch *pShellDisp = NULL; //初始化接口指針 //直接創建COM對象 sc = CoCreateInstance( CLSID_Shell,//指定待創建的COM對象標識符 NULL, //指定被聚合時的外部對象的接口指針 CLSCTX_SERVER, //指定組件類別,可以指定進程內組件進程外組件或者進程內控制對象。 IID_IDispatch, //指定接口ID,需要注意的是這裡指的是待 //創建的COM對象的接口ID,而非類廠對象的接口標識符 (LPVOID *) &pShellDisp );//存放函式返回的對象的接口指針 /* 在上述代碼中,CoCreateInstance首先調用CoGetClassObject函式創建類廠對象,然後用得到的類廠對象的接口指針創建真正的COM對象,最後把類廠對象釋放並返回,這樣就很好的把類廠禁止起來,使用戶用起來更為簡單。*/ if( FAILED(sc) )//必須用FAILED 或SUCCECCED來判斷COM對象是否創建成功 return; pShellDisp->FindFiles(); //調用COM對象里的方法 pShellDisp->Release(); //釋放申請到的接口指針 …… |
編程步驟
常用技巧
編程過程
///////////////////////////////////// #define INC_OLE2 #define WIN32_LEAN_AND_MEAN #define STRICT #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <shlguid.h> #include <exdisp.h> #include “taskbar.h” #include “resource.h” // data static WNDPROC g_pfnOldProc; static HWND g_hwndButton=NULL; static HWND g_hDlg=NULL; static HINSTANCE g_hInstance; static HICON g_hIconLarge; static HICON g_hIconSmall; // functions static VOID OnRunPrograms( VOID ); static VOID OnFindFiles( VOID ); static VOID OnMinimizeAll( VOID ); static VOID OnUndoMinimize( VOID ); static VOID OnTaskbarProperties( VOID ); static VOID OnAddTab( HWND ); static VOID OnDeleteTab( VOID ); static VOID OnInitDialog( HWND ); static VOID OnButtonActivation( VOID ); // callbacks LRESULT CALLBACK APP_DlgProc( HWND, UINT, WPARAM, LPARAM ); LRESULT CALLBACK ButtonProc( HWND, UINT, WPARAM, LPARAM ); INT APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpsz, INT iCmd ) { BOOL b; g_hIconLarge = (HICON) LoadImage( hInstance, “APP_ICON”, IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0 ); g_hIconSmall = (HICON) LoadImage( hInstance, “APP_ICON”, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), 0 ); // initialize OLE libraries CoInitialize(NULL); InitCommonControls(); // run main dialog g_hInstance = hInstance; b = DialogBox( hInstance, “DLG_MAIN”, NULL, (DLGPROC)APP_DlgProc ); // exit DestroyIcon( g_hIconLarge ); DestroyIcon( g_hIconSmall ); // free the objects used by ITaskbarList DestroyWindow( g_hwndButton ); OnDeleteTab(); CoUninitialize(); return b; }LRESULT CALLBACK APP_DlgProc( HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam ) { switch( uiMsg ) { case WM_INITDIALOG: OnInitDialog( hDlg ); break; case WM_COMMAND: switch( wParam ) { case IDC_FINDFILES: OnFindFiles(); return 1; case IDC_RUNPROGRAMS: OnRunPrograms(); return 1; case IDC_MINIMIZE: OnMinimizeAll(); return 1; case IDC_UNDOMINIMIZE: OnUndoMinimize(); return 1; case IDC_PROPERTIES: OnTaskbarProperties(); return 1; case IDC_ADDTAB: OnAddTab( hDlg ); return 1; case IDC_DELETETAB: OnDeleteTab(); return 1; case IDCANCEL: EndDialog( hDlg, FALSE ); return 0; } break; } return 0; } VOID OnFindFiles( VOID ) { HRESULT sc; IShellDispatch *pShellDisp = NULL; sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID *) &pShellDisp ); if( FAILED(sc) ) return; pShellDisp->FindFiles(); pShellDisp->Release(); return; } VOID OnTaskbarProperties( VOID ) { HRESULT sc; IShellDispatch *pShellDisp = NULL; sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER,IID_IDispatch, (LPVOID *) &pShellDisp ); if( FAILED(sc) ) return; pShellDisp->TrayProperties(); pShellDisp->Release(); return; } VOID OnRunPrograms( VOID ) { HRESULT sc; IShellDispatch *pShellDisp = NULL; sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER, IID_IShellDispatch, (LPVOID *) &pShellDisp ); if( FAILED(sc) ) return; pShellDisp->FileRun(); pShellDisp->Release(); return; } VOID OnMinimizeAll( VOID ) { HRESULT sc; IShellDispatch *pShellDisp = NULL; sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID *) &pShellDisp ); if( FAILED(sc) ) return; pShellDisp->MinimizeAll(); pShellDisp->Release(); return; } VOID OnUndoMinimize( VOID ) { HRESULT sc; IShellDispatch *pShellDisp = NULL; sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID *) &pShellDisp ); if( FAILED(sc) ) return; pShellDisp->UndoMinimizeALL(); pShellDisp->Release(); return; } VOID OnInitDialog( HWND hDlg ) { // set the icons (T/F as to Large/Small icon) g_hDlg = hDlg; SendMessage( hDlg, WM_SETICON, FALSE, (LPARAM)g_hIconSmall ); SendMessage( hDlg, WM_SETICON, TRUE, (LPARAM)g_hIconLarge ); } VOID OnAddTab( HWND hWnd ) { static BOOL g_bFirstTime=TRUE; HRESULT sc; ITaskbarList *pDisp = NULL; sc = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_SERVER, IID_ITaskbarList, (LPVOID *) &pDisp ); if( FAILED(sc) ) return; // call the first time only if( g_bFirstTime ) { g_bFirstTime = FALSE; pDisp->HrInit(); // create a new button window g_hwndButton = CreateWindow( “button”, “My Button”, WS_CLIPSIBLINGS|BS_PUSHBUTTON,0, 0, 58, 14, hWnd, NULL, g_hInstance, NULL ); g_pfnOldProc = (WNDPROC) SubclassWindow( g_hwndButton, ButtonProc ); } pDisp->AddTab( g_hwndButton ); pDisp->Release(); return; } VOID OnDeleteTab( VOID ) { HRESULT sc; ITaskbarList *pDisp = NULL; sc = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_SERVER, IID_ITaskbarList, (LPVOID *) &pDisp ); if( FAILED(sc) ) return; pDisp->DeleteTab( g_hwndButton ); pDisp->Release(); return; } LRESULT CALLBACK ButtonProc( HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam ) { switch( uiMsg ) { case WM_NCACTIVATE: if( wParam==TRUE ) OnButtonActivation(); break; } return CallWindowProc( g_pfnOldProc, hwnd, uiMsg, wParam, lParam ); } VOID OnButtonActivation( VOID ) { HMENU hmenu; RECT r; LONG x, y; // get some window handles HWND h0=FindWindow(“Shell_TrayWnd”, NULL ); HWND h1=FindWindowEx(h0,NULL,”RebarWindow32″, NULL); HWND h2=FindWindowEx(h1,NULL,”MSTaskSwWClass”, NULL); HWND h3=FindWindowEx(h2,NULL,”SysTabControl32″, NULL); GetWindowRect( h3, &r ); // get the currently selected button and // create a new popup menu hmenu = CreatePopupMenu(); INT i=TabCtrl_GetCurSel( h3 ); if( i==-1 ) { AppendMenu( hmenu, MF_STRING, IDC_DELETETAB,”&Close” ); } else { AppendMenu( hmenu, MF_STRING, IDC_MINIMIZE,”&Minimize All” ); AppendMenu( hmenu, MF_STRING, IDC_UNDOMINIMIZE,”&Undo Minimize All” ); AppendMenu( hmenu, MF_SEPARATOR, 0, NULL ); AppendMenu( hmenu, MF_STRING, IDC_PROPERTIES,”&Taskbar Properties” ); } // set and immediately reset its size to get // the current width and height LONG l = TabCtrl_SetItemSize( h3, 0, 0 ); TabCtrl_SetItemSize( h3, LOWORD(l), HIWORD(l) ); // have the menu to appear just above the button if( i==-1 ) { POINT pt; GetCursorPos( &pt ); x = pt.x; y = pt.y; } else { x = r.left + LOWORD(l)*i+3; y = GetSystemMetrics(SM_CYSCREEN)-(HIWORD(l)+1); } TrackPopupMenu( hmenu, TPM_BOTTOMALIGN, x, y, 0, g_hDlg, 0); DestroyMenu( hmenu ); return; } |
課程大綱
第1章 簡介及基礎
- shell是什麼,為什麼要學習shell
- shell發展史及分類
- bash功能簡介
- 部署設定bash環境
- shell腳本組成、運行模式及執行方法
- bash排錯方法
- 父shell和子shell
- 常用快捷鍵
第2章 變數
- 變數分類
- 內部變數
- 預定義變數
- 自定義變數及基本用法
- 數組
- 特殊字元
- 別名
- Here Document
- 列印特殊字元
第3章 循環結構與流程控制
- if條件判斷
- case條件判斷
- for循環
- while循環
- until循環
- select命令
- break和continue
第4章 函式
- 函式用法
- 函式作用範圍
- 參數使用
- 建立函式館
- 遞歸函式
第5章 算術運算
- 算術式簡介
- 算術擴展
- 利用expr做算術運算
- 使用$[]做算術運算
- 使用內置變數declare、let做算術運算
- 利用bc做浮點運算
- 進制轉換
第6章 重定向與轉向
- 檔案代碼
- 操作檔案
- 輸入輸出轉向
- 轉向附加
- 標準錯誤伴隨輸出轉向
- Here Document轉向
第7章 高級變數與字元串操作
- 變數擴展:測試存在性及空值
- 變數擴展:取字元串切片,字元串長度
- 變數擴展:對比樣式
- 變數擴展:取變數名稱列表,數組索引列表
- 命令替換
第8章 正則表達式
- 入門介紹
- 元字元
- 字條轉義
- 重複
- 字元類
- 分支條件
- 反義
- 分組
- 後向引用
- 零寬斷言與負向零寬斷言
- 貪婪與懶惰
- 注釋
- 處理選項
- 平衡組/遞歸匹配
第9章 sed編輯器
- sed介紹
- sed基本語法
- sed調用方式
- sed高級用法
第10章 awk學習
- awk原理介紹
- awk基本語法
- awk調用方式
- awk循環語句
- awk函式
- awk數組
- awk的BEGIN和END模式
- awk數學運算和字元串操作
- awk重定向輸出
- awk與bash之間傳參調用
- awk調試方法
第11章 文字與圖形接口編程
- dialog文本接口編程
- xdialog圖形接口編程
第12章 bash網路編程
- bash網路轉向
- 遠程執行命令
- expect與自動登錄
第13章 trap陷阱觸發
- 信號signal
- trap運用
第14章 shell腳本加密與包裝
- 加密shell腳本
- 生成二進制執行檔
第15章 shell中常用命令介紹
- grep命令詳解
- find與xargs
- sort和uniq命令詳解
- cut命令詳解
- curl與wget命令詳解
- cat、tac與rev
- tr命令詳解
- paste命令詳解
- join命令詳解
第16章 一些shell技巧
- 利用腳本修改密碼
- 判斷奇偶
- 添加行號與刪除行號
- 刪除行首空格,刪除重複行
- 合併行操作
- 逐行讀取操作
- 字元與ASCII碼轉換操作
- 連線mysql資料庫操作
第17章 shell十三問
- PS1和CR的關係
- echo知多少
- “”(雙綽號)與”(單引號)差在哪兒
- export前後差在哪兒
- exec跟source差在哪兒
- ()與{}差在哪兒
- $(())和$()、${}差在哪兒
- $@和$*差在哪兒
- &&和||差在哪兒
- >和<差在哪兒
- 你要if還是case
- for what?while和until差在哪兒?
- [^ ]和[! ]差在哪兒
第18章 綜合實戰講解一
- 系統信息收集腳本
- 備份腳本
- 日誌切割腳本
- nagios監控外掛程式腳本
- 發郵件腳本
第19章 綜合實戰講解二
- 系統初始化腳本
- 基礎軟體安裝腳本
- iptables腳本
- 線上操作記錄審核腳本
- 文本完整性審核腳本
- kickstart配置腳本