《Windows核心编程》---动态链接库和钩子基础

钩子编程(HOOK) 屏蔽所有按键、鼠标及系统功能键 (4) [钩子编程(HOOK) 屏蔽所有按键鼠标及系统功能键]上篇文章《钩子编程(HOOK) 安装系统全局钩子》已经详细的讲解了全局钩子的安装,下面我们增强一下钩子的功能,实现屏蔽所有按键鼠标与系统功能键。要实现这个功能,我们需要安装两个全局钩子,"鼠标钩子" 与 "低级键盘钩子"。鼠标钩子——实现屏蔽所有鼠标点击操作。低级键盘钩子——实现屏蔽所有键盘操作,包括屏蔽功能键(ALT+F4,WIN,ALT+TAB,ALT+ESC,CTRL+ESC....)。注意:不包括CTRL+ 阅读详情

动态链接库是应用程序的一个模块,这个模块用于导出一些函数和数据以供其他程序中的其他模块调用:

1)动态链接库是应用程序的一部分,是作为模块被进程加载到自己的空间地址中;

2)动态链接库在程序编译时并不会被插入到可执行文件中,在程序运行时这个库的代码才会调入内存,即“动态链接”;

3)若有多个程序用到同一个动态链接库,Windows在物理内存中只保留一份库的代码,仅通过分页机制将这份代码映射到不同的进程中;

 

动态链接库的扩展名一般是dll,但也可以是某些exe、各种控件(*.ocx)等。

 

动态链接库的入口点函数是DllMain函数,它仅供操作系统使用,Windows在库装载、卸载、进程中线程创建和结束时调用入口函数,以便动态链接库采取相应的动作;DllMain函数的框架结构为:

         BOOL APIENTRY DllMain(HANDLE hModule,                  //本模块句柄

                                                                                    DWORD ul_reason_for_call,        //调用的原因

                                                                                    LPVOID lpReserved)     //没有被使用

         {

                   switch(ul_reason_for_call)

                   {

                   case DLL_PROCESS_ATTACH:     //动态链接库刚被映射到某个进程的地址空间

 

                   case DLL_THREAD_ATTACH:               //应用程序创建了一个新的线程

 

                   case DLL_THREAD_DETACH:               //应用程序某个线程正常终止

 

                   case DLL_PROCESS_DETACH:     //动态链接库将被卸载

 

                   default:

                            break;

                   }

                   return TRUE;

         }

hModule参数是本DLL模块的句柄,即本动态链接库模块的实例句柄,数值上是系统将DLL文件映象加载到进程的地址空间时使用的基地址。

注意:在动态链接库中,通过GetModuleHandle(NULL)语句得到的是主模块(即可执行文件映象)的基地址,而不是DLL文件映象的基地址。

 

DLL可以定义两种函数:导出函数和内部函数。导出函数可以被其他模块调用,也可以被定义这个函数的模块调用,而内部函数当然只能被定义这个函数的模块调用。

动态链接库的主要功能是向外导出函数,供进程中其他模块使用。一般会生成3个主要的文件:.dll文件就是动态链接库,.lib文件时供程序开发用的导入库,.h文件包含了导出函数的声明。

 

调用DLL中的导出函数有两种方法:

1)装载期间动态链接:必须使用.lib文件,它为系统提供了加载这个DLL和定位DLL中的导出函数所需的信息;(上述3个文件都要用到)

实例代码如下:

#include <windows.h>

#include "acedll.h"

//指明要链接到acedll.lib库,也可以不用#pragma,

//直接将acedll.lib文件添加到工程中也是一样的

#pragma comment(lib, "acedll")

 

void main()

{

         //像调用本地函数一样调用acedll.lib库中的导出函数Export(..)

         Export("SEE YOU IN ANOTHER LIFE BROTHER!");

}

这种方法的缺点是:如果用户丢失了DLL文件,那么程序是永远也不能启动的了。因此,很多时候要采用运行期间动态链接的方法,以便决定DLL加载失败后如何处理。

 

