云顶娱乐平台 9

云顶娱乐平台:C语言编程学习,你的第一个Windows程序!

       }else

        exit(-1);

操作系统实验及代码(全),操作系统实验代码

操作系统是计算机相关专业的一门极其重要的专业课,但实验课的时候很多人不知道代码应该怎么写,这里贴出博主使用过的一部分,亲测可行。 

云顶娱乐平台 1

using namespace  std;

 

题目1:Windows进程的创建与销毁

更新时间:2017-10-26

内容及要求:


掌握Windows进程的创建和销毁API的调用方法;编程代码,在程序中创建和销毁一个Word进程;

② 能够挂起和激活被创建进程的主线程;

③ 通过Windows进程管理器查看系统进程列表的变化。

实验指导:

①创建进程的API

BOOL CreateProcess(

  LPCTSTR lpApplicationName,

  LPTSTR lpCommandLine,

  LPSECURITY_ATTRIBUTES lpProcessAttributes,

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  BOOL bInheritHandles,

  DWORD dwCreationFlags,

  LPVOID lpEnvironment,

  LPCTSTR lpCurrentDirectory,

  LPSTARTUPINFO lpStartupInfo,

  LPPROCESS_INFORMATION lpProcessInformation

);

例程:

 1 void main( VOID ){
 2     STARTUPINFO si;
 3     PROCESS_INFORMATION pi;
 4     ZeroMemory( &si, sizeof(si) );
 5     si.cb = sizeof(si);
 6     ZeroMemory( &pi, sizeof(pi) );
 7     // Start the child process. 
 8     if( !CreateProcess( NULL, // No module name (use command line). 
 9         "MyChildProcess", // Command line. 
10         NULL,             // Process handle not inheritable. 
11         NULL,             // Thread handle not inheritable. 
12         FALSE,            // Set handle inheritance to FALSE. 
13         0,                // No creation flags. 
14         NULL,             // Use parent's environment block. 
15         NULL,             // Use parent's starting directory. 
16         &si,              // Pointer to STARTUPINFO structure.
17         &pi )             // Pointer to PROCESS_INFORMATION structure.
18         ) {
19             ErrorExit( "CreateProcess failed." );
20     }
21     // Wait until child process exits.
22     WaitForSingleObject( pi.hProcess, INFINITE );
23     // Close process and thread handles. 
24     CloseHandle( pi.hProcess );
25     CloseHandle( pi.hThread );
26 }

销毁进程API

BOOL TerminateProcess(

  HANDLE hProcess,

  UINT uExitCode

);

③ 挂起进程的主线程API

DWORD SuspendThread(

  HANDLE hThread

);

④激活进程的主线程API

DWORD ResumeThread(

  HANDLE hThread

);

⑤进程查看器

1 #include<iostream> 2 #include<windows.h> 3 using
namespace std; 4 void main( VOID ) 5 { 6 STARTUPINFO si; 7
PROCESS_INFORMATION pi; 8 /** 9 * 这里填个人的word可执行文件的路径
10 * ps:””需要进行转义 11 **/ 12 TCHAR
szCommandLine[]=TEXT(“D:\Microsoft
Office\Office14\WINWORD.EXE”); 13 ZeroMemory(&si, sizeof(si) ); 14
si.cb= sizeof(si); 15 ZeroMemory(&pi, sizeof(pi) ); 16
if(!CreateProcess( NULL, szCommandLine, NULL,NULL, FALSE,0,NULL,
NULL,&si,&pi ) ) 17 { 18 fprintf(stderr,”进程创建失败!”); 19 } 20 int
x; 21 while(1) 22 { 23 cout <<
“请输入要选择的操作:n1:创建进程n2:销毁进程n3:挂起进程n4:激活进程n0:退出n”;
24 cin >> x; 25 switch(x) 26 { 27 case 1: 28 if(CreateProcess(
NULL, szCommandLine, NULL,NULL, FALSE,0,NULL, NULL,&si,&pi ) ) 29
fprintf(stderr,”进程创建成功!”); 30 else 31 cout <<
“进程创建失败!”<<endl; 32 break; 33 case 2: 34
if(TerminateProcess(pi.hProcess,0)) 35
cout<<“销毁进程成功”<<endl; 36 else 37
cout<<“销毁失败!”<<endl; 38 break; 39 case 3: 40
if(SuspendThread(pi.hThread)) 41 cout<<“挂起进程成功”<<endl;
42 else 43 cout<<“挂起失败”<<endl; 44 break; 45 case 4: 46
if(ResumeThread(pi.hThread)) 47 cout<<“激活进程成功”<<endl;
48 else 49 cout<<“激活失败”<<endl; 50 break; 51 case 0: 52
exit(0); 53 default: 54 cout<<“输入有误不正确”<<endl; 55 }
56 } 57 }

 

