Advanced Windows Programming

Google
 




新的網頁版本





加入書籤: del.icio.us HEMiDEMi(黑米書籤)

井民全
mqJing@msn.com


text book

課程內容:

  這門課基本上是討論 Win32程式在視窗作業系統下運行的觀念. 你會學習到如何撰寫國際化的程式(Unicode). 視窗如何管理每個程序(Processes)以及記憶體的放置位置, 撰寫多執行緒的程式並且處理多執行緒的同步問題,你也將學習到如何使用虛擬記憶體,並且自行將你的 function 寫成 DLL 散佈給你的客戶.

另外, 你會知道.如 何註冊一個事件,並且當事件發生時自動呼叫你的程式, 如何知道系統中有別的process存在(防止別人執行你的程式兩次). 我們會討論到一些: 如何取得攝影機的影像, DirectX 程式設計的簡介, 如何像防毒軟體把程式狀態秀在system tray中. 不規則視窗, 如何得知 USB 裝置已經 ready好了, ... 等比較進階的課題.

最後, 我們還會提到如何將你的程式,隱藏在"受害者"的程式中,讀取該程式的資料. 如果有時間,我會教你如何利用 PE 檔的天然特性,欺騙程式讓他執行你的 function, 還有一些進階的課題. 希望大家能學到東西.

 




 
 

 

Course Contents:

 Windows基本概念   Introduction to the Windows Programming    Unicode 簡介    Kernel Object 簡介   

 

 行程 與 執行緒

  Process

   THREAD BASICS    Thread Scheduling  

 

 同步機制   Thread Synchronization in User Mode    Thread Synchronization with kernel object      

 

 記憶體管理機制

  Windows Memory Architecture

Using Virtual Memory in your application

Heap & AWE

 

 

 DLL 呼叫

  DLL_Basics & Advanced Topic 

   DLL Injection Topic

   

 

 (補充) A Thread's Stack      
   
 

 

Advanced Topics:

 Using Video Capture

 DirectX 9.0 簡介
 
 

 Windows Shell Programming

 Hardware Notification 簡單範例  

 

撰寫 Windows Services 簡單範例

   

Other Topics:

 
 影像處理部分

 Using Image Encoders and Decoders

   

 

       
       
       
       


 

Outline

 Content

(上課時,投影片會包含補充的部分

並做小幅的更改)

 

00 Introduction to the Windows Programming

      - 視窗與訊息

      - 使用 DDX DDV 操作控制項的資料

      - 讀取 / 設定 Edit Control 的字串 (使用指標)

 

 

 Tips

 

  ErrorFomat your error Message  

  view 

   
MemoryWin32 配置Heap記憶體
 
 
ExecutionFile得知目前執行檔位置
 
Hotkeys讀取任意視窗下使用者的鍵盤輸入(熱鍵 Alt+D的實作)
 
Firefoxlogo取得使用者預設瀏覽器
(Default Browser)

labelPicture設定按鈕表面的
CButton SetBitmap

MouseLocation取得滑鼠目前的位置 GetCursorPos

labelPicture 用 Cstatic 顯示一張
combox.png 使用 combox 最簡單範例

StretchBmp放大縮小圖形 CImage Resize

=> 使用 StretchBlt 方式把一張圖畫到另一個 CImage 上面. 在縮小與放大的過程, 使用 最高品質的 HALFTONE進行處理.

HotTracking Hot Tracking

這是使用 Timer 來實作 OnMouseEnterOnMouseLeave 完成

EnumWindows
最簡單範例
-- 找出目前正在編輯的 Dreamweaver window handle
CListCtrl 最簡單範例

檢查檔案狀態
最簡單範例
- 是否為目錄, 是否為檔案, 是否有存取權限, 檔案或目錄是否存在 (使用 GetFileAttributes API)

開啟簡單目錄瀏覽器
簡單範例
(使用 SHBrowseForFolder API)

 

 Tips

 