2)运行期间动态加载:使用LoadLibrary或LoadLibraryEx函数在运行期间加载这个DLL,DLL被加载后,加载模块调用GetProcAddress函数取得DLL导出函数的地址,再通过该函数地址调用DLL中的函数。(只需要.dll文件就行)为了实现这个方法,一般需要在工程中建立一个DEF文件,用来指定要导出的函数:

EXPORTS

         Export

表示此DLL库要向外导出Export函数。

实例代码如下:

#include <windows.h>

//声明函数原型

typedef void(*PFNEXPORT)(LPCTSTR);

int main(int argc, char* argv[])

{

         //加载DLL库

         HMODULE hModule = ::LoadLibrary("acedll.dll");

         if(hModule != NULL)

         {

                   //取得Export函数的地址

                   PFNEXPORT mExport = (PFNEXPORT)::GetProcAddress(hModule, "Export");

                   if(mExport != NULL)

                   {

                            mExport("SEE YOU IN ANOTHER LIFE BROTHER!");

                   }

                   //卸载DLL库

                   ::FreeLibrary(hModule);

         }

         return 0;

}

LoadLibrary函数的作用是加载指定目录下的DLL库到进程的虚拟地址空间,函数执行成功返回此DLL模块的句柄,否则返回NULL。事实上,载入器也是调用这个函数加载DLL的。

 

 

=====================JIN的分割线===================

Windows应用程序的运行模式是基于消息驱动的,任何线程只要注册了窗口类,都会有一个消息队列来接收用户的输入消息和系统消息。而为了取得特定线程接收或发送的消息,就要用到Windows提供的钩子。

钩子是Windows消息处理机制的一个监视点,应用程序可以在这里安装一个钩子函数以监视指定窗口某种类型的消息,所监视的窗口可以是其他进程创建的。钩子函数通过调用相关的API函数,把它挂入系统,每当特定消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,这时钩子函数既可以加工处理该消息,也可以不作处理而继续传递该消息。


关于Windows钩子需要知道以下几点:

1)钩子是用来截获系统中的消息流的;

2)截获消息后,用来处理消息的子程序叫做钩子函数,它是应用程序自定义的一个函数,在安装钩子时要把这个函数的地址告知Windows;

3)系统中同一时间可能有多个进程安装了钩子,多个钩子函数在一起组成钩子链;因此,在处理截获到的消息后,应该把消息事件传递下去。

 

系统为每一种钩子建立一个钩子链(HOOK CHAIN),一个钩子链实际上就是一个指针列表,其指针指向钩子的各个处理函数,这些函数是一种特殊的回调函数。像堆栈一样,在钩子链中最后安装的钩子函数放在钩子链的最顶层,最先安装的钩子则放在钩子链的最底层,Windows系统负责记录和管理这条函数链。系统的各种消息首先被送到最顶层的钩子函数,即最后加入的钩子优先获得控制权。


钩子按事件分类主要有以下几种类型:

1)键盘钩子和低级键盘钩子:监视各种键盘消息;

2)外壳钩子:监视各种Shell事件消息,如启动和关闭应用程序等;

3)鼠标钩子和低级鼠标钩子:监视各种鼠标消息;

4)窗口过程钩子:监视所有从系统消息队列发往目标窗口的消息;

5)日志钩子:即如从系统消息队列中取出的各种事件消息。

 

安装钩子:

SetWindowsHookEx函数可以把应用程序定义的钩子函数安装到系统中:

HHOOK SetWindowsHookEx(

         int idHook,                                          //指定钩子的类型ª

         HOOKPROC lpfn,                            //钩子函数的地址。如果使º用的是远程钩子,钩子函数必须放在一个DLL中

         HINSTANCE hMod,                //钩子函数所在DLL的实例句柄。如果是一个局部的钩子,该参数的值为NULL

         DWORD dwThreadId);         //指定要为哪个线程安装钩子,如果该值为0,那么该钩子将被解释为系统范围的

各个参数解释如下:

idHook参数取值:

WH_CALLWNDPROC:当目标线程调用SendMessage函数发送消息时,钩子函数被调用

WH_CALLWNDPROCRET:当SendMessage发送的消息返回时,钩子函数被调用

