WIN动态库制作与使用

摘要百度百科的解释:
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 “.drv”(旧式的系统驱动程序)。
动态链接库百度百科

对我们而言,知道 库文件 .dll 和 符号辅助文件.lib 就足够了。

直接切入主题:

如果你用的是 vs 那么可以直接创建c++空项目,然后修改一下项目属性,然后在制作无疑是最好的方式。

修改项目配置
在Windows我个人喜欢用 Unicode字符。
Unicode

接下来我们 添加一个 预处理定义
预处理定义
定义 DemoDll 宏
定义预处理宏

如果你定义了预处理宏的效果
效果
编写c++ 兼容
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
.h 头文件 基础代码框

#pragma once
#ifdef DemoDll
#define DemoDll_API __declspec(dllexport)			// 导出
#else
#define DemoDll_API __declspec(dllimport)			// 导入
#endif // DemoDll

/*
\ brief	
__cplusplus  c++宏
*/
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

	/*
	\ brief	 在这里编写 函数模块
	*/


#ifdef __cplusplus
}
#endif // __cplusplus

编写一个 add 函数
demo.h 文件代码

#pragma once
#ifdef DemoDll
#define DemoDll_API __declspec(dllexport)			// 导出
#else
#define DemoDll_API __declspec(dllimport)			// 导入
#endif // DemoDll

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

	/*
	\ brief	 在这里编写 函数模块
	*/

	int DemoDll_API add(int a, int b);

#ifdef __cplusplus
}
#endif // __cplusplus

demo.cpp 文件代码

#include "demo.h"

int DemoDll_API add(int a, int b)
{
	return  a + b;
}

接着编译,完成之后打开项目的Debug目录查看 .dll 文件 和 .lib 文件
dll lib文件

接下来我们新建一个空项目然后使用这个动态库

将demo.h 头文件 demo.dll 扩展名文件 demo.lib 链接库文件拷到项目下
copy
将 demo.h 文件 和 demo.lib 文件 添加到项目中
动态库使用
接下来我们查看下 头文件,就可以理解之前编写动态库 添加预处理的宏的好处。
导入

创建main.cpp 文件 进行测试

#include<iostream>
#include"demo.h"

using namespace std;

int main(int argc, char* argv[])
{
	cout << " 4 + 6 = " << add(4, 6) << endl;
}

运行结果
4 + 6

你也可以这样连接到 .lib 文件

#include<iostream>
#include"demo.h"

using namespace std;

#pragma comment(lib, "DemoDll.lib")

int main(int argc, char* argv[])
{
	cout << " 4 + 6 = " << add(4, 6) << endl;
}

对于一般人来说,这样的用法已经足够了。但是有一些人需要一些特别的用法。

接着我们继续改造 这个动态库

修改 demo.h 头文件 添加一个 动态库入口点函数,这个需要Windows 库支持

#pragma once
#include<Windows.h>     // 引用Windows库

#ifdef DemoDll
#define DemoDll_API __declspec(dllexport)			// 导出
#else
#define DemoDll_API __declspec(dllimport)			// 导入
#endif // DemoDll

/*
\ brief     动态链接库(DLL)的可选入口点
\ param     hinstDLL    DLL模块的句柄,该值是DLL的基地址
\ param     fdwReason   指示为什么调用DLL入口点函数的原因码
\ param     lpvReserved  如果fdwReason是DLL_PROCESS_ATTACH,lpvReserved是NULL动态载荷和非NULL的静态载荷
*/
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
/*
DLL入口点:
进程加载DLL             (DLL_PROCESS_ATTACH)
当前进程创建一个新线程   (DLL_THREAD_ATTACH)
线程正常退出            (DLL_THREAD_DETACH)
进程卸载DLL             (DLL_PROCESS_DETACH)
*/    
   switch (fdwReason)
    {
	   	 // 进程加载DLL
	    case DLL_PROCESS_ATTACH:
	        MessageBoxW(NULL, TEXT("Hello word"), TEXT("Title"), NULL);
	        break;
	     // 当前进程创建一个新线程
	    case DLL_THREAD_ATTACH:
	        break;
	     // 线程正常退出   
	    case DLL_THREAD_DETACH:      
	        break;
	     // 进程卸载DLL   
	    case DLL_PROCESS_DETACH:     
	        break;
    }
	return TRUE;
}

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

	/*
	\ brief	 在这里编写 函数模块
	*/

	int DemoDll_API add(int a, int b);

#ifdef __cplusplus
}
#endif // __cplusplus

那么这个 DllMain() 这个 函数有什么用呢?

依旧是编译,生成动态库。
然后按照老规矩,将 .lib 和 .dll 文件 拷贝到项目中
接下来是项目代码
main.cpp

#include<iostream>
#include<Windows.h>		// 引用Windows库
using namespace std;	
/*
\ brief		定义一个函数指针别名
*/
typedef int (*ADD)(int, int);

int main(int argc, char* argv[])
{	
	// 使用LoadLibraryW()函数将 DemoDll库导入到项目中
	HMODULE hModule  = LoadLibraryW(TEXT("DemoDll.dll"));
	if (hModule == NULL) {
		return 0;
	}
	// 使用 GetProcAddress()函数 导出 add()函数的地址,赋值给 add指针变量中
	ADD add = (ADD)GetProcAddress(hModule, "add");
	if (add == NULL) {
		return 0;
	}
	// 执行结果
	cout << " 4 + 6 = " << add(4, 6) << endl;
	// 释放动态库
	FreeLibrary(hModule);
}

