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

#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;
}

运行就看到答案了

posted @   liulun  阅读(812)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示