WH_GETMESSAGE:当目标线程调用GetMessage或PeekMessage时,钩子函数被调用

WH_KEYBOARD:当从消息队列中查询WM_KEYUP或WM_KEYDOWN消息时

WH_MOUSE:当调用从消息队列中查询鼠标事件消息时

WH_MSGFILTER:当对话框、菜单或滚动条要处理一个消息时,钩子函数被调用。该钩子是局部的,它是为那些有自己消息处理过程的控件对象设计的

WH_SYSMSGFILTER:和WH_MSGFILTER一样,只不过是系统范围的

WH_JOURNALRECORD:当windows从硬件队列中获得消息时

WH_JOURNALPLAYBACK:当一个事件从系统的硬件队列中被请求时

WH_SHELL:当关于Windows外壳事件发生时,譬如任务条需要重画它的按钮

WH_CBT:当基于计算机的训练(CBT)事件发生时

WH_FOREGROUNDIDLE:Windows自己使用

WH_DEBUG:用来给钩子函数除错

 

如果dwThreadId参数是0,或者指定一个有其他进程创建的线程ID,则lpfn参数指向的钩子函数必须位于一个DLL中,因为进程的地址空间是相互隔离的,发生事件的进程不能调用其他进程地址空间的钩子函数。如果钩子函数的实现代码在DLL中,在相关事件发生时,系统会把这个DLL插入到发生事件的进程的地址空间,使它能够调用钩子函数。这种需要将钩子函数写进DLL以便挂钩其他进程事件的钩子称为远程钩子。

如果dwThreadId参数指定一个由自身进程创建的线程ID,lpfn参数指向的钩子函数只要在当前进程中即可,不必非要写入DLL。这种仅挂钩属于自身进程事件的钩子称为局部钩子。

 

钩子函数的一般形式如下:

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)

{

       //处理该消息的代码

       .......

       return ::CallNextHookEx(hHook, nCode, wParam, lParam);

}

其中,nCode参数是Hook代码,钩子函数用这个参数来确定任务,它的值依赖于Hook的类型。wParam和lParam参数的值依赖于Hook代码,但是它们典型的值是一些关于发送或者接收消息的信息。

hHook参数是安装钩子时得到的钩子句柄(SetWindowsHookEx的返回值)。

 

卸载钩子:

BOOL UnhookWindowsHookEx(HHOOK hhk);            //hhk是要卸载的钩子的句柄

 

 

下面实现右键双击关闭当前窗口的功能,为了使用方便,我们设计成没有界面的,因此,我们先用VC生成基于对话框的应用程序,并且在OnInitDialog()函数中添加如下实现程序无界面运行的代码:

SetWindowPos(&CWnd::wndNoTopMost, 0, 0, 0, 0, WSP_HIDEWINDOW);

ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

 

其中SetWindowPos函数完成了设置窗口处于最底层、大小为0并且隐藏的功能;ModifyStyleEx函数用来更改窗口的扩展样式。

 

为了完成全局钩子的安装,我们需要动态链接库ACEHook.dll,在SetHook()函数的实现中调用SetWindowsHookEx(WH_MOUSE, AceMouseProc, GetModuleHandle(“ACEHook”), 0)安装全局钩子,钩子函数AceMouseProc实现对鼠标右键双击事件的响应:

 

LRESULT CALLBACK AceMouseProc(

              int nCode, WPARAM wParam, LPARAM lParam)

{

       if(nCode >= 0)

       {

              if(wParam == WM_RBUTTONDBLCLK)

              {

                     hWnd = GetForegroundWindow();

                     GetWindowRect(hWnd, &rt);

                     ptNew.x = rt.right - 13;

                     ptNew.y = rt.top + 13;   

                     GetCursorPos(&ptOld);

                     SetCursorPos(ptNew.x, ptNew.y);

                    

                     mouse_event(MOUSEEVENTF_LEFTDOWN, ptNew.x, ptNew.y, 0, 0);

                     mouse_event(MOUSEEVENTF_LEFTUP, PTNew.x, ptNew.y, 0, 0);

                    

                     SetCursorPos(ptOld.x, ptOld.y);

                     return 1;

              }     

       }

       return CallNextHookEx(g_hMouse, nCode, wParam, lParam);   

}

 