持续更新中!!!

 

作者:耑新新,发布于  博客园

转载请注明出处,欢迎邮件交流:[email protected]

操作系统是计算机相关专业的一门极其重要的专业课,但实验课的时候很多人不知道代码应…

winuser.h: 图形设备接口函数

#include
<iostream>

    return 0;

也会生成与上面相同的对话框。

     欢迎来到windows编程的世界,先给我们的windows打个招呼吧:

        cout << “h_name:”<<
pht->h_name << endl;

原来没有main()函数,没有#include 的C语言程序也是可以运行的!

       return  0;

        exit(-1);

HINSTANCE hInstance,

}

    }

编写Windows程序,首先要包含 windows.h 头文件。windows.h
还包含了其他一些Windows头文件,例如:

int  main()

    }

#define IDABORT 3

       {

    int listen_port = 8999;

云顶娱乐平台 2

       if(iSelect云顶娱乐平台:C语言编程学习,你的第一个Windows程序!。==IDOK)

 

MessageBox()
返回被按下的按钮,以数字表示,这些数字都被定义成了宏,如下所示:

              *cout<<“you select cancel”<<endl*;

    hostent* pht = gethostbyname(buf);

);

       int iSelect=MessageBox(NULL,TEXT(“你好,windows世界,我来了!”),TEXT(“你好,世界”),MB_OKCANCEL);

    }

#define MB_YESNOCANCEL 0x00000003L

              *cout<<“you select ok “<<endl*;

   

今天我们运用C语言来实现你的第一个真正的Windows程序。

#include
<Windows.h>

        cout << “yang” << endl;