namespace  如何定義類別 namespace   

  view 

 

 講義: (視窗與訊息)  ( ppt)

               (使用 DDX 與 DDV 操作控制項的資料)  ( ppt)

               (讀取 / 設定 Edit Control 的字串) ( ppt)

           (建立不規則形狀的視窗)  ( ppt)

 

 a. 秀出視窗範例 Win32

   c++    wav

 b. 簡單的 DDX與DDV範例

 

 自行修改 DDV 的預設行為

  

  c++

 

  VS.net project

==> 另一個簡單的 方法就是直接使用精靈加入一個 Control 項的變數. 不過在這裡要注意的是必須要加入下面這行:

BOOL 你的類別::OnInitDialog(void)
{
__super::OnInitDialog();
// .....

} 

 

 

 

 

  c++

 

  VS.net project

 c. 利用指標存取 Edit Control

  c++

VS.net project

 d. 建立簡單的 Modeless

     Dialog 範例

 

  呼叫範例  建構範例

Mouse Position Delete 注意事項

  VS.net project

 

 e.  手動寫一個視窗

 

  c++

     自動控制其他視窗的位置

這個程式主要是展示

 (利用 SetWindowPos API)
1. 如何自動的移動位置或
2. 更改某個視窗的標題

 

  c++

完整專案

 (homework)

 模擬使用者按鈕

 

(Mouse Input )
如何模擬使用者按指定視窗的按鈕

(Keyboard Input C++)

c++

完整專案

        自訂處理按鈕事件   c++ h

  完整專案

 f. 建立一個各種形狀的視窗
c++  h

  專案下載

 Hint

  CreateRgnFromFile, Mask 圖形

 

  c++ 專案下載

 

BCB 版本

c++  h