如果是右键双击事件,系统首先调用GetForegroundWindow()函数获得用户当前正在工作的窗口句柄,通过此窗口句柄可调用GetWindowRect()函数来获得当前工作窗口在屏幕上的坐标。ptNew是POINT类型变量,通过计算出的当前窗口的关闭按钮在屏幕上的坐标对其赋值。当前窗口的关闭按钮能响应鼠标事件的屏幕坐标范围是:[rt.right-4, rt.right-21],在此我们选用rt.right-13。

窗口的关闭我们通过调用mouse_event()函数来完成,mouse_event()函数可以模拟鼠标按键及滚轮等动作,因此,通过在窗口关闭按钮位置合成鼠标的左键单击事件可以实现关闭窗口的功能。鼠标的左键单击事件通过组合左键按下(MOUSEEVENTF_LEFTDOWN)和左键放开(MOUSEEVENTF_LEFTUP)事件获得。

 

 

 

 

 

 

Windows核心编程(十八)DLL基础 DLL全称dynamic linking library。即动态链接库。广泛应用与windows及其他系统中。   windows中所有API都包含在DLL中。三个最重要的DLL是Kernel32.dll,User32.dll,GDI32.dll。       使用dll的好处:      1:扩展了应用程序的特性。      2:简化了项目管理           阅读详情

相关推荐

动态链接库的创建和编程指南

首先,我们创建一个动态链接库项目,然后在代码中定义导出函数。接着,我们生成动态链接库,并使用LoadLibrary和GetProcAddress函数在独立程序中使用动态链接库。动态链接库(Dynamic Link Library,简称 DLL)是一种在Windows操作系统中常用的可重用的代码库。在代码中,我们需要使用特定的修饰符来标记导出函数。编译项目时,将生成一个.dll文件,这就是我们的动态链接库。现在,我们可以创建一个独立的程序来使用动态链接库。需要注意的是,在使用完动态链接库后,我们需要调用。

2301_79325339的博客 213

windows下动态链接库和静态链接库的介绍