MessageBox(

       *system*(“pause”);

hostent 是一个数据结构,保存从gethostbyname返回的信息,包括主机的IP地址类型IPV4,IPV6,主机的别名,主机的IP长度,h_addr_list[]

int WINAPI WinMain(

{

                  
wVersionRequest: 一个双字节数值, 使用MAKEWORD(2,2)生成;

这些头文件定义了Windows的所有数据类型、函数原型、数据结构和符号常量,也就是说,所有的Windows
API都在这些头文件中声明。

       }

         参数介绍:

windows.h 头文件介绍:

   所谓windows编程就是指通过调用Windows
API来和操作系统交互的编程方式。API就是与操作系统交互的各种功能函数,MessageBox就是一个API,调用它就可以弹出一个对话框。

using namespace std;

int WINAPI WinMain(

       {

        }else{

windef.h:基本类型定义

        cout << “创建套接字失败” << endl;

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“
设计这个概念已经被融入到C++之中 ”。

}

#define MB_ICONQUESTION 0x00000020L

 

uType 支持的按钮样式:

            in_addr addr = *(in_addr*)
pht->h_addr_list[i];

与上面的对话框相比,多出了一个图标,同时还能听到提示音。是不是多了一个提示符号在文字的前面啊。

#include <Windows.h>

TEXT,

 

MessageBox()
函数是众多API中的一个,用于弹出一个指定风格的对话框,其原型为:

int main(){

MessageBox(NULL, TEXT(“你点击了“确定”按钮”), TEXT, MB_OK);

 

这些是C/C++能做的

        }

运行结果:

#include <process.h>

}else{

        cout << “h_addrtype:” << 
pht->h_addrtype << endl;

在C语言中,程序都是“黑屏”的,称为控制台程序(Console
Application)。这套教程要讲的是带界面的Windows程序(Windows
Application),也称为GUI程序(GUI Application)。

        SOCKET chatSocket;

NULL,

                   lpWSAData: 指向一个WSADATA的数据结构的指针,用于接收Windows Sockets实现的细节。

return 0;

        if( (chatSocket =
accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==
SOCKET_ERROR){

#define MB_OK 0x00000000L

    }else{

MB_OKCANCEL | MB_ICONINFORMATION

    if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

C和C++的区别:

    }else{

总结:

 

#define MB_YESNO 0x00000004L

#include <iostream>

#define MB_OKCANCEL 0x00000001L

        }

控制台程序以 main() 为入口函数,Windows程序以 WinMain()
为入口函数,动态链接库以 DllMain()
为入口函数,不同的入口函数决定了不同类型的程序。

    sockaddr_in  serverAddress;

你也可以尝试用数字来表示按钮,例如:

}

云顶娱乐平台 3

网络编程1. 套接字编程基本知识

wingdi.h:用户接口函数

        exit(-1);

#define IDRETRY 4

        Sleep(3000);

if(nSelect == IDOK){

 

C语言是面向过程的,而C++是面向对象的

 

云顶娱乐平台 4

    }else{

lpCaption:消息框的标题。

3.1 gethostname() // 获取本地主机的主机名

#include

    WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 返回的Windows
socket初始化信息

int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,
UINT uType );

    if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

这些按钮都是宏定义

        Sleep(3000);

// 调用API 函数MessageBox

 

);

    char buf[255];

再看来一下MessageBox() 的返回值。

using namespace std;

#define MB_ABORTRETRYIGNORE 0x00000002L

        cout << “套接字初始化成功” << endl;

#define IDCANCEL 2

   
memset(&serverAddress,0,sizeof(serverAddress));

LPSTR lpCmdLine,

            continue;

}

        cout <<“监听失败” << WSAGetLastError() << endl;

lpText:消息框的内容。LPCTSTR 是自定义数据类型,等价于 const char *。

 

MessageBox(NULL, TEXT(“你点击了“取消”按钮”), TEXT, MB_OK);

        //cout << AF_INET <<
endl;

上次我们说了什么是windows编程?了解到Windows API
编程、Windows编程、Windows SDK 编程是一个概念。

int main(){

#define MB_RETRYCANCEL 0x00000005L

    if(pht==NULL){

云顶娱乐平台 5

    char buf[255];

参数说明

       
memset(&clientAddress,0,sizeof(clientAddress));

#define IDIGNORE 5

3.常见的一些函数在WinSocket编程中使用的介绍

如果希望同时定义按钮和图标的样式,可以使用或运算|,例如:

        cout << “获取本地主机的Name失败:”<<WSAGetLastError()<< SOCKET_ERROR <<
endl;

这些图标也都是宏定义:

        Sleep(3000);

TEXT,

    WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 返回的Windows
socket初始化信息

服务器开发工程师、人工智能、云计算工程师、信息安全、大数据
、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

        cout << “套接字初始化失败”<<  endl;

点击“确定”或“取消”按钮,又会弹出一个新的提示框。大家可以亲自运行一下,会有真实的体验。

        cout << “h_name:”<<
pht->h_name << endl;

#define IDNO 7

         并且需要使用静态链接库,

int nCmdShow

        cout << “h_length:” <<
pht->h_length << endl;

}

 

WinMain() 函数的原型为:

 

winbase.h:内核函数

        cout << “h_length:” <<
pht->h_length << endl;

MessageBox(NULL, TEXT(“你好,欢迎源世界您!”), TEXT, 1);

        exit(-1);

int nSelect = MessageBox(NULL, TEXT, TEXT(), MB_OKCANCEL);

#include <Windows.h>

int nCmdShow // 窗口显示方式

#pragma comment(lib,”ws2_32.lib”)

HINSTANCE hPrevInstance, //
前一个窗口句柄,Win32下为NULL(Win16留下的废物,目前已弃用)

         Return Value:无错误的话,返回0,反之返回对应的错误代码。

#define IDYES 6

         需要使用in_addr 类型保存一个IP地址,并且需要将IP地址转换成为字符串的格式,使用的是const char * inet_ntoa(in_addr in); 将pht->h_addr_list[i] 转换成为(in_addr*)的指针,然后再通过指针获取器内容,转换成为字符串的形式。

对应的宏定义为:

            cout << “接受来自” << inet_ntoa(clientAddress.sin_addr)
<<“的连接”<< endl;

WINAPI 为宏定义

 

云顶娱乐平台 6云顶娱乐平台 7云顶娱乐平台 8

        Sleep(3000);

小编推荐一个学C语言/C++的学习裙【 七三零,一三零,二二一
】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

 

uType:对话框的按钮样式和图标。

    serverAddress.sin_port =
htons(listen_port);

#define MB_ICONASTERISK 0x00000040L

 

#define MB_ICONEXCLAMATION 0x00000030L

         ws2_32.lib对应的是ws2_32.dll,提供对于常见网络编程的API接口支持,使用其中的网络接口就需要将ws2_32.dll添加到工程,否则需要动态的加载ws2_32.dll。

#define IDOK 1

         WSAStartup是Windows SockNDs Asynchronous(Windows 异步套接字) 的启动命令, windows下的网络编程软件Winsock1,
Winsock2的一个命令。

hWnd:该消息框的父窗口句柄,如果此参数为NULL,则该消息框没有拥有父窗口。大家不用急于理解这个参数,后续会详细讲解。

        cout <<“本地主机的名字是:” << buf << endl;

先不要急于理解这些参数的含义,我先给大家写一个简单的不带黑屏的、真正的Windows程序:

hostent* pht =
gethostbyname(“www.google.com”);

){

#pragma comment(lib,”ws2_32.lib”)

把上面的MessageBox换成这个就ok了。运行结果

        for(int i = 0; pht->h_addr_list[i] !=
NULL;i++){

除了按钮,uType 还支持图标(图标对用户有提醒作用):

1.首先网络编程使用C++,要引入一些库

#define MB_ICONHAND 0x00000010L

            cout << “接受连接失败” << WSAGetLastError()<< endl;

LPSTR lpCmdLine, // 命令行参数

        cout << WSAGetLastError() <<
endl;

HINSTANCE hPrevInstance,

        cout << “h_addrtype:” << 
pht->h_addrtype << endl;

对于刚刚学完C语言的,学windows编程的,这些都是满满的干货,一定要记住喔。从你学windows编程开始,你就已经告别了难看的windows
do界面,只要一步一步走,写一个漂亮的window程序不在话下。这些都是以后学习必须掌握的,先收藏吧!

    }else{

HINSTANCE hInstance, // 当前窗口句柄

         这里使用的是编译语句#pragma comment(lib,”ws2_32.lib”) 相当于将ws2_32.lib静态链接库加入到项目中,效果和添加引用是一样的。

#define WINAPI
__stdcall,表示函数调用方式,暂时可以不理会,不影响代码编写,只需要知道MessageBox()返回值为
int,表示按下的按钮。

    if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR  ){

云顶娱乐平台 9

    if(serverSocket == INVALID_SOCKET){

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入进行运算处理得到输出控制)。

    }else{

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“
设计这个概念已经被融入到C++之中
”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

    }

    serverAddress.sin_addr.S_un.S_addr =
htonl(INADDR_ANY);

    if(pht==NULL){

        cout << “h_aliases:” <<
pht->h_aliases << endl;

    }else{

        cout << “绑定套接字端口失败” << endl;

 

         WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数表示程序请求使用的Socket版本,高字节表示副版本,低字节表示主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数的时候,操作系统根据请求的Socket版本来搜索响应的Socket库,绑定到Socket库到应用程序中。在之后的程序中可以调用Socket库中的其他的socket函数。

    SOCKET serverSocket =
socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

        cout << “获取本地主机的Name失败:”<<WSAGetLastError()<< SOCKET_ERROR <<
endl;

            in_addr addr = *(in_addr*)
pht->h_addr_list[i];

 

    }else{

         开启Windows Sock
Asynchronous,对应当程序结束的时候,就应该关闭,WSACleanup()用于接触于Socket库的绑定并且释放掉Socket库所占用的系统资源。

        int addrlen = sizeof(clientAddress);

    }

        Sleep(3000);

        cout << WSAGetLastError() <<
endl;

   

        cout << “套接字初始化失败”<<  endl;

        cout << WSAGetLastError() <<
endl;

    }else{

        }

        for(int i = 0; pht->h_addr_list[i] !=
NULL;i++){

    }

    }

            cout << “IP:”
