• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁硬件相關電腦配件 → 帶你了解網絡和黑客編程基本知識識

    帶你了解網絡和黑客編程基本知識識

    相關軟件相關文章發表評論 來源:網絡時間:2010/4/27 11:11:43字體大?。?em class="fontsize">A-A+

    作者:佚名點擊:294次評論:0次標簽: 教程

    • 類型:商務模板大?。?i>5.0M語言:中文 評分:10.0
    • 標簽:
    立即下載

    第一節 了解Windows機制
    Windows 是一個“基于事件的,消息驅動的”操作系統。
      在Windows下執行一個程序,只要用戶進行了影響窗口的動作(如改變窗口大小或移動、單擊鼠標等)該動作就會觸發一個相應的“事件”
    系統每次檢測到一個事件時,就會給程序發送一個“消息”,從而使程序可以處理該事件。
      每個Windows 應用程序都是基于事件和消息的,而且包含一個主事件循環,它不停地、反復地檢測是否有用戶事件發生。每次檢測到一個
    用戶事件,程序就對該事件做出響應,處理完再等待下一個事件的發生。
      Windows 下的應用程序不斷地重復這一過程,直至用戶終止程序,用代碼來描述實際上也就是一個消息處理過程的while循環語句。
      下面便簡單介紹一下與 Windows 系統密切相關的幾個基本概念:
      1:窗口:這是我要說的第一個概念。窗口是Windows本身以及Windows 環境下的應用程序的基本界面單位,但是很多人都誤以為只有具有
    標題欄、狀態欄、最大化、最小化按鈕這樣標準的方框才叫窗口。其實窗口的概念很廣,例如按鈕和對話框等也是窗口,只不過是一種特殊化
    窗口罷了。
      從用戶的角度看,窗口就是顯示在屏幕上的一個矩形區域,其外觀獨立于應用程序,事實上它就是生成該窗口的應用程序與用戶間的直觀
    接口;從應用程序的角度看,窗口是受其控制的一部分矩形屏幕區。應用程序生成并控制與窗口有關的一切內容,包括窗口的大小、風格、位
    置以及窗口內顯示的內容等。用戶打開一個應用程序后,程序將創建一個窗口,并在那里默默地等待用戶的要求。每當用戶選擇窗口中的選
    項,程序即對此做出響應。
      2:程序:通常說的程序都是指一個能讓計算機識別的文件,接觸得最多的便是.exe型的可執行文件.
      3:進程:說到進程,學過《操作系統》的人都很清楚,所謂進程就是應用程序的執行實例(或稱一個執行程序) 需要注意的是:進程是
    程序動態的描述,而上面說到的程序是靜態的描述,兩者有本質的區別。舉個例子,從網上 Down了一個瑞星殺毒軟件到C盤但沒有運行,那
    個.exe 可執行文件叫做程序,它是一個二進制碼的文件。一旦雙擊了exe文件圖標運行程序,那個“正在運行著的瑞星殺毒”便稱為進程,它
    在雙擊的那一刻被系統創建,當你關機或者在任務欄的圖標上單擊鼠標右鍵選“退出”時,進程便消亡,徹底結束了生命。進程經歷了由“創
    建”到“消亡”的生命期,而程序自始至終存在于你的硬盤上,不管你的機器是否啟動。
      4:線程:線程是進程中的一個執行單元,同一個進程中的各個線程對應于一組CPU指令、一組CPU寄存器以及一堆棧。進程本來就具有動態
    的含義,然而實質上是通過線程來執行體現的,從這個意義上說,Windows 中進程的動態性意義已經不是很明顯了,只算是給程序所占的資源
    劃定一個范圍而已,真正具有動態性意義的是線程。
      5:消息:我們幾乎做每一個動作都會產生一個消息,鼠標被移動會產生WM_MOUSEMOVE消息,鼠標左鍵被按下會產生WM_LBUTTONDOWN的消
    息,鼠標右鍵按下便產生WM_RBUTTONDOWN消息等等。所有的這些都可以通過GetMessage,SendMessage等函數得到.
      6:事件:如在程序運行的過程中改變窗口的大小或者移動窗口等,都會觸發相應的“事件”。
      7:句柄:單單一個“柄”字便可以解釋它的意思了,我們天氣熱搖扇子的時候只要抓住扇柄便可以控制整個扇子的運動了,在程序中也
    差不多是這個意思。通常一個句柄就可以傳遞我們所要做的事情。有經驗的成員肯定清楚,編寫程序總是要和各種句柄打交道的,句柄是
    系統用來標識不同對象類型的工具,如窗口、菜單等,這些東西在系統中被視為不同類型的對象,用不同的句柄將他們區分開來。
      C++ 教材中給句柄下的定義是:“在Win32里,句柄是指向一個無值型對象(void *)的指針,是一個4字節長的數據”。從結構
    上看,句柄的確是一個指針,盡管它沒有指向用于存儲某個對象的內存位置,而實際上句柄指向的是一個包含了對該對象進行的引用的位置。
    在編程時,只要抓住了對象的句柄就可以對該對象進行操作了.
      8:API與SDK:API是英文 Application Programming Interface 的簡稱,意為“應用程序接口”,泛指系統為應用程序提供的一系列接
    口函數。其實質是程序內的一套函數調用,在編程的時候可以直接調用,而不必知道其內部實現的過程,只知道它的原型和返回值就可以
    了.
      SDK是英文 Software Development Kit 的縮寫,指“軟件開發工具包”,在防火墻的設計中就經常涉及到SDK
    第二節 Win API編程簡介
    下面介紹一下WIN API.
    我們需要自己編寫一個工具時,必然會用到很多操作windows和控制windows的函數,這些函數就是windows API.
    API是Application Progamming Interface的縮寫.就是說API是一系列已經定義的在windows內部的函數,是應用程序和系統之間的
    橋梁,應用程序通過調用API來請求系統完成一系列的任務.窗口,菜單,文件操作等都是通過API實現的.
    WIN32 API就是WINDOWS 32位平臺的應用程序接口.現在可視化編程工具提供了大量控件,他們代替了API的功能.這些控件都是構建
    在WIN32 API之上的.是封裝了的API函數集合.但是對于比較復雜和特殊功能(想我們的黑客編程)來說,就必須用API函數來實現.
    WIN API存放在動態鏈接庫(DLL)中,在98系統中,有32位的GDI32.DLL,KERNEL32.DLL,16位的GDI.EXE,KRNL386.EXE.API就存放在這些
    動態鏈接庫中.
    木馬和后門其實就是使用了文件操作函數,這里做簡要介紹:
    刪除文件:BOOL DeleteFile(LPCTSH lpFileName)
    復制文件:BOOL CopyFile()
    移動文件:BOOL MoveFile()等等
    具體的API可以上網自己去查看,有很多介紹API的書籍.
    第二節 Win API編程簡介
    下面介紹一下WIN API.
    我們需要自己編寫一個工具時,必然會用到很多操作windows和控制windows的函數,這些函數就是windows API.
    API是Application Progamming Interface的縮寫.就是說API是一系列已經定義的在windows內部的函數,是應用程序和系統之間的
    橋梁,應用程序通過調用API來請求系統完成一系列的任務.窗口,菜單,文件操作等都是通過API實現的.
    WIN32 API就是WINDOWS 32位平臺的應用程序接口.現在可視化編程工具提供了大量控件,他們代替了API的功能.這些控件都是構建
    在WIN32 API之上的.是封裝了的API函數集合.但是對于比較復雜和特殊功能(想我們的黑客編程)來說,就必須用API函數來實現.
    WIN API存放在動態鏈接庫(DLL)中,在98系統中,有32位的GDI32.DLL,KERNEL32.DLL,16位的GDI.EXE,KRNL386.EXE.API就存放在這些
    動態鏈接庫中.
    木馬和后門其實就是使用了文件操作函數,這里做簡要介紹:
    刪除文件:BOOL DeleteFile(LPCTSH lpFileName)
    復制文件:BOOL CopyFile()
    移動文件:BOOL MoveFile()等等
    具體的API可以上網自己去查看,有很多介紹API的書籍.
    第二節 Win API編程簡介
    下面介紹一下WIN API.
    我們需要自己編寫一個工具時,必然會用到很多操作windows和控制windows的函數,這些函數就是windows API.
    API是Application Progamming Interface的縮寫.就是說API是一系列已經定義的在windows內部的函數,是應用程序和系統之間的
    橋梁,應用程序通過調用API來請求系統完成一系列的任務.窗口,菜單,文件操作等都是通過API實現的.
    WIN32 API就是WINDOWS 32位平臺的應用程序接口.現在可視化編程工具提供了大量控件,他們代替了API的功能.這些控件都是構建
    在WIN32 API之上的.是封裝了的API函數集合.但是對于比較復雜和特殊功能(想我們的黑客編程)來說,就必須用API函數來實現.
    WIN API存放在動態鏈接庫(DLL)中,在98系統中,有32位的GDI32.DLL,KERNEL32.DLL,16位的GDI.EXE,KRNL386.EXE.API就存放在這些
    動態鏈接庫中.
    木馬和后門其實就是使用了文件操作函數,這里做簡要介紹:
    刪除文件:BOOL DeleteFile(LPCTSH lpFileName)
    復制文件:BOOL CopyFile()
    移動文件:BOOL MoveFile()等等
    具體的API可以上網自己去查看,有很多介紹API的書籍.
    第三節 Windows 網絡協議
    首先介紹一下網絡協議:網絡協議是網絡上所有設備之間通信規則的集合,他定義了通信時信息必須采用的格式和這些格式的意義.大多數
    網絡協議都采用分層體系結,每一層都建立在他的下層之上,向他的上一層提供服務,而把如何實現這一服務的細節對上層加以屏蔽.一臺設備上
    的第N層與另一臺設備上的第N層進行通信的規則就是第N曾協議.在網絡上的個層之間中存在著許多協議,接受方和發送方同層的協議必須一致,
    否則,一方就無法識別另一方發出的信息.網絡協議使網絡上的設備各種設備能相互交換信息.
    常用的協議有:TCP/IP協議,IPX/SPX歇息等等.在局域網中常用的IPX/SPX協議.而訪問INTERNET,就必須添加TCP/IP協議.
    TCP/IP協議是傳輸控制協議/互聯網絡協議.他規范了網絡上所有設備的通信,尤其是一個主機與另一個主機之間的數據往來格式以及傳送
    方式.
    在網絡的各層中還存在著許多協議,下面列出部分網絡協議規范:
    ARP 地址解析協議
    SNMP 網絡管理協議
    BOOTP 讓無盤站從一個中心服務器上獲得IP地址
    DHCP 動態主機配置協議
    下面介紹網絡7層協議在WINDOWS的實現:
    7層協議 WIN系統
    ________________________________________
    7 應用層 7 應用程序
    ________________________________________________
    6 表示層 6 WINSOCK API(DLL)
    ___________________________________________
    5 會話層 5 SPI(DLL)
    __________________________________________________
    4 傳輸層 4 TDI(VXD,SYS)
    ___________________________________________________
    3 網絡層 3 NDIS(VXD,SYS)
    __________________________________________________
    2 數據鏈路層 2 網卡驅動程序(VXD,SYS)
    ___________________________________________
    1 物理層 1 網卡
    _________________________________________________
    相信這個映射圖可以讓大家比較清楚了解他們的對應關系
    TCP協議圖示
    應用程序協議 HTTP FTP TELNET
    傳輸協議 TCP UDP
    網際協議 IP
    物理層協議 網卡
    IP協議保證數據的傳輸,TCP協議保證數據傳輸的質量.
    TCP/IP協議基于四層結構:應用層,傳輸層,網絡層,接口層,數據在傳輸時每通過一層就要在數據上加個頭,其中的數據供接受端同層使用,在
    接收端,每經過一層就把頭去掉,來保證傳輸數據格式的一致.
    TCP頭部結構:
    16位源端口號 16位目的端口號
    _______________________________________________________________________________
    32位序列號
    ___________________________________________________________________________
    32位確認號
    _____________________________________________________________________________________
    4位首部長度+6位保留字 6位標志 16位窗口大小
    _______________________________________________________________________________________
    16位效驗和 16位緊急數據偏移量
    _____________________________________________________________________________________
    數據段
    _______________________________________________________________________________

    IP頭部結構:
    4位IP版本號 4位首部長度 8位服務類型 16位總長度
    ___________________________________________________________________________________________
    16位標示 3位標志和偏移
    __________________________________________________________________________
    8位生存時間 8位協議 16位IP首部效驗和
    ________________________________________________________________________________________________
    32位源IP地址
    _________________________________________________________________________________________________________
    32位目的IP地址
    ________________________________________________________________________________________
    TCP頭和數據
    ____________________________________________________________________________
    第四節 關于服務器和客戶端編程
    在網絡編程中,最常用和最基礎的就是WINSOCK. 現在我們討論WINDOWS下的SOCKET編程.
    大凡在WIN32平臺上的WINSOCK編程都要經過下列步驟:
    定義變量->獲得WINDOCK版本->加載WINSOCK庫->初始化->創建套接字->設置套接字選項->關閉套接字->卸載WINSOCK庫->釋放資源
    下面介紹WINSOCK C/S的建立過程:
    服務器 客戶端
    ________________________________________________
    1 初始化WSA 1 初始化WSA
    ____________________________________________________
    2 建立一個SOCKET 2 建立一個SOCKET
    _____________________________________________________
    3 綁定SOCKET 3 連接到服務器
    _____________________________________________________
    4 在指定的端口監聽 4 發送和接受數據
    _____________________________________________________
    5 接受一個連接 5 斷開連接
    ______________________________________________________-
    6 發送和接受數據
    ___________________________________________________
    7 斷開連接
    __________________________________________________
    大家注意,在VC中進行WINSOCK編程時,需要引入如下兩個庫文件:WINSOCK.H(這個是WINSOCK API的頭文件,WIN2K以上支持WINSOCK2,所以
    可以用WINSOCK2.H);Ws2_32.lib(WINSOCK API連接庫文件).
    使用方式如下:
    #include
    #pragma comment(lib,"ws2_32.lib")
    下面我們通過具體的代碼演示服務器和客戶端的工作流程:
    首先,建立一個WSADATA結構,通常用wsaData
    WSADATA wsaData;
    然后,調用WSAStartup函數,這個函數是連接應用程序與winsock.dll的第一個調用.其中,第一個參數是WINSOCK 版本號,第二個參數是指向
    WSADATA的指針.該函數返回一個INT型值,通過檢查這個值來確定初始化是否成功.調用格式如下:WSAStartup(MAKEWORD(2,2),&wsaData),其中
    MAKEWORD(2,2)表示使用WINSOCK2版本.wsaData用來存儲系統傳回的關于WINSOCK的資料.
    if(iResuit=WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
    printf("WSAStartup failed:%d",GetLastError()); //返回值不等與0,說明初始化失敗
    ExitProcess(); //退出程序
    }
    應用程序在完成對請求的SOCKET庫使用后,要調用WSACleanup函數來接觸SOCKET庫的綁定,并且釋放資源.
    注意WSAStartup初始化后,必須建立一個SOCKET結構來保存SOCKET句柄.
    下面我們建立一個SOCKET.
    首先我們建立一個m_socket的SOCKET句柄,接著調用socket()函數,函數返回值保存在m_socket中.我們使用AF_INFE,SOCK_STREAM,IPPROTO_TCP
    三個參數.第一個表示地址族,AF_INFE表示TCP/IP族,第二個表示服務類型,在WINSOCK2中,SOCKET支持以下三種類型;
    SOCK_STREAM 流式套接字
    SOCK_DGRAM 數據報套接字
    SOCK_RAW 原始套接字
    第三個參數表示協議:
    IPPROTO_UDP UDP協議 用于無連接數據報套接字
    IPPROTO_TCP TCP協議 用于流式套接字
    IPPROTO_ICMP ICMP協議用于原始套接字
    m_socket=socket(AF_INFE,SOCK_STREAM,IPPROTO_TCP); //創建TCP協議
    以下代碼用于檢查返回值是否有錯誤:
    if(m_scoket==INVALID_SOCKET)
    {
    prinrf("Error at socket():%d\n",GetLastError());
    WSACleanup(); //釋放資源
    return;
    }
    說明,如果socket()調用失敗,他將返回INVALID_SOCKET.
    為了服務器能接受一個連接,他必須綁定一個網絡地址,下面的代碼展示如何綁定一個已經初始化的IP和端口的Socket.客戶端程序用這個
    IP地址和端口來連接服務器.
    sockaddr_in service;
    service.sin_family=AF_INET; //INTERNET地址族
    service.sin_addr.s_addr=inet_addr("127.0.0.1"); //將要綁定的本地IP地址
    service.sin_port=htons(27015); //27015將要綁定的端口
    下面我們調用BIND函數,把SOCKET和SOCKADDR以參數的形式傳入,并檢查錯誤.
    if(bind(m_socket,(SOCKADDR*)&SERVICE,sizeof(service))==SOCKET_ERROR)
    {
    printf("bind() failed.\n");
    closesocket(m_socket);
    return;
    }
    當綁定完成后,服務器必須建立一個監聽隊列,以接受客戶端的請求.listen()使服務器進入監聽狀態,該函數調用成功返回0,否則返回
    SOCKET_ERROR.代碼如下:
    if(listen(m_socket,1)==SOCKET-ERROR)
    {
    printf("error listening on socket.\n");
    }
    服務器端調用完LISTEN()后,如果此時客戶端調用CONNECT()函數,服務器端必須在調用ACCEPT().這樣服務器和客戶端才算正式完成通信程序的
    連接動作.
    一旦服務器開始監聽,我們就要指定一個句柄來表示利用ACCEPT()函數接受的連接,這個句柄是用來發送和接受數據的表示.建立一個SOCKET句柄
    Socket AcceptSocket 然后利用無限循環來檢測是否有連接傳入.一但有連接請求,ACCEPT()函數就會被調用,并且返回這次連接的句柄.
    printf("waitong for a client to connect...\n");
    while(1)
    {
    AcceptSocket=SOCKET_ERROR;
    while(AcceptSocket==SOCKET_ERROR)
    {
    AcceptSocket=accept(m_socket,NULL,NULL);
    }
    }
    下面看客戶端端代碼:
    sockaddr_in clientService;
    clientService.sin_family=AF_INET; //INTERNET地址族
    clientService.sin_addr.s_addr=inet_addr("127.0.0.1"); //將要綁定的本地IP地址
    clientService.sin_port=htons(27015); //27015將要綁定的端口
    下面調用CONNECT()函數:
    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
    {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return;
    } //如果調用失敗清理退出
    //調用成功繼續讀寫數據
    _________________________________________________________________________________________________
    到這里,服務器和客戶端的基本流程介紹完畢,下面我們介紹數據交換.
    send():
    int send
    {
    SOCKET s, //指定發送端套接字
    const char FAR?*buf, //指明一個存放應用程序要發送的數據的緩沖區
    int len, //實際要發送的數據字節數
    int flags //一般設置為0
    };
    C/S都用SEND函數向TCP連接的另一端發送數據.
    recv():
    int recv
    {
    SOCKET s, //指定發送端套接字
    char FAR?*buf, //指明一個緩沖區 存放RECC受到的數據
    int len, //指明BUF的長度
    int flags //一般設置為0
    };
    C/S都使用RECV函數從TCP連接的另一端接受數據 _____________________________________________________________________________________________
    下面將完整的程序代碼提供如下,大家可直接編譯運行
    首先看客戶端的代碼:
    #include
    #include
    #pragma comment(lib, "ws2_32.lib")
    void main() {
    // 初始化 Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
    printf("Error at WSAStartup()\n");
    // 建立socket socket.
    SOCKET client;
    client = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if ( client == INVALID_SOCKET ) {
    printf( "Error at socket(): %ld\n", WSAGetLastError() );
    WSACleanup();
    return;
    }
    // 連接到服務器.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 27015 );
    if ( connect( client, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
    printf( "Failed to connect.\n" );
    WSACleanup();
    return;
    }
    // 發送并接收數據.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[32] = "";
    bytesSent = send( client, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );
    while( bytesRecv == SOCKET_ERROR ) {
    bytesRecv = recv( client, recvbuf, 32, 0 );
    if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
    printf( "Connection Closed.\n");
    break;
    }
    if (bytesRecv < 0)
    return;
    printf( "Bytes Recv: %ld\n", bytesRecv );
    }
    return;
    }
    下面是服務器端代碼:
    #include
    #include
    #pragma comment(lib, "ws2_32.lib")
    void main() {
    // 初始化
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
    printf("Error at WSAStartup()\n");
    // 建立socket
    SOCKET server;
    server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if ( server == INVALID_SOCKET ) {
    printf( "Error at socket(): %ld\n", WSAGetLastError() );
    WSACleanup();
    return;
    }
    // 綁定socket
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    service.sin_port = htons( 27015 );
    if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
    printf( "bind() failed.\n" );
    closesocket(server);
    return;
    }
    // 監聽 socket
    if ( listen( server, 1 ) == SOCKET_ERROR )
    printf( "Error listening on socket.\n");
    // 接受連接
    SOCKET AcceptSocket;
    printf( "Waiting for a client to connect...\n" );
    while (1) {
    AcceptSocket = SOCKET_ERROR;
    while ( AcceptSocket == SOCKET_ERROR ) {
    AcceptSocket = accept( server, NULL, NULL );
    }
    printf( "Client Connected.\n");
    server = AcceptSocket;
    break;
    }
    // 發送接受數據
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Server: Sending Data.";
    char recvbuf[32] = "";
    bytesRecv = recv( server, recvbuf, 32, 0 );
    printf( "Bytes Recv: %ld\n", bytesRecv );
    bytesSent = send( server, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );
    return;
    }
    本程序僅僅描述了同步的情況!
    第五節 多線程編程介紹
    對于多線程的基本概念,我不在贅述,是個只要學習過一門編程語言就應該多進程和線程有個基本的了解.這里重點介紹一下如何實現多線程.

    通常一個程序的主線程有操作系統創建,如果想讓其創建額外的線程,可以調用CreateThread()函數來完成.函數原形如下:
    HANDLE CreateThread()
    {
    LPSECURITY_ATTRIBUTES LPThreadAttributes, //指向SECURITY_ATTRIBUTES的指針
    SIZE_T dwStackSize, //表示線程為自己所用堆棧分配的地址空間的大小 系統缺省值為0
    LPTHREAD_START-TOUTINE lpStartAddress, //表示新線程開始執行時代碼所在函數的地址 即線程函數名
    LPVOID lpParameter, //是傳入線程函數的參數
    DWORD dwCreationFlags, //指定控制線程創建的附加標志 取0線程立即執行 取CREATE_SUSPENDED線程掛起
    LPDWORD lpThreadld //是個DWORD類型的地址,返回賦給該新線程的ID
    }
    線程函數lpParameter必須有以下原形:
    DWORD WINAPI XXXThreadFun(LPVOID lpParameter)
    {
    return(0);
    } _____________________________________________________________________________________________
    下面我們來創建一個線程:

    #include
    #include
    DWORD WINAPI ThreadFunc( LPVOID lpParam ) //線程函數,跟普通的函數沒什么兩樣
    {
    printf( "Parameter = %d.", *(DWORD*)lpParam );
    return 0;
    }

    VOID main( VOID )
    {
    DWORD dwThreadId, dwThrdParam = 1;
    HANDLE hThread;
    hThread = CreateThread( NULL,0,ThreadFunc,&dwThrdParam, 0,&dwThreadId);
    if (hThread == NULL)
    {
    printf( "CreateThread failed (%d)\n", GetLastError() );
    }
    else
    {
    _getch();
    CloseHandle( hThread );
    }
    }

      PPT教程
      (30)PPT教程
      教程的模板都是關于如何制作的基礎的模板,還有著一些特定的個體的教程的制作,例如一些漫畫圖片等等的教程。教程主要為大家講解了關于基礎的的制作,還有著一些模板中的小的技巧,如何運用模板中的一些操作來達到自己想要的效果,在教程中都可以找到對應的答案。教程是專門用于制作演示文稿俗稱幻燈片。廣泛運用于各種會議產品演示學校教學等。學會如何制作,成為提升工作效率的好幫手。包含有很多的功能,我們可以根據個人喜歡和...更多>>
      • PPT教程圖文詳解模板

        09-23 / 400KB

        推薦理由:要制作一份好的PPT的模板出來,首先要知道PPT的制作方法,那么制作一份簡單的PPT的模板,是我們要學會掌握的
      • 制作PPT教程模板

        09-23 / 6.0M

        推薦理由:PPT的模板的使用,可以說是在我們的工作、生活、學習中都十分的常見,那么在PPT的模板的制作中,有著一些常
      • 漫畫教程PPT模板

        09-23 / 5.5M

        推薦理由:我們在日常生活中經常會看到很多漫畫人物形象,讓人忍俊不禁,總是非常形象生動,雖說帶一點夸張的效果,卻
      • 網絡主播教程PPT模板

        09-19 / 1.0M

        推薦理由:高速發展的互聯網科技衍生了很多過去所沒有的職業。網絡游戲主播就是九零后愛游戲的少年們非常喜歡憧憬的一
      • 字體設置教程PPT

        08-19 / 138KB

        推薦理由:這是一份教程類的PPT,模板從以圖文結合形式詳細地分享了如果講單一的字體設置成有顏色的多彩字體。小編感覺
      • 木板字制作PPT教程模板

        08-19 / 1.7M

        推薦理由:在制作PPT的過程中,我們經常需要運用到一些藝術字體,例如木板字,木板字在PPT當中的運用能讓整個PPT帶有復

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>