window下有两种库: 1、动态链接库:LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供。(这种方式更灵活,写的程序体积小,但是需要.exe和dll同时发布) 2、静态链接库:LIB包含函数代码本身,在编译时直接将代码加入程序当中(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dll

997

Windows键盘钩子DLL开发实战

钩子(Hook)是指在Windows系统中,通过调用函数注册的一个回调函数,该函数可以拦截并处理系统中特定类型的消息事件。钩子机制的核心思想是将开发者定义的函数插入到系统的事件处理链中,从而在事件到达目标窗口前进行预处理或修改。钩子的注册需要指定钩子类型(Hook Type),不同的钩子类型对应不同的事件拦截能力。例如::拦截键盘消息。WH_MOUSE:拦截鼠标消息。:拦截发送到窗口的消息。:拦截从消息队列中取出的消息。钩子分为系统级钩子和线程级钩子。

weixin_35935514的博客 1235

Windows平台下动态链接库的总结

1、 动态链接库与静态连接库        静态连接库与动态链接库都是经过编译器编译之后的,在计算机上可以直接运行的二进制目标文件,就像exe文件一样,但不同于exe文件的是静态链接库和动态链接库不可以独立运行,一般而言,动态链接库和动态链接是在内部实现了一些功能,对外提供了一组接口函数使得外部的程序能够通过这些对外的接口函数来使用其内部的功能。        静态链接库,是在调用该静态库的可

逍遥子曰: 3448

Windows编程HOOK与DLL实例详解

在Windows系统开发中,HOOK(钩子)机制与DLL(动态链接库)技术是实现底层系统控制与功能扩展的核心手段。HOOK允许开发者截获并处理系统级或应用程序级的消息流,从而实现如全局快捷键、输入监控、行为分析等功能;而DLL则提供了模块化编程的基础,使得代码可以被多个程序共享与动态加载,提升系统性能与灵活性。理解HOOK与DLL的工作原理,不仅有助于构建稳定高效的系统工具,还能为后续的跨进程通信、消息拦截与调试优化等高级开发任务打下坚实基础。

weixin_42613017的博客 1351

WINDOWS程序设计动态链接库 DLL 示例程序

使用VS2010编写的《Windows程序设计》中动态链接库 dll 的例子 原书中有一些错误 以及不适用于新版本VS的地方 对程序添加了很多自己的理解的注释 主要是一个dll的编写和使用 适合对动态链接库不了解的同学学习参考

动态连接库和钩子

 动态连接库和钩子需要解决的几个问题:1. 了解动态连接库的性质2. 如何编写动态连接库3. 如何调用动态连接库4. 什么是钩子以及钩子的类型5. 远程钩子的安装和使用6. 日志钩子7. API钩子一. 什么是动态连接库动态连接库使用标准的PE文件格式,在动态连接库里可以定义资源并使用各种资源,并且可以导入并使用其它动态连接库里定义的函数(动态连接库嵌套)。它提供函数给其它程序在运行的时候调用。通

ToBeroOTer的专栏 2877

windows下DLL动态库注入和拦截

程序实现的功能是注入一个动态库,拦截其它程序不能打开指定exe。程序分为三部分:用于测试的exe程序(Test)、拦截动态库(inlinehook)、动态库注入和卸载程序(DLLinject)

WIN32核心编程 - 动态链接库

动态链接库(DLL)导出函数导入库代码重用模块化内存效率。

0xCC说逆向 1109

VC程序在Win32环境下动态链接库(DLL)编程原理

主要介绍了VC程序在Win32环境下动态链接库(DLL)编程原理,包括了dll文件的原理与具体实现过程,对于深入掌握VC程序设计具有很好的参考借鉴价值,需要的朋友可以参考下

保姆级避坑指南:在NVMe SSD上安装Ubuntu 24.04,搞定RST错误和分区方案

本文提供在NVMe SSD上安装Ubuntu 24.04的详细指南,解决RST错误和分区方案问题。从BIOS设置到分区策略优化,帮助用户充分发挥NVMe固态硬盘性能,避免常见安装陷阱,实现无痛安装和后期调优。

weixin_26976635的博客 560

钩子函数介绍和总结

Author:快来救救我 ps:快乐废宅 文章目录前言一、钩子函数(Hook)是什么?理解:特点:举例钩子类型二、使用步骤1.引入库2.读入数据总结 前言 我看了其他博客有些对钩子函数讲述的篇幅要不太长,要不太短,所以我打算写一个中等篇幅的,易于看完也能对它大体概况。我也会在后面附上参考的其他人的博客,想要看简短或者详细的,可以点击链接去看。 在开发当作有碰见过几次钩子函数但是一直对这个没有什么概念,所以特意来了解了解,如若有理解错误,请再底下评论,后续会持续更改~ 一、钩子函数(Hook)是什么? 理.

qq_43614246的博客 3万+

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 453

Windows HOOK钩子技术

Windows HooK钩子技术是指基于Windows中窗口的程序的消息处理里机制,对系统或者进程中的消息进行截获和处理,并将截获和处理的消息在重新处理和发送,使其可以实现不同的功能。 钩子技术分为系统钩子技术和线程钩子技术 系统钩子:是用于监视真个系统中的消息的钩子技术,因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。做好之后使用其他程序将钩子挂载到系统的进程中。 线程钩子:指的是对指定线程进行监视。 钩子原理 在使用钩子技术的时候,WINDOWS会先在内存中创

qq_43812868的博客 2868

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2415

利用Matlab绘制非线性系统相图:从理论到实践

本文详细介绍了如何利用Matlab进行非线性系统的相图绘制与相平面分析。从理论基础的状态空间转换出发,通过无阻尼线性谐振子和范德波尔振荡器等实例,手把手演示了使用ode45求解器绘制相图、分析平衡点与极限环的完整流程,并分享了方向场绘制、参数分岔探索及常见错误解决方案等高级技巧,为动力学系统分析与控制设计提供了直观强大的可视化工具。

yhn456789的博客 905

delphi windows编程_深入Windows编程之钩子原理一

我的理想是能够写出一个可以永不封号的游戏外G嗯,所以需要学习Windows下编程,最近好不容易有一点点空余时间,抓紧时间读书【Delphi下深入Windows编程】,人丑就该多读书钩子原理定义:消息钩子是创建钩子时在Windows的消息处理链中插入一个函数,一旦钩子安装成功,就可以监控消息,那么向所有应用程序发送的消息都会先经过此函数安装钩子之前的Windows消息执行流程安装钩子之后注...

weixin_39906114的博客 193

科研党必备:5分钟搞定MATLAB闪退问题(含R2020a-R2023b各版本适配)

本文针对科研人员常见的MATLAB闪退问题,提供了从R2020a到R2023b各版本的适配解决方案。通过分析六大诱因和版本定制化修复方法,帮助用户快速诊断和解决闪退问题,包括内存优化、高级调试和预防性维护等实用技巧,确保科研计算的连续性和稳定性。

t1u2v的博客 1957

钩子编程(HOOK) 安装系统全局钩子 (3)

[钩子编程(HOOK) 安装系统全局钩子]全局钩子,钩子一词多用于计算机编程中,英文叫hook,指利用api来提前拦截并处理windows消息的一种技术。如键盘钩子,许多木马都有这东西,监视你的键盘操作。全局钩子是系统钩子的一种,当指定的一些消息被系统中任何应用程序所处理时,这个钩子就被调用。

机器学习 1万+

51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南)

本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。

weixin_30752699的博客 413

【FPGA】Robei EDA的使用(10)————如何更新EDA的使用license

#海卑而下,能聚众水;学问笃实,以生光辉。 有的时候,有些问题自己通过查找资料解决,宁愿磨难一下,走点弯路,但收获更深刻的认知;不过,有些问题,问一下别人,可能会避免自己耗费过多时间做无用工,这些问题问会的人是极好的。但是怎样把握这个问题的类型,大约只能靠经验了~ (问我为何出此感言,谁叫我纠结了两天的问题,被人家一句话解决,我这个恨啊) ————————————————————正文开始的分割线———————————————— Robei EDA在使用上会有一个注册码,这个license在获取之后,每一次的

Ninquelote的博客 1002

Windows核心编程 HOOK_windows hook

参数二:lpfn回调函数,钩子拿到这些信息怎么给你,通过回调函数把信息交给你;需要注意,不同钩子的回调函数不一样,可以通过msdn查看;钩子子程的指针。如果_dwThreadId_参数为零或指定由不同进程创建的线程的标识符,则_lpfn_参数必须指向DLL中的钩子子程。否则,_lpfn_可以指向与当前进程关联的代码中的钩子子程。参数三:hmod局部钩子填写NULL;全局钩子填窗口所在模块的句柄,(全局程序会卡)DLL的句柄参数四:dwThreadId。

2401_86950922的博客 926

SCI投稿Title Page、Cover letter、Highlights、Manuscript模板

(简要介绍一下论文的创新性). I hope this paper issuitable for “Journal Name”.版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/weixin_48615832/article/details/120317336。

qq_15963745的博客 3700

WINDOWS核心编程——DLL基础和实操

与将所有的指令通过链接器在生成exe的时候都链接在一起并安排好各个指令的位置不同,windows还提供了动态链接(DLL)技术。一般情况下我们会处于以下原因采用DLL技术: 1.扩展了应用程序的特性。DLL可以被动态地载入到进程的地址空间中。 2.简化了项目管理,可以让不同的开发团队管理不同的模块。 3.有助于节省内存。一个dll可被多个程序共享。多个程序调用同一个dll内的同一个函数时,系统却只需将该dll加载一次。 4.促进资源共享。 5.促进了本地化。可以使应用程序只包含代码但不包含用户界面组件。

whl0071的专栏 1618

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Brackets Sequence--poj--1141
下一篇: 《ASCE1885的IT 笔试面试题》-- 0000 0000
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值