动态链接库 多线程 文件操作 注册表 多媒体编程 winsock 编程 ( 网络编程 )...

100
第 1第 动动动动动 动动动动动 动动动 动动动 动动动动 动动动动 动动动 动动动 动动 动动 动动 动动 Winsock Winsock 动动 动动 ( ( 动动动动 动动动动 ) ) 动动动 动动动

Upload: declan

Post on 28-Jan-2016

175 views

Category:

Documents


0 download

DESCRIPTION

动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库. 第 11 讲 动态链接库. 2014年8月25日星期一. 动态链接库的基本概念 动态链接库的创建 动态链接库的使用. 动态链接库的基本概念. 动态链接库 (DLLs) 是从 C 语言函数库和 Pascal 库单元的概念发展而来的。 几乎所有的 Windows API 都包含在 DLL 中 是可执行文件 , 它包含函数 , 数据或资源等其他应用程序可用到的东西 它可以在需要的时候随时装入 , 在装入时或运行时. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 1页

动态链接库动态链接库多线程多线程文件操作文件操作注册表注册表多媒体编程多媒体编程WinsockWinsock 编程编程 (( 网络编程网络编程 ))数据库数据库

Page 2: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 2页

第第 1111 讲 动态链接库讲 动态链接库

April 21, 2023

Page 3: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 3页

动态链接库的基本概念动态链接库的创建动态链接库的使用

Page 4: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 4页

动态链接库的基本概念

动态链接库 (DLLs) 是从 C 语言函数库和 Pascal 库单元的概念发展而来的。几乎所有的 Windows API 都包含在DLL 中是可执行文件 , 它包含函数 , 数据或资源等其他应用程序可用到的东西它可以在需要的时候随时装入 , 在装入时或运行时

Page 5: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 5页

自从微软推出 16 位的 Windows 操作系统起,此后每种版本的 Windows 操作系统都非常依赖于动态链接库 (DLL) 中的函数和数据,实际上 Windows 操作系统中几乎所有的内容都由DLL 以一种或另外一种形式代表着。显示的字体和图标存储在 GDI.DLL 中显示 Windows 桌面和处理用户的输入所需要的代码被存储在一个 User.DLL 中Windows 编程所需要的大量的 API 函数也被包含在 Kernel.DLL 中

Page 6: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 6页

静态链接库

多个应用程序,多个静态链接库的副本占用较多的内存资源在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为 *.LIB )Visual C++ 的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件

Page 7: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 7页

" 静态链接 " ,此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行

Page 8: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 8页

DLL 可在函数调用其中的函数时,才被装入内存DLL 在内存中的一个副本可供多个应用程序使用减少了内存和磁盘空间DLL 是包含若干函数、类或资源的库文件 函数和数据被存储在一个 DLL 上 ,可供其它 DLL 或应用程序使用

Page 9: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 9页

DLL 的优点

共享 DLL ,节省内存,减少动态交换不同程序设计语言之间可以共享 DLL减少可执行代码大小重用代码大工程可分为易管理的小工程实现新功能更容易、软件升级

Page 10: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 10页

在动态库的情况下,有两个文件引入库( .LIB )文件DLL 文件

引入库文件包含被 DLL 导出的函数的名称和位置 DLL 包含实际的函数和数据 应用程序使用 LIB 文件链接到所需要使用的 DLL 文件

Page 11: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 11页

动态链接库的创建

Win32 Dynamic-Link Library 方式 使用导出函数关键字 _declspec(dllexport) 创建 用 .def 文件创建

微软的 Visual C++ 支持三种 DLL Non-MFC Dll (非 MFC 动态库)Regular Dll (常规 DLL )Extension Dll (扩展 DLL )

Page 12: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 12页

Win32 Dynamic-Link Library方式

(1) 使用导出函数关键字 _declspec(dllexport) 创建 //Win32DLL.h

extern "C" _declspec(dllexport) int Max(int a, int b);extern "C" _declspec(dllexport) int Min(int a, int b);

//Win32DLL.cpp#include"Win32DLL.h"int Max(int a, int b){ return (a>=b)?a:b; }int Min(int a, int b){ return (a<=b)?a:b; }