<<inet_ntoa(addr) << endl;

 

 

        exit(-1);

 

        sockaddr_in clientAddress;

         函数原型: int
PASCAL FAR gethostname( char FAR * name, int namelen);

        cout << “成功监听端口:”<< listen_port  << endl;

    if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR  ){

#include <iostream>

        cout <<“本地主机的名字是:” << buf << endl;

3.2获取主机的IP
gethostbyname(const char* name);

        
Name:用于指向主机名缓冲区的指针,namelen: 缓冲区的大小。

    if( bind(serverSocket,(sockaddr*)&serverAddress,
sizeof(serverAddress)) == SOCKET_ERROR){

    WSACleanup();// 完成清理工作

         int WSAStartup(WORD wVersionRequest,
LPWSADATA lpWSAData);

    while(true){

        cout << “h_aliases:” <<
pht->h_aliases << endl;

    return 0;

  1. WSAStartup 函数的介绍

    serverAddress.sin_family = AF_INET;

         If the function return 0, 表示成功。

   

    }

        cout << “成功绑定端口:” << listen_port << endl;

    if( listen(serverSocket,SOMAXCONN) ==
SOCKET_ERROR){

            cout <<inet_ntoa(addr) <<
endl;

         #include <Windows.h>

    }

        cout << “套接字初始化成功” << endl;

        //cout << AF_INET <<
endl;

    }

    WSACleanup();// 完成清理工作

        cout << WSAGetLastError() <<
endl;