專案下載

 (這部分程式碼是參考 Ref: http://visualcpp.net/index.php?qID=31)

 IPC (跨行程通訊)

傳送資料到另一個視窗

 使用 WM_COPYDATA message

     Hint:

    接收端 (ReceivedData)

    傳送端 (SendData)

 

 

 PostThreadMessage 問題解答:

       Thread Message Map in MFC [link]

                                                       專案下載

 

 

 01 Unicode 簡介

 

 =>  如果你想寫 Driver, 你必須知道 Unicode 的基本觀念. 因為 Windows 底層完全是 Unicode based 的字串處理方式.

 

 => Windows CE 是 Unicode, 散佈在小型裝置上的作業系統只吃 Unicode 的字串

 

=> 如何利用 String Table resource 撰寫國際化的程式

 

=> 如何使用比較安全的字串處理函式, 防止 buffer overrun 的問題

 Unicode簡介 (view)

 講義: (Unicode 基本觀念) ( ppt)

          

 

 a. CharLowerDemo   使用範例
 b. 判斷是否為 Unicode 字串   使用範例
 c. lstrcatDemo   使用範例
 d. String Safe functions 徹底解決字串 buffer overrun 問題

  StringCchCat

專案下載

 

 參考連結:

     Unicode 官方網站: http://www.unicode.org

 

 重要參考資料:

     Unicode 4.0 電子書 (view)

 

(補充- 解決字串  buffer overrun 的問題) ( ppt)

(補充- Face to the UTF-16 and Program) ( ppt)

(補充- 撰寫國際化程式) ( ppt)

 

 02 Kernel Object 簡介

 => Kernel Object 是 Windows 程式設計的核心, 例如 process 之間的同步,就需要知道 Kernel Object 的觀念. Thread 之間的同步也需要 kernel object. 瞭解 Kernel object 你會知道 Windows 如何管理 process, thread, Synchronization object.

 講義: (Kernel Object 簡介) (about 30 pages) ( ppt)

   

 a.使用繼承的方式共享

    Kernel Object

  Parent 專案下載

  Child  專案下載

 

 b. 防止你的程式重複被

     執行

(嘗試著執行兩次執行檔)

  Prevent_multiple_instances

專案下載

 c. 利用 CoCreateGuid 產生 GUID 範例

  CoCreateGuidDemo

   
 Homework:

* 基本: 請利用 GUID 的方式命名一個 kernel object 並且藉此防止你的程式被同時執行兩次

* 進階: 如何限制使用者,只能有兩個相同的 processes.     

    hint: 用兩個 named kernel object

 

 03 Process

 

 Tips

 

 得知目前 process 的 Handle 

 view 

   
   

 

 講義: (Console Application) (about 14 pages) ( ppt)

           (Process 基本觀念) (about 45 pages) ( ppt)

      

 a.  console application

     攔截 Ctrl+C, Ctrl+Break,

     Close Window, 登出,

     關機 signals

  SetConsoleCtrlHandler

  專案下載

 b. console application

    攔截 Mouse Event, Key

    Event

  SetConsoleModeDemo

  專案下載

 c. 移除 SubSystem Linker

     選項測試

  RemoveSubSystem

  專案下載

 d. 讀取 C/C++ global variable

     範例

 -- 判斷作業系統版本, 讀取

     命令列

  C/C++ globalvariable

  專案下載

 e. 向 _onexit() 註冊

     當 Processes 被 terminated

     時, 呼叫你的 function

  on_exit 範例

 f. 如何得知你的 module 被

    載入的位址?

  得到 module 載入位址

  專案下載

 g. 剖析你的 commandline

  ParsingYourCommandline

  專案下載

 h. 讀取環境變數

 

    如何用程式自動新增,刪

     除,判斷環境變數的範例

  ReadEnvironmentVar

  專案下載

 

  新增,刪除範例

  專案下載

 i. 利用 Registry 的方式, 新增修改,刪除,環境變數

 

  RegistryEnvoronentVar

  專案下載

 j. 當發生 Critical Error 時, 不要秀出錯誤視窗, 我們自己接手

  noCriticalErrorWindow

  專案下載

 h.

CreateToolhelp32Snapshot列舉出目前系統中正在執行的 process

 

  EnumerateAllProcesses

  專案下載

 

 

 作業: 

 請寫一程式能將系統中所有的 Notepad processes  全 close 掉

 繳交方式: 請你將你的心得寄給我

 心得: 可以包含應用範圍, 新想法 或與同學討論的

           結果 (或者是上面的範例程式, 你得到了什麼

           應用方面啟發)                  

 

 ----------------- 如果真的不行時, 才看答案 ------

 參考答案:  DeleteSpecifiedProcess

 

 04 THREAD BASICS

 講義:

               (MFC Working thread 簡單概念) (about 7 pages)

               (MFC UI thread 簡單概念)  (about 10 pages)

                (Thread 基本觀念)   ( about 40 pages)

     

 

最簡單的 Timer 設定 SetTimer SetTimer
 MFC 建立thread 最簡單範例 

 

使用者按下按鈕後,會自動建立一個新的 thread 執行拉動 slider 的動作
 

  

  afxBeginThread

  專案下載

 thread fun 放在 class 範例

  c++   h

 

  專案下載

  

 

 

 

 UI thread 最簡單範例

當使用者按下[確定]後, 會產生一個新的 UI thread, 啟動建立新的視窗.

  c++

  專案下載

 Win32 CreateThread

  最簡單範例

 

  c++

  專案下載

 thread on C/C++ run-time library

   1. _beginthreadex 簡單範例  c++   專案下載

      發出 thread 幫我們計算累加值

 

   2. _beginthread Demo1    c++   專案下載

       產生三個 thread, 並同時在 console 中秀出資

        料

   3. _beginthread Demo 2   c++   專案下載

       每隔一秒鐘建立一個新的thread
       並且在 console 視窗上, 以亂數的方式畫字元
 

 Local variable 與 Global variable c++   專案下載

 這個程式的目的在於驗證: Thread 使用自己的 Stack 存放 function 中的 local variable

 補充講義: 1  2
 

          

 05 Thread Synchronization in User Mode

 

 (執行速度相當快的同步物件)

 講義: (User Mode下的thread 同步物件 ) (about 33 Pages)

              

 

 InterLockedExchanged 使用範例  

  c++

  專案下載

 
__declspec(align(32))

新指令使用範例

 

  c++

  專案下載

 CriticalSection 使用範例  

  c++

  專案下載

 

 

 

   

 

 

 

 

 

 06 Thread Synchronization with kernel object

 講義: (Kernel Mode下的thread 同步物件  ) (about 34 pages)

                (非同步IO 概念  ) (補充)

              

 

 Event 使用範例

 

程式行為:

總共有三個 processes 分別為 Main, A, B. 其中利用 Event 進行同步的動作

 Create Event Demo

 c Main

 c A

  B

  專案下載

利用 Waitable Timer 同步範例

  

 首先執行 CreateWaitTimer.exe  建立Waitable Timer Kernel Object. 當使用者按下確定後, 設定 Timer 五秒鐘後, 自動 signal==> 使得等待的 Process 進行工作

 

Waitable Timer Demo

 

  Create Timer,

   Slider

  專案下載     

/

 

利用 Semaphore 提供有限資源的存取保護範例 

  

 * 共用資源只有 2 個名額
 * 只能有 2 threads 同時存取
 * 多的只能等待前面的取消

  SemaphoreDemo

SemaphoreDemo

                              最簡單的 mutex 範例

  Simple Mutex SimpleMutexDemo

 Mutex 與 Event Object 比較  MutexVS Event

 Asynchronous I/O

      - Asynchronous Write write 完整專案

      - Asynchronous Read read 完整專案

 

   

 

 

 Thread Scheduling

  - schedulable 與 not schedulable

  - 如何讓你的程式暫時停止執行,稍後啟動

  - 放棄自己的時間,讓別人執行

  - 設定 thread 的 priority  class / priority level

    與 priority boosts 的觀念

  - 如何知道你的演算法花了多久時間 ?

  - 測量你的 process 執行的時間

  - 如何存取 AX,BX,CX, IP 等暫存器

 講義: (控制 thread 的排程)  (about 38 pages)

 

 Suspend & Resume 最簡單範例

程式行為:
 Dialog 一開始, 就建立一個 thread 開始計數.

 [Suspend] 按鈕: 暫停 thread 計數工作
[Resume] 按鈕: 回復 thread

 

  Suspend&Resume

  完整專案 

 

設定 priority  class

 

 

 

設定相對的 priority level

==> 對 SwitchToThread 與各種 Sleep 組合的分析

 

  SetPriorityClassDemo

  完整專案

 

 

 

SetThreadPriority

  完整專案

 

   
   

 使用 GetThreadTime 計算你程式的執行時間

 

  GetThreadTimeDemo

  完整專案 

 

使用QueryPerformanceCounter

計算你的小片段程式的精確執行時間

  QueryPerformance

  完整專案 

 

   
設定指定 thread 的暫存器

  設定 Context 完整範

      

  完整專案 

 

 

 Using Virtual Memory in your application

 

 講義:

          (Windows 記憶體架構) (about 17 pages)

          (使用虛擬記憶體) (about 32 pages)

          (Page System 簡單介紹) (about 12 pages)

 

 
VirtualAlloc動態配置記憶體

 

 

VirtualAlloc

完整專案 

 Reserving 一塊記憶體,

 並且檢查記憶體的狀態

 

  VirtualQuery

  完整專案 

 CommitDemo 範例

 Reserving一塊記憶體, 並且分 page 一個一個 Commit 配置實體記憶體

  CommitDemo

  完整專案 

 

 更改記憶體的 protected 屬性  

  VirtualProtect

  完整專案 

 Reset Memory 範例

 對於暫存的區塊,你可以設定 MEM_RESET, 以增進 System Page 效能

  MemoryRESET

  完整專案 

 

 Reset Memory 範例 2

 利用 GlobalMemoryStatus 得知你系統 RAM 的數量, 強迫系統 Page falut,

 

  ForcePageFault

  完整專案 

 

 

 18 Heap

 - Heap 基本觀念

 - AWE 基本觀念以及使用範例

 講義: (Heap 基本觀念) (About 24 pages)

           (Address Windowing Extensions) (About 13 pages)

 

 建立自己的 heap 並且攔截例外

  HeapAllocExceptionDemo 完整專案

  HeapReAlloc 簡單範例

  HeapReAllocDemo

 AWE 配置範例

  AWEDemo

  完整專案 

 

 16 A Thread's Stack

 

 導讀:

   這部分讓你瞭解系統預設的 Stack 大小, 與你的陣列大小息息相關, 超過了就會發生 Exception.  另外你也可以藉由本章, 瞭解作業系統是如何配置實際的記憶體給每一條 thread.

 

 講義: ( thread 的堆疊狀態 )

 

 19 DLL_Basics & Advanced Topic

 

 - 共享你的資料 (針對小資料交換, 大資料請用Memory-Map File)

 

 

 * 多個 instance 同時執行以 page table, Virtual Memory , DLL 合在一起的討論 (與玟佑同學的討論)

( view)

 講義: ( DLL 基本觀念 ) implicity linking     (about 24 pages)

               ( Function Pointer ) 指向函式的指標 (about 6 pages)

               ( DLL 進階觀念 ) explicit linking (about 35 pages)

               ( Delay Load a DLL) (about 18 pages)

               ( Other Advanced Topic)

                

 建立DLL 範例   MyDLL header 範例

完整專案 

 使用 DLL 範例

  - include header

  - add the lib

  - set the path

  UseDLL

 Function Pointer 簡單範例

    Function Pointer Demo

  - LoadLibrary 範例

  - 取得 DLL 完整

    路徑

  GetModuleFileNameDemo

 

 (別忘了把 MyDLL.dll 放到可搜尋的目錄中)

 共享你的資料        完整專案

  - 我們利用 DLL 得 share section 來達到共享資料的目的 

    總共有三個 project

 1. ShareData : 提供 ShareData.DLL

 2. SetData : 由使用者輸入資料到 Share Section 變數中

 3. ReadData : 不斷的讀取 Share Section 變數資料並顯示

 (注意:

在 DLL 中, global 變數 在不同的 process 是看不到的喔)

 Explicitly Linking to an Exported Symbol

 

    explicitly 呼叫範例 [view 完整專案 

 瀏覽 DllMain 的四

 個 Notification

  DllMainNotification 完整專案 

 抓取 DelayLoad 的例

 

  DelayException 完整專案 

 Unload a Dll library   Unload a Dll   完整專案 
 判斷 DLL 是否已經載入

  isLoadedCheck  完整專案 
   

 掌控 __delayLoadHelper 的

 處理進度

  DelayLoadHook  完整專案 

 

不使用 function name 呼叫你的 function

 

  MyDLL.def 的設定

  使用 ordinal 呼叫 function 

  完整專案

 DLL Forwarded 範例

 UseDLL.cpp 呼叫的 MyDLL.Add(1,2) 實際上是被 forwarde到 NewDLL.NewAdd(1,2) 執行

  UseDLL   header 範例

  MyDLL   header 範例 \

  NewDLL  header 範例 \

  完整專案 

 測試方式:

   1. Build NewDLL

   2. Build MyDLL

   3. copy the *.lib & *. dll of

       NewDLL & MyDLL into

       appropriate location

    4. build UseDLL with

        delayload option for

         MyDLL.dll

 延伸讀物:

     1. VC 如何呼叫 BCB 所建立的 DLL [link]

     2. BCB 如何呼叫 VC 所建立的 DLL [link]

    

 DLL Injection Topic

 

 - 解析 Windows 執行檔 (補充)

 

導讀:

 ==> 這個章節主要是探討, Windows 執行檔 (Portable Execution File, PE File)  中重要節區的分佈, 你會知道 machine code 放在哪個節區, 常數或靜態變數放在哪個節區, 最重要的是你會知道作業系統如何對待 imported functions. 知道了這個機制後,我們就可以透過精緻的手段來欺騙程式. 讓他不知不覺的執行我們的程式. 最簡單的例子就是,安裝了你的程式後,目標程式的所有存檔動作, 都會先繞過你的程式如經過編碼, 然後存入檔案. 這將使得你的程式非常具有透通性.

 講義:

                ( 使用 WindowsHookEx 注入你的寄生程式 )  (about 28 pages)

                ( Injecting a DLL Using Remote Threads ) (about 17 pages)

   (補充)  (解析 Windows 執行檔) (about 22 pages)

 

 攔截滑鼠訊息

  程式行為:

      SetMouseMessageHook.exe 安裝掛勾程式

      MouseProcLibrary: 滑鼠掛勾程式實作部分

      TargetWindow: 簡單的目標視窗

  1. 先執行 TargetWindow

   2. 安裝好 Mouse Hook

   3. 嘗試的移動視窗到螢幕的邊緣, 看看會發生什麼情況

 

安裝掛勾程式重點部分

實作掛勾程式

  實作掛勾程式

完整專案 

編譯注意事項:

請在 stdafx.h 的開始加入

#pragma once

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0501

 WindowsHooksEx 使用範例

程式行為:

將 DIPSLIB .dll 注射進桌面管理程序中, 並且寄生一個隱藏視窗作為對外溝通的橋樑(可接受外界命令)

    

  SimpleDIP

  DIPSLIB

  完整專案 

測試方式:

   1. 下載專案檔

   2. 編譯 DIPSLIB產

    生"22 DIPSLIB.dll"

   3. 編譯並執行

       SimpleDIP

 

 CreateRemoteThread 使用範例

 => 這個例子主要是展示如何將你的程式注射到目標 process 中,並且執行的例子.

  監控端 (DialogTestDlg)

  寄生的 DLL (MyDLL)  與監控端互動的隱藏視窗  (MyDllDlg)

  被寄生的目標 Process (ProcessB)

完整專案

 編譯注意事項 (view)

 

讓原來的程式呼叫 MessageA, 最後卻呼叫我們自己寫的程式 !!

 => 這個程式範例主要是展示, 如何藉由 overwrite PE 檔中 imported section 的資訊,達到欺騙程式的目的.

 

 

  類別定義

  覆寫 PE Tabel 實做程式碼  呼叫測試

  完整專案

 編譯注意事項 (請把 Precompiled header 設定拿掉)

 

作業解答

 

    其他的範例:

          1. Monitor system events (MSDN usinghooks.htm#system_events)

          2. TaskSwitcher application (MSDN dnwxp/html/xpvisualstyles.htm)

 

 Advanced Topic

 Outline Content
 Using Video Capture   講義: Using Video Capture (about 20 pages)

 

 Simple Video

 (Video Preview)

 利用 Video for Windows 顯示 USB 攝影機顯示的畫面

   c++

  完整專案

 Retrieve Frame Data

 介紹 Call Back function

 

  VFWDemo

  完整專案

 延伸讀物:

如何將取得的影像轉成 memory bitmap 以方便影像處理 ?

 請看 http://www.codeguru.com/Cpp/G-M/multimedia/video/article.php/c4723

 

 

 Windows Shell Programming

Task Bar:

如何控制 TaskBar, 如何取得 Task Bar 的狀態, 當使用者改變 Task Bar 的狀態時,如何接受通知

Task Bar Status Area:

如何將程式的狀態顯示在 Status Area (新增,刪除,修改)

攔截使用者在 Icon 的滑鼠動作

  講義:

       ShortCut Menu (about 12 pages)

       TaskBar (about 19 pages)

 

 取得目前 Task Bar 的顯示狀態

 

   c++

  完整專案

 取得 TaskBar Notification

 

 

   c++

  完整專案

 

 程式自動控制控制 TaskBar 的顯示狀態

 

   c++

  完整專案

 

 

自訂 Icon 在 Status 區域

   c++

  完整專案

 

 攔截使用者滑鼠的動作

   c++

  完整專案

 

 

 

延伸讀物:

1. Creating an Internet Explorer-style Menu Bar [link]

2. ToolBar Hot tracking 相關資料 [link]

3. LVM_SETHOTCURSOR Message [link]

4. Button 更多的控制:[link]

      

 Hardware Notification 簡單範例   講義: Hardware Notification (about 11 pages)

  

 

展示如何接收 device  notification
(a) 接收所有的 device interface 

     notification
(b) 接收指定 device class interface

     notification (利用 ClassGUID 指定)
 

這個程式只能在 Windows XP 才能執行


操作方式:

   請插上 USB 滑鼠或移除 USB 滑鼠, 看是能接到訊息.

 

   c++

  完整專案

 

 

 Windows Services 簡單範例

 - 內容大綱 :

本節是教你如何撰寫在 Windows 下的背景執行程式, 我們會接觸到 1. 如何寫 service object 2. Install your services. 3. 啟動你的 service 4. 程式自動停止你的 service 5. 移除你的 service 等五項基本 service 操作. (另外,你可以在範例程式中看到在系統開機時讓你的 services 自動繼續執行)

  如何撰寫 Windows Service 程式? 

 

 簡單的 Windows Service

 程式

 

  Service主程式 

  安裝你的 service

  啟動 service範例

  停止 service 範例

完整專案

 

 

 

   

Other Prepared Topics

 Outline

Content

 影像處理部分

 - 存成 JPEG   

 講義: (Using Image Encoders and Decoders)

 

 列出目前系統支援的 Codec 有哪些

  Listing Installed Encoders

  完整專案

 壓縮 JPEG 檔, 展示壓縮品質

          Q= 0                   Q=50

(影像來源: yahoo image searching)

  Save2JPEG

  完整專案

(只需要 6 Steps)

 簡單的影像處理

   

  DoGray

  完整專案

 (只需要 6 Steps)

 

 DirectX 簡介

 - DirectX 主要元件簡介, 編譯環境設定, 影像擷取簡單說明, 列舉系統硬體資訊

 

 重要 SDK 下載:

DirectX SDK:

Windows Media SDK http://msdn.microsoft.com/library/default.asp?url=/downloads/list/winmedia.asp

 

 講義: Introduction to DirectX (Only 9 pages)

                    DirectShow (Only 18 pages)

                    Video Capture Using DirectShow (about 27 pages)

 

 Enumerate Video Input Device

 - 我們利用 System Device Enumerator 幫忙查詢, 系統硬體狀態

 

  VideoCaputreDevices

  完整專案

 Video Render

 CaptureGraphBuilder2 建立 Filter Graph 顯示攝影機影像

 

 

  Video Render

  完整專案

 由 Media File 中擷取一張 frame

在這裡 我們使用 MediaDetector help object 幫我們處理 filter graph的封裝

 

test

 

  Grabing a Post Frame

  完整專案

  請注意編譯注意事項

 (補充)

將攝影機的影像一張一張存檔

=> 程式流程

我們利用繼承 ISampleGrabberCB 的方式建立自己的影像擷取 Call Back 類別. 透過 Sample Grabber 中的IID_ISampleGrabber 介面將我們寫好的擷取物件設定好連線. 起動 MediaControl, frame 就一張一張的送到我們的 BufferCB method 中.

 

 

  SampleGrabberCallback.h

  建構 FilterGraph  

  完整專案

 

如何控制 Nokia 手機存取 Camera 的資料

(這個是 一封 email) (download)

 

自己動手接 Pin 腳, 建立 Audio Filter Graph

音訊處理
在這個範例中, 我們展示了一個簡單的任意音訊檔的資料擷取播放範例.

[Source Filter] -> [ACM Wrapper] ->[Grabber] -> [DSound Render]

1. 不使用 MediaDetector 與 ICaptureGraphBuilder2 等 help objects

2. 利用 ACM_Wappper Filter 處理任意音樂檔的解碼動作

3. InfTee Filter 分流器的使用範例與缺點

取樣

手動建立 Graph

AudioUtility.h

AudioUtility.cpp

完整專案

注意: (note)

這個程式的行為是讀取 c:\\I Get A Rush.mp3

這個檔案!

 


Web resources :

 

Source

 

crystalxp

CrystalXP.net (法國的一個網站)

不只提供程式設計上免費的 Icon , 另外還有許多可用的資源.

創立一個優值軟體觀感, 必須參考的網站.

SysInternals (是一個 技術相關的 Blog)

提供了許多的系統資訊, 包含許多進階的Windows 系統程式設計的知識. ( 包含檔案管理程式, 網路控管方面的程式工具)

Larry Osterman's WebLog

MSDN Blog 上的高手 (似乎是微軟員工)

包含了許多 Microsoft 的新知, 包含:

1 Win32程式的設計訣竅 2. Audio 方面的微軟新技術

MSDN 雜誌

每個月定期寫出 Microsoft 相關軟體開發技術的文章, 內容非常紮實. 是高手必看的雜誌.

十月份的內容: OCTOBER 2006 (Mouse Position)

WCF Essentials -- WCF 精要討論 One-Way Call, Call Back , 等內容
P2P -- 討論 Windows Vista 與 WCF 在點對點傳輸上面的能力
App Fundameentals -- 討論如何使用 WCF 建立優良的使用者體驗的軟體
Web Service Workflows -- 使用 Web Service 部署 分散式企業程序
SQL Server 2005 -- 使用 Custom Report Item

Dr. Dobb's Protal: 相當有名的電腦雜誌, 內容不只包含微軟的技術, 還包含了 Java, Opensource, 資料庫, 人工智能與機器人等資訊相關重要資訊.

Interactive Storytelling -- 討論未來的電腦遊戲
Parameterized Communication -- 介紹 Obol 專門用在測試 security protocols 的程式語言
Java Cryptography & Attribute Certificate Management -- 增加 Java 在認證(certificate 方面的不足)
AJAX & Record Locking -- 針對 多人資料導向網頁應用程式 (multiuser data-driven web app) 的 lock 紀錄
Building Extensible Development Frameworks -- 建立可擴充型的架構
Application Responsiveness
Inside the VSIPL++ API -- 介紹一個高效能的平行計算 C++ API: VSIPL

 

Forum

 

FoosYerdoos - Programming ( 英國的一個網站)

包含了許多有用的 Win32 API 教學

http://www.codeguru.com/

包含一個最新程式設計技術新知的電子報

內容包含 C++, C#, VB 共享元件與討論區
另外還有影片教學

video example

http://www.codeguru.com/video/article.php/c11749/

http://www.codeproject.com/ 超過 12200 份以上極有價值的 C++, C#, .Net 文章與原始碼教學
Ktop 雖然叫做Delphi,但是內容卻包含 Win32, BCB, Delphi 等程式設計技巧
Programmer 有許多相關的知識
Programmer MSDN 論壇 (擁有 30 萬名會員的論壇)

 

 

 

 Tutorial Site

 

小木偶的網頁

http://home.educities.edu.tw/wanker742126/index.html

Win32 組合語言教學

 

   

Something Special

3d rendering in real time
XGL Demo on Linux operating system
(更多資訊 Wiki百科定義)

 

(設計優秀的介面軟體是非常困難的, 很炫是否代表對使用者有效率與方便? by Jing 討論 ...)

 

程式設計比賽

ACM 國際大學程式設計競賽網站 ( ACM --- International Collegiate Programming Contest) (link)

ACM Online Judged Problem Set (一堆程式設計題目與世界競爭, 看看你的排名在哪裡?) (link)
特色:
1. 任何人都可以隨時下載題目, 馬上作, 馬上就知道答案 (ex)
2. 你可以看到排名 (ex)
3. 你可以看到目前你已經解了哪些題目 (ex)

 

版權聲明:
基於知識無價的原則, 你可以任意修改,重製,散佈這份資料.
但是必需同意下列條件:
  1. 註明資料來源以及作者
  2. 另外你也必須讓我知道 (我的email:  mqJing@msn.com )