DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源
比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
一般来说,DLL 是一种磁盘文件,以dll、DRV、FON、SYS 和许多以 EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。
在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows *** 作系统对 DLL 的 *** 作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有
如果你不知道他是不是病毒还是系统文件 你可以行为的话可以看路径、名称、创建时间等信息。
反汇编的话可以看该DLL的功能是什么,如果插入explorerexe中的话很有可能就是病毒。
反汇编也称做逆向分析,通过反汇编来分析该程序的各功能模块。所以需要掌握相应的基础知道,如:汇编语言、程序设计思想、系统环境以及系统原理等。
对DLL反汇编的主要工具有:OD、IDA、softICE等。
动态反汇编工具可以直观的了解很多值及 *** 作。
静态反汇编工具则需要你计算相应的寄存器值。
>
只需要cpp和h的文件就可以了,在h中需要声明需要外部调用的函数,即给需要外部调用的函数前增加 extern "C" __declspec(dllexport)就可以了,下面是例子#include "stdioh"
#ifdef FUN_EXPORTS
#define FUN_API extern "C" __declspec(dllexport)
#else
#define FUN_API extern "C" __declspec(dllimport)
#endif
FUN_API int sum(int a, int b)
{
return a + b;
}
FUN_API int sub(int a, int b)
{
return a - b;
}
FUN_API int savedata(char p, int l)
{
return printf("savedata: %d, %s\n", l, p);
}
FUN_API char retstring(char p)
{
printf("retstring: %s\n", p);
return p;
}
static int counter = 0;
FUN_API int count()
{
return ++counter;
}
FUN_API int count2()
{
counter += 2;
return counter;
}
FUN_API void setcount(int c)
{
counter = c;
}
C程序编译成dll文件只不过是在要公开的接口函数声明前面加上几个特定的修饰符而已。
下面是个例子,用dev-cpp建了个dll的默认文档
/dllh文件/
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else / Not BUILDING_DLL /
# define DLLIMPORT __declspec (dllimport)
#endif / Not BUILDING_DLL /
DLLIMPORT void HelloWorld (void);
#endif / _DLL_H_ /
/dllmainc文件/
/ Replace "dllh" with the name of your header /
#include "dllh"
#include <windowsh>
#include <stdioh>
#include <stdlibh>
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!/n", "Hi", MB_ICONINFORMATION);
}
BOOL APIENTRY DllMain (HINSTANCE hInst / Library instance handle / ,
DWORD reason / Reason this function is being called / ,
LPVOID reserved / Not used / )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/ Returns TRUE on success, FALSE on failure /
return TRUE;
}
具体请参考jilei08124的CSDN博客
方法1:把此文件拖到“开始”的“所有程序”的“启动”菜单中。
方法2:[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"你的文件名exe"="你的文件地址(例子:C:\\WINDOWS\\system32\\ctfmonexe)"
将它复制到一个文本文档中,把文本文档的后缀名既“txt”改成“reg”,双击运行,就会在注册表中添加他的启动项。
首先去网上下载opencv,安装(其实就是解压)
解压安装完成后,找到路径,记录下来
然后打开vs2015,新建一个空白的c++控制台程序
新建完成后找到属性右键添加一个配置文件,注意编译环境
然后双击打开配置文件,在c/c++的附加包含目录指定路径到inlcude文件目录
点击链接器,在附加库目录指定目录到lib下面
最后链接器-》输入指定lib文件,该文件名可以在lib目录下查看
最后把sample里的cpp文件添加到工程运行即可
以上就是关于电脑中的DLL文件是怎么产生的全部的内容,包括:电脑中的DLL文件是怎么产生的、如何将c程序封装为DLL、VC中MFC源程序怎样生成DLL文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)