那么运行一下,
helloword
add

那么我们可以得出结论,当使用LoadLibraryW()函数 动态加载动态库的时候,
会调用DllMain()函数。

这样做有什么用呢?

这就得提到 ,远线程的动态库的注入技术了,这个有缘再讲。


接下来使用,vs 直接创建动态库项目

创建项目
dll
名称
名称
项目创建完成
完成
至于framework.h 文件 与 pch.h pch.cpp 文件 自己看可以文件中的注释来理解如何使用、我就不多讲了。

文章时间2019年12月19日14:54:38

### 回答1: 您好!针对基于VS平台C#动态库的开发过程,一般的开发流程如下: 1. 创建动态库项目 打开Visual Studio(以下简称VS),选择新建项目,选择类库模板,选择C#,然后选择“类库”模板创建一个新的动态库项目。 2. 添加类 在解决方案资源管理器中,右键单击项目,选择“添加”,然后选择“类”,在弹出的对话框中输入类名并确认。 3. 编代码 在新添加的类中编代码,实现所需的功能。 4. 编译项目 单击VS工具栏上的“生成”按钮,或者按下快捷键Ctrl+Shift+B,编译整个项目。 5. 导出动态库 编译成功后,在项目输出目录中可以找到生成的动态库文件,一般为.dll文件。将该文件复制到需要使用动态库的项目中。 6. 引用动态库 在需要使用动态库的项目中,右键单击“引用”文件夹,选择“添加引用”,在弹出的对话框中选择“浏览”选项卡,选择刚刚复制的.dll文件,单击“确定”按钮,即可引用该动态库。 7. 使用动态库 在需要使用动态库的代码中,使用using语句引用该动态库的命名空间,然后即可使用其中的类和方法。 以上就是基于VS平台C#动态库的开发流程。希望能对您有所帮助! ### 回答2: 基于VS平台的C动态库制作程序可以分为以下几个步骤: 1. 打开Microsoft Visual Studio,选择一个新的C项目。在项目类型中选择"动态链接库(.dll)",并输入项目名称。点击“确定”创建新项目。 2. 在生成的项目中,你可以看到一个名为"main.c"的源文件。这是动态库的入口点。你可以在这个文件中定义你的动态库的外部接口。 3. 在main.c中,你可以编库函数的实现代码。例如,你可以定义一些函数,用于处理特定的任务。你可以在头文件(.h文件)中声明这些函数,然后在源文件(.c文件)中实现它们。确保将这些函数标记为“__declspec(dllexport)”,以便其他程序可以访问这些函数。例如: ```c #include "mylibrary.h" __declspec(dllexport) int add(int a, int b) { return a + b; } ``` 4. 如果需要,可以在源文件中定义其他辅助函数,并在头文件中声明它们。确保将这些函数标记为“__declspec(dllexport)”。 5. 在项目中添加需要的其他源文件,以便实现库函数所需的功能。 6. 在生成项目之前,还需要设置生成选项。点击顶部菜单中的"生成",选择"配置管理器"。然后,在"平台"下拉菜单中选择"解决方案平台",并选择"新建"。在弹出的对话框中,选择"X64"或"Win32"作为目标平台。 7. 构建项目。点击顶部菜单中的"生成",然后选择"生成解决方案"。在输出窗口中,你将看到生成的动态库的路径。 至此,你已经完成了基于VS平台的C动态库制作程序。你可以将生成的动态库文件(.dll)用于其他程序中,通过导入库函数实现特定功能。 ### 回答3: 制作基于VS平台的C动态库程序主要分为以下几个步骤: 1. 打开Visual Studio,创建一个新的空项目。选择C语言作为开发语言。 2. 在项目中添加一个新的源文件,用于编你的动态库代码。 3. 在源文件中编你的动态库代码。这些代码可以包括各种函数、类、结构体等。 4. 在项目属性中进行配置。打开项目属性窗口,选择配置属性->常规,将配置类型改为“动态库(.dll)”。这将指示编译器将项目编译为动态链接库。 5. 编译并生成动态库。按下Ctrl + Shift + B或选择“生成”菜单中的“生成解决方案”选项,编译并生成你的动态库。 6. 在动态库生成的目录中,可以找到生成的动态库文件。默认情况下,它的扩展名是.dll。你可以将这个文件复制到其他项目中使用。 7. 在另一个项目中使用动态库。创建一个新的项目,选择使用动态库的编程语言(C、C++等)。然后,在项目属性中进行配置,将动态库文件的路径添加到“附加包含目录”和“附加库目录”中。 8. 在新项目中编代码,调用你之前编动态库。你可以使用#include指令包含库的头文件,并使用库中定义的函数、类等。 9. 编译并运行新项目。如果所有设置和调用都正确无误,你的程序将能够使用动态库中提供的功能。 以上就是基于VS平台C动态库制作程序的简要步骤。这样的程序可以充分利用动态库的灵活性和可重用性,方便地将功能模块分享给其他项目使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值