Windows Api学习笔记-动态连接库(DLL)的使用

简介: #include #include #include "12dll.h" using namespace std; #pragma comment(lib,"12Dll")//要链接到什么库文件 void main() { //CMy12Dll a; cout
#include <windows.h>
#include <iostream>
#include "12dll.h"
using namespace std;

#pragma comment(lib,"12Dll")//要链接到什么库文件

void main()
{
	//CMy12Dll a;
	cout<<fnMy12Dll()<<endl;
	char b;
	cin>>b;
}

VS2008

新建WIN32项目

选择动态连接库

应用程序类型为:WINDOWS 应用程序

附加选项为:导出符号

dllmain.cpp中有动态连接库的入口函数

BOOL APIENTRY DllMain(HANDLE hModule,//DLL模块句柄
					  DWORD ul_reason_for_all,//调试原因
					  LPVOID lpReserved//没有使用
					  )
{
	switch(ul_reason_for_all)
	{
	case DLL_PROCESS_ATTACH://动态链接库刚被映射到某个进程的地址空间
		g_hModule = (HMODULE)hModule;
		break;
	case DLL_PROCESS_DETACH://动态链接库将被卸载
		break;
	}
	return TRUE;
}

 

动态连接库的主要逻辑函数如下:

#include "stdafx.h"
#include "12Dll.h"

// 这是导出变量的一个示例
MY12DLL_API int nMy12Dll=12345;

// 这是导出函数的一个示例。
MY12DLL_API int fnMy12Dll(void)
{
	return 67890;
}

// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 12Dll.h
CMy12Dll::CMy12Dll()
{
	return;
}

动态链接库的逻辑函数是通过如下代码在头文件中公开给外部的

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MY12DLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// MY12DLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef MY12DLL_EXPORTS
#define MY12DLL_API __declspec(dllexport)
#else
#define MY12DLL_API __declspec(dllimport)
#endif

// 此类是从 12Dll.dll 导出的
class MY12DLL_API CMy12Dll {
public:
	CMy12Dll(void);
	// TODO: 在此添加您的方法。
};

extern MY12DLL_API int nMy12Dll;

MY12DLL_API int fnMy12Dll(void);

如何使用刚刚创建的DLL

有两种办法

一:

把DLL,LIB,和声明导出函数的头文件一起复制到工程文件的主目录下

然后引入头文件

然后就可以想使用自己的函数一样使用动态连接库中的函数了

代码如下 

#include <windows.h>
#include <iostream>
#include "12dll.h"
using namespace std;

#pragma comment(lib,"12Dll")//要链接到什么库文件

void main()
{
	//CMy12Dll a;
	cout<<fnMy12Dll()<<endl;
	char b;
	cin>>b;
}

二:

在DLL工程中加入一个def文件

名字可以随便起

内容如下:

LIBRARY	"12Dll"
EXPORTS
  fnMy12Dll

重新生成DLL工程

重新开被到目标工程

目标工程代买改为如下

#include <windows.h>
#include <iostream>
using namespace std;

typedef int (*my_dll_func)(void);//预定义函数的名字

void main()
{
	HMODULE hModule = ::LoadLibrary("F:\\test\\10test\\10test\\12Dll.dll");
	if(hModule != NULL)
	{
		my_dll_func mf = (my_dll_func)::GetProcAddress(hModule,"fnMy12Dll");
		if(mf != NULL)
		{
			cout<<mf()<<endl;
		}		
	}
	char b;
	cin>>b;
}

运行就看到答案了

目录
相关文章
|
5月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
593 4
|
7天前
|
监控 API 计算机视觉
CompreFace:Star6.1k,Github上火爆的轻量化且强大的人脸识别库,api,sdk都支持
CompreFace 是一个在 GitHub 上拥有 6.1k Star 的轻量级人脸识别库,支持 API 和 SDK。它由 Exadel 公司开发,基于深度学习技术,提供高效、灵活的人脸识别解决方案。CompreFace 支持多种模型(如 VGG-Face、OpenFace 和 Facenet),具备多硬件支持、丰富的功能服务(如人脸检测、年龄性别识别等)和便捷的部署方式。适用于安防监控、商业领域和医疗美容等多个场景。
|
2月前
|
人工智能 数据处理 C#
AI Dev Gallery:微软开源 Windows AI 模型本地运行工具包和示例库,助理开发者快速集成 AI 功能
微软推出的AI Dev Gallery,为Windows开发者提供开源AI工具包和示例库,支持本地运行AI模型,提升开发效率。
107 13
|
4月前
|
机器人 API
随机昵称网名[百万昵称库]免费API接口教程
该API接口用于随机生成网名,适用于机器人昵称、虚拟用户名等场景。支持POST和GET请求,需提供用户ID和KEY。返回状态码及信息提示,示例如下:{&quot;code&quot;:200,&quot;msg&quot;:&quot;豌豆公主&quot;}。详情见官方文档:https://www.apihz.cn/api/zicisjwm.html
|
4月前
|
API
表情包-API盒子官方资源库版免费API接口教程
该API用于访问API盒子官方资源库中的数十万表情包,支持快速搜索。通过POST或GET请求,用户可按随机或关键词搜索表情包,返回表情包的图片地址等信息。请求需提供用户ID、KEY及搜索类型等参数。示例与详情参见官方文档。
|
4月前
|
JSON API 数据格式
随机头像图片[API盒子官方资源库]免费API接口教程
API盒子提供的头像资源接口,包含大量网络公开收集的头像,适合非商业用途。支持POST/GET请求,需提供用户ID、KEY及返回格式类型。返回数据包括状态码和消息内容,支持JSON/TXT格式。更多详情见API盒子官网。
|
4月前
|
JSON API 数据格式
随机壁纸图片[API盒子官方资源库]免费API接口教程
API盒子提供的图片资源接口,含数十万张网络公开图片(非商用)。通过POST或GET请求,需提交用户ID、KEY、返回格式及图片类型等参数。返回数据包括状态码和图片地址或错误信息。 示例ID与KEY共享调用限制,建议使用个人ID与KEY。详情见API文档。
|
5月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
129 9
|
5月前
|
Windows
重装系统学习笔记(一):Windows10重装步骤(正版)
这篇博客文章详细介绍了如何使用微软官方工具重装Windows 10系统,包括下载安装工具、准备U盘、设置BIOS以及系统安装的步骤。
96 0
重装系统学习笔记(一):Windows10重装步骤(正版)
|
5月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。