Page 13: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 13页

查看 Debug 目录,生成了两个文件Win32DLL.dllWin32DLL.lib

Page 14: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 14页

(2) 用 .def 文件创建删除头文件和实现文件中的包含部分建立一个新文本文件 Win32DLL_DEF.def

Page 15: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 15页

DEF 文件的格式LIBRARY Win32DLL_DefEXPORTSMax :Max@1Min :Min@2

Page 16: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 16页

实现文件//Win32DLL_DEF.cppint Max(int a, int b){ return (a>=b)?a:b; }int Min(int a, int b){ return (a<=b)?a:b; }

Page 17: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 17页

MFC AppWizard[dll] 方式生成常规 / 扩展 DLL

常规 DLL 静态链接到 MFC 常规 DLL 动态链接到 MFC MFC 扩展 DLL

Page 18: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 18页

MFC 生成框架可以使用 MFC 类其它与 Non-MFC 大同小异

Page 19: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 19页

DLL 的发布

*.h*.lib*.dll

Page 20: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 20页

DLL 的使用

隐式链接显式链接

Page 21: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 21页

要先将 MyDll.dll 和 MyDll.lib 拷贝到某目录下面 Windows 系统将遵循下面的搜索顺序来定位DLL :

1 .包含 EXE 文件的目录2 .进程的当前工作目录3 . Windows 系统目录4 . Windows 目录5 .列在 Path 环境变量中的一系列目录

Page 22: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 22页

隐式链接

_declspec(dllimport) //*.h#pragma comment(lib , "MyDll.lib")extern "C"_declspec(dllimport) int Max(int a,int b);extern "C"_declspec(dllimport) int Min(int a,int b);//*.cpp

#include"Dlltest.h"…

Int x=Min(100,200);

Page 23: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 23页

显式链接

显式链接是应用程序在执行过程中随时可以加载 DLL 文件,也可以随时卸载 DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。 实现显式链接要麻烦一些。

Page 24: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 24页

跟显式链接相关的函数HINSTANCE LoadLibrary( LPCTSTR lpLibFileName);

FARPROC GetProcAddress( HMODULE hModule, LPCSTR

lpProcName); BOOL FreeLibrary( HMODULE hLibModule);

Page 25: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 25页

typedef int(*pMax)(int a,int b); typedef int(*pMin)(int a,int b); HINSTANCE hDLL; pMax Max;

hDLL=LoadLibrary("Win32DLL.dll");// 加载动态链接库 Win32DLL.dll 文件; if(!hDLL) { MessageBox(" 装入动态链接库失败 !"); return ; }

Max=(pMax)GetProcAddress(hDLL,"Max"); if(!Max) { MessageBox(" 获取函数地址失败 !"); return ; }

int A=Max(5,8); CString x; x.Format(" 较大数是 %d!",A); MessageBox(x);

if(!FreeLibrary(hDLL))// 卸载 Win32DLL.dll 文件; MessageBox(" 关闭 Win32DLL.dll 失败 ");

Page 26: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 26页

使用显式链接应用程序编译时不需要使用相应的 Lib 文件 关键字 typedef ,定义指向和 DLL 中相同的函数原型指针GetProcAddress(hDLL,“Min”) 改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))

Page 27: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 27页

dumpbin

usage: DUMPBIN [options] [files]

options:

/ALL /ARCH /ARCHIVEMEMBERS /DEPENDENTS /DIRECTIVES /DISASM /EXPORTS /FPO /HEADERS /IMPORTS /LINENUMBERS /LINKERMEMBER[:{1|2}] /LOADCONFIG /OUT:filename /PDATA /RAWDATA[:{NONE|BYTES|SHORTS|LONGS}[,#]] /RELOCATIONS /SECTION:name /SUMMARY /SYMBOLS

Page 28: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 28页

DLL 的概述DLL 的创建DLL 的使用

Page 29: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 29页

第第 1212 讲 多线程讲 多线程

Page 30: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 30页

程序 Program进程 Process线程 Thread

Page 31: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 31页

线程的创建HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes DWORD dwStackSize, // initial thread stack size LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId // pointer to receive thread ID );

Page 32: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 32页

线程的终止

VOID ExitThread( DWORD dwExitCode // exit code for this thread ); HANDLE GetCurrentProcess(VOID) BOOL TerminateThread( HANDLE hThread, // handle to the thread DWORD dwExitCode // exit code for the thread );

Page 33: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 33页

线程的挂起

DWORD SuspendThread( HANDLE hThread // handle to the thread );

Page 34: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 34页

线程的恢复

DWORD ResumeThread( HANDLE hThread // identifies thread to restart );

Page 35: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 35页

线程类

CWinThread

Page 36: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 36页

第第 1313 讲 文件操作讲 文件操作

Page 37: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 37页

文本文件二进制文件

Page 38: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 38页

1. BMP 文件组成    BMP 文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24 个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在 BMP 文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为 4的倍数,则正常存储,否则,需要在后端补 0 ,凑足 4 的倍数。

Page 39: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 39页

2. BMP 文件头  BMP 文件头数据结构含有 BMP 文件的类型、文件大小和位图起始位置等信息。其结构定义如下 : typedef struct tagBITMAPFILEHEADER { WORD bfType; // 位图文件的类型,必须为 "BM" DWORD bfSize; // 位图文件的大小,以字节为单位 WORD bfReserved1; // 位图文件保留字,必须为 0 WORD bfReserved2; // 位图文件保留字,必须为 0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位 } BITMAPFILEHEADER ;该结构占据 14 个字节。

Page 40: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 40页

3. 位图信息头 BMP 位图信息头数据用于说明位图的尺寸等信息。其结构如下: typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构所占用字节数 LONG biWidth; // 位图的宽度,以像素为单位 LONG biHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的平面数不清,必须为 1 WORD biBitCount// 每个像素所需的位数,必须是 1(双色 ), 4(16色 ) , 8(256色 ) 或 24(真彩色 ) 之一 DWORD biCompression; // 位图压缩类型,必须是 0( 不压缩 ),1(BI_RLE8压缩类型 ) 或 2(BI_RLE4压缩类型 ) 之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数 LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER ;该结构占据 40 个字节。   注意:对于 BMP 文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么 16色图像采用 RLE4压缩算法, 256色图像采用 RLE8压缩算法。

Page 41: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 41页

4. 颜色表   颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个 RGBQUAD 类型的结构,定义一种颜色。 RGBQUAD结构的定义如下 : typedef struct tagRGBQUAD { BYTErgbBlue;// 蓝色的亮度 (值范围为 0-255) BYTErgbGreen; // 绿色的亮度 (值范围为 0-255) BYTErgbRed; // 红色的亮度 (值范围为 0-255) BYTErgbReserved;// 保留,必须为 0 } RGBQUAD;   颜色表中 RGBQUAD结构数据的个数由 BITMAPINFOHEADER 中的 biBitCount项来确定,当 biBitCount=1,4,8 时,分别有 2,16,256 个颜色表项,当biBitCount=24 时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分别对应R 、 G 、 B值,图像文件没有颜色表项。位图信息头和颜色表组成位图信息, BITMAPINFO结构定义如下 : typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD bmiColors[1]; // 颜色表 } BITMAPINFO;   注意: RGBQUAD 数据结构中,增加了一个保留字段 rgbReserved ,它不代表任何颜色,必须取固定的值为 "0" ,同时, RGBQUAD结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为 "00 , 00 , ff , 00" ,则表示该点为红色,而不是蓝色。

Page 42: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 42页

5. 位图数据   位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右 ,扫描行之间是从下到上。这种格式我们又称为Bottom_Up 位图,当然与之相对的还有 Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式。位图的一个像素值所占的字节数:当 biBitCount=1 时, 8 个像素占 1 个字节;当 biBitCount=4 时,2 个像素占 1 个字节;当 biBitCount=8 时, 1 个像素占 1 个字节;当biBitCount=24 时 ,1 个像素占 3 个字节,此时图像为真彩色图像。当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应 R 、 G 、 B 分量的值,这时候图像文件中没有颜色表。上面我已经讲过了, Windows 规定图像文件中一个扫描行所占的字节数必须是 4 的倍数(即以字为单位 ), 不足的以 0填充,图像文件中一个扫描行所占的字节数计算方法: DataSizePerLine= (biWidth* biBitCount+31)/8 ; // 一个扫描行所占的字节数   位图数据的大小按下式计算 ( 不压缩情况下 ) :   DataSize= DataSizePerLine* biHeight 。   上述是 BMP 文件格式的说明,搞清楚了以上的结构,就可以正确的操作图像文件,对它进行读或写操作了。

Page 43: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 43页

看一个位图处理的例子

Page 44: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 44页

FILECFileCStdioFile

Page 45: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 45页

第第 1414 讲 注册表讲 注册表

Page 46: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 46页

注册表的结构和作用注册表操作函数注册表操作实例

Page 47: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 47页

注册表的结构和作用

Page 48: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 48页

HKEY_CLASS_ROOT: 文件扩展名的信息HKEY_CURRENT_USER :当前用户的信息HKEY_LOCAL_MACHINE :本机软硬件配置信息HKEY_USERS :所有用户信息HKEY_CURRENT_CONFIG :计算机的当前配置HKEY_DYN_DATA :内存中的需要快速更新和检索的数据

Page 49: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 49页

注册表操作函数

打开注册表关闭注册表从注册表中取得数据设置注册表中的键值建立并打开制定的关键字枚举每一个子关键字

Page 50: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 50页

打开注册表打开一个键的函数: RegOpenKeyEx 函数定义: LONG RegOpenKeyEx(HKEY hKey, //已经打开的键的句柄,或者直接是上述几个根键 LPCTSTR lpSubKey, // 要打开的子键名字的地址 DWORD ulOptions, //保留值,必须为 0 REGSAM samDesired, //打开方式,如读还是写 PHKEY phkResult //返回的打开的子键的句柄

);

Page 51: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 51页

查询某一个键值: RegQueryValueEx函数定义: LONG RegQueryValueEx(

HKEY hKey,// 要查询的键的句柄 LPCTSTR lpValueName,// 要查询的键值的名称 LPDWORD lpReserved,//保留值 LPDWORD lpType,// 要查询的数据的类型 LPBYTE lpData,// 要返回的查询的数据 LPDWORD lpcbData//预置的数据的长度

);

Page 52: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 52页

设置一个键值RegSetValueEx函数定义: LONG RegSetValueEx(HKEY hKey,// 要设置的键的句柄LPCTSTR lpValueName,// 要访问的键值的名称LPDWORD lpReserved,//保留值DWORD dwType,// 要设置的数据的类型const BYTE *lpData,// 要设置的健值DWORD cbData// 数据的长度);

Page 53: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 53页

关闭LONG RegCloseKey(HKEY hKey);

Page 54: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 54页

例子

Page 55: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 55页

第第 1515 讲 多媒体编程讲 多媒体编程

April 21, 2023

Page 56: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 56页

媒体控制接口 (MCI)

Multimedia Control InterfaceMCI 在控制音频、视频等设备方面,提供了与设备无关的 API 接口。用户应用程序可使用 MCI控制标准多媒体设备不同设备其驱动控制方式不同:

一些 MCI 设备驱动程序 (影碟机 )直接控制目标设备; 一些 MCI 设备驱动程序 (MIDI 函数 ) 可使用

MMSYSTEM 函数间接控制目标设备; 还有一些 MCI 设备驱动程序 (影片演播器 )则提供了与

其他 Windows DLL 的高层接口。

Page 57: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 57页

应用程序通过设备的类型来区分设备 。如果要通过 MCI去控制设备,必须将相应的 MCI驱动程序和设备的驱动程序,DLL(如果需要 ) 装入。 MCI驱动程序的安装可通过 Windows 中的控制面板来完成。在 Windows 中SYSTEM.INI 文件中的〔mci〕部分包括了一个已安装了的设备类型表 。

Page 58: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 58页

设备类型

设备类型 描 述 cdaudiodatdigitalvideommmovieotheroverlayscannervcrvideodiscwaveaudio

激光唱机、 CD-ROM数字化磁带音频播放机窗口中的数字视频 (非基于 GUI)多媒体影片演播器未定义的MCI设备叠加设备 (窗口中的模拟视频 )图像扫描仪磁带录相机或播放机影碟机播放数字化波形文件的音频设备

Page 59: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 59页

Windows 提供的 MCI 设备驱动程序

设备类型 设备驱动程序名 描 述 cdaudio

mmmovie

sequencer

videodisc waveaudio

MCICDA.DRV

MCIMMP.DRV

MCISEQ.DRV

MCIPIONR.DRV MCIWAVE.DRV

一个播放光盘音频的MCI设备驱动程序一个播放多媒体影片文件的MCI设备驱动程序一个播放MIDI 音频文件的MCI设备驱动程序 一个播放先锋 LD-V4200影碟机文件的MCI设备驱动程序一个播放和记录波形音频文件的MCI设备驱动程序

Page 60: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 60页

MCI 命令消息接口

mciSendCommand

mciSendString

mciGetDeviceID

mciGetErrorString

mciSetYieldProc

mciGetYieldProc

Page 61: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 61页

mciSendCommand发送命令消息DWORD mciSendCommand(WORD DeviceID , WORD

Message , DWORD Param1 , DWORD Param2) DeviceID标识一个 MCI 设备; Message 标识要发出的消息,如MCI-OPEN 等; Param1 为消息指定标志; Param2 为指定一个指向消息数据结构的指针。 该函数调用如果成功返回 0 ,否则返回一个错误代码,

mciGetErrorString 可获得对这个错误的文本描述。

Page 62: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 62页

MCI 命令消息分类

直接由MCI 解释的命令由所有的 MCI 设备所支持的命令基本命令 扩展命令

Page 63: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 63页

直接由 MCI 解释的命令

消 息 描 述

MCI-SYSINFO

MCI-BREAK

MCI-SOUND

返回有关 MCI 设备的信息为指定的 MCI 设备设置一个中止键播放一段在 WIN.INI 文件中的〔 Sounds〕部分所指定的系统声音

Page 64: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 64页

所有的 MCI 设备支持的命令消息

消 息 描 述

MCI-CLOSE

MCI-GETDEVCAPS

MCI-INFOMCI-OPEN

MCI-STATUS

关闭一个 MCI 设备获得一个 MCI 设备的性能从一个 MCI 设备中得到有关的信息初始化一个 MCI 设备从一个 MCI 设备返回有关的状态信息

Page 65: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 65页

基本命令消息

消 息 描 述 MCI_LOAD

MCI_PAUSE

MCI_PLAY

MCI_RECORD

MCI_RESUME

MCI_SAVE

MCI_SEEK

MCI_SET

MCI_STATUS

MCI_STOP

从一个磁盘文件加载数据暂停播放或记录开始传送输出数据开始传送输入数据重新开始播放或记录将数据存储到磁盘文件中向前或向后检索设置设备信息从一个MCI设备返回有关的状态信息停止播放或记录

Page 66: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 66页

使用多媒体设备的基本步骤

打开MCI_OPEN设置或获取 MCI_SETMCI_STATUS

操作 MCI_XXX关闭 MCI_CLOSE

Page 67: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 67页

打开一个设备

使用设备之前,必须使用MCI_OPEN命令消息来初始化该设备打开MCI设备的方法有以下几种:(1)用设备类型字符串指定待打开的MCI设备 (2)用MCI设备驱动程序名指定待打开的MCI设备(3)用设备类型常数 (见下表 )指定待打开的MCI设备 (4)仅用设备元素指定打开的复合设备

Page 68: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 68页

设备类型及常数

设备类型 常 数 animation

cdaudio

dat

digitalvideo

other

overlay

scanner

vcr

sequencer

videodisc

waveaudio

MCI_DEVTYPE_ANIMATION

MCI_DEVTYPE_CD_AUDIO

MCI_DEVTYPE_DAT

MCI_DEVTYPE_DIGITAL_VIDEO

MCI_DEVTYPE_OTHER

MCI_DEVTYPE_OVERLAY

MCI_DEVTYPE_SCANNER

MCI_DEVTYPE_VIDEOTAPE

MCI_DEVTYPE_SEQUENCER

MCI_DEVTYPE_VIDEODISC

MCI_DEVTYPE_WAVEFORM_AUDIO

Page 69: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 69页

例如:打开一个 CD 设备

// 打开设备MCI_OPEN_PARMS OpenParms;OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;

OpenParms.wDeviceID = 0;if (mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE, (DWORD)(LPVOID) &OpenParms))return FALSE;m_wDeviceID = OpenParms.wDeviceID;

Page 70: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 70页

MCI_OPEN_PARMS 结构

typedef struct tagMCI_OPEN_PARMSA { DWORD dwCallback; MCIDEVICEID wDeviceID; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias;} MCI_OPEN_PARMS ;

Page 71: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 71页

关闭一个设备

MCI_CLOSE命令消息取消对一个设备或者设备元素的访问,它类似于一个文件的关闭操作。为了有助MCI 管理设备,应用程序在它使用完这个设备之后,应该明确地关闭它所使用过的每一个设备或者设备元素。

Page 72: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 72页

关闭设备

mciSendCommand (m_wDeviceID,

MCI_CLOSE, MCI_WAIT, NULL);

Page 73: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 73页

命令字符串接口-一个操作用一个字符串描述

使用命令字符串接口 3 个函数:mciSendString 向一个 MCI 设备驱动程序发送一个命令字符串。这个函数同时也具有对于回调函数和返回字符串的参数。mciGetErrorString返回一个同错误代码相对应的错误字符串。mciExecute 向一个 MCI 设备驱动程序发送一个命令字符串。

Page 74: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 74页

以上是管理多媒体设备的基本命令下面来看一看 CD播放器的开发简单方法 Visual Basic复杂方法 Visual C++

Page 75: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 75页

第第 1616 讲 讲 WinsockWinsock 编程编程

April 21, 2023

Page 76: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 76页

SOCKET简介 基于 WINDOWS SOCKET 的应用开发介绍 WINSOCK API主要函数简介聊天应用程序的设计说明服务器端客户端

Page 77: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 77页

SOCKET 简介

进程间通信方式80年代初,美国政府的高级研究工程机构( ARPA )给加利福尼亚大 学 Berkeley 分校提供了资金,让他们在 UNIX操作系统下实现 TCP/IP协议。研究人员为 TCP/IP网络通信开发了一个API 。这个 API 称为 Socket 接口(套接字)。今天, SOCKET 接口 是 TCP/IP网络最为通用的 API ,也是在 INTERNET 上进行应用开发最为通 用的 API 。

Page 78: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 78页

90年代初,由Microsoft联合了其他几家公司共同 制定了一套WINDOWS 下的网络编程接口,即WindowsSockets 规范。 从 1991年的 1.0版到 1995年的 2.0.8版,经过不断完善并在 Intel 、 Microsoft 、 Sun 、 SGI 、 Informix 、Novell 等公司的全力支持下,已成 为Windows网络编程的事实上的标准。

Page 79: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 79页

在实际应用中的 WINDOWSSOKCETS 规范主要有 1.1版和 2.2版。两者的最重要区别是1.1版 只支持 TCP/IP协议,而 2.2版可以支持多协议。SOCKET 实际在计算机中提供了一个通信端口,可以通过这个端口 与任何一个具有 SOCKET接口的计算机通信。应用程序在网络上传输,接 收的信息都通过这个 SOCKET 接口来实现。在应用开发中就像使用文件句 柄一样,可以对SOCKET句柄进行读写操作。

Page 80: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 80页

平台 Wi n s o c k版本Windows 95 1 . 1 ( 2 . 2 )Windows 98 2 . 2Windows NT 4.0 2 . 2Windows 2000 2 . 2

Page 81: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 81页

基于 WINDOWS SOCKET 的应用开发介绍

在 WINDOWS 系统中进行 WINSOCK开发使用的编程语言有很多, VC++ ,JAVA , DELPHI , VB 等。VC++ 用得较多 ,跟WinSocket联系最紧密

Page 82: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 82页

MFC 对 WinSocket 的封装

CAsynSocketCsocketCSocketFile 等

Page 83: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 83页

WinSocket API

在 VC 中进行 WINSOCK 的 API 编程开发,需要使用到下面三个文件: WINSOCK.H: 这是 WINSOCK API 的头文件。 WSOCK32.LIB: WINSOCK API连接库文件。在使用中,要把它作为项目 的非缺省的连接库包含到项目文件中去。 WINSOCK.DLL: WINSOCK 的动态连接库,位于 WINDOWS 的安装目录下。

Page 84: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 84页

服务器 / 客户机

面向连接的、可靠的 (TCP)无连接的、不可靠的 (UDP)一般在使用中,面向连接协议的SOCKET 编程模型应用最为广泛,因 为面向连接协议提供了一系列的数据纠错功能,可以保证在网络上传输 的数据及时、无误地到达对方。

Page 85: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 85页

面向连接的协议 Socket 模型

Page 86: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 86页

面向无连接的协议 Socket 模型

Page 87: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 87页

使用 SOCKET 接口(面向连接或无连接)进行网络通信时, 必须按下面的四步进行处理: 1 、程序必须建立一个 SOCKET 。 2 、程序必须按要求配置此 SOCKET 。也就是说,程序要么将此 SOCKET连接到远方的主机上,要么给此 SOCKET 指定一个 本地协议端口。 3 、程序必须按要求通过此 SOCKET 发送和接收数据。 4 、程序必须关闭此 SOCKET 。

Page 88: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 88页

WINSOCK API 主要函数简介WSAStartupWSACleanupsocketclosesocketbindlistenacceptconnect recv recvfromsend sendto

Page 89: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 89页

WSAStartup

连结应用程序与 Windows Sockets DLL 的第一个函数 此函数是应用程序调用 Windows Sockets DLL 函数中的第一个,此函数调用成功后,才可以再调用其他 Windows Sockets DLL 的函数。

Page 90: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 90页

int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData ); wVersionRequested 是 WinSocket API提供的调用方可使用的最高版本号,高字节是副版本号,低字节是主版本号lpWSAData 是指向 WSADATA 的指针,用来接收 Socket 的实现细节

Page 91: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 91页

WSACleanup

结束 Windows Sockets DLL 的使用当应用程序不再需要使用 Windows Sockets DLL 时,须调用此函数来注销使用,以便释放其占用的资源。int WSACleanup();

Page 92: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 92页

socket

SOCKET socket ( int af, int type, int protocol ); af 为 PF_INET ,表示互联网协议组type ,套接字的类型

SOCK_STREAMSOCK_DGRAM

protocol,套接字所使用的协议

Page 93: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 93页

closesocket

int closesocket ( SOCKET s );

Page 94: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 94页

bind

int bind ( SOCKET s, const struct sockaddr FAR* name, int namelen ); 一旦为某种特定协议创建了套接字,就必须将套接字绑定到一个已知地址。 bind函数可将指定的套接字同一个已知地址绑定到一起。

Page 95: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 95页

Page 96: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 96页

accept

SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen ); 服务器接收客户的连接请求,在建立好输入队列以后,服务器就调用accept ,然后进入休眠状态,等待用户的连接请求

Page 97: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 97页

connect

int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen ); 要求连接某一 Socket 到指定的网络上服务端。此函数用在客户端,用来向服务端要求建立连接。当连接建立完成后,客户端即可利用此 Socket 来与服务端进行信息传递。

Page 98: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 98页

recv recvfrom

int recv ( SOCKET s, char FAR* buf, int len, int flags ); int recvfrom ( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen );

Page 99: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 99页

send sendto

int send ( SOCKET s, const char FAR * buf, int len, int flags ); int sendto ( SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen );

Page 100: 动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock 编程 ( 网络编程 ) 数据库

第 100页

看例子

聊天程序服务器 /客户机Server/Client面向连接的 (TCP)