dll文件生成与使用

使用环境VS2019

1、生成dll

创建工程时选择dll,工程命名testDll1会生成如下代码,作为dll文件被调用的入口

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE 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:
        break;
    }
    return TRUE;
}

添加如下内容导出函数,使函数可以被其他程序调用,__declspec(dllexport)相关信息直接搜索即可

extern "C" __declspec(dllexport) void test_fun();
/*test_fun();函数被导出,可被其他程序调用*/

void test_fun()
{
    MessageBoxA(NULL,"DLL文件测试函数","提示",0);
}

然后生成,会产生如下文件(testDll1是工程名)

testDll1.dll
testDll1.exp
testDll1.lib
testDll1.ilk

2、动态链接库的静态调用(dll和lib文件)。

静态调用是在编译时连接的,动态调用是在运行时使用的。

新建应用工程,将之前生成的testDll1.dll、testDll1.lib复制到新工程的源码目录编译时使用lib文件,运行时使用dll文件。编辑源码如下

#include<Windows.h>

#pragma comment(lib,"testDll1");  //引用库文件
extern "C" void test_fun();       //声明函数

int main()
{
	test_fun();
	return 0;
}

运行结果:

3、动态链接库的动态调用dll

使用loadlibarty导入dll,再使用GetProcAddress获取指向dll中的函数的地址,即可进行调用。示例如下

LoadLibrary用法:loadlibarty将指定的模块加载到调用进程的地址空间中。指定的模块可能会导致其他模块被加载。形参就是dll的文件名。

如果函数成功,则返回值是模块的句柄。

如果函数失败,则返回值为NULL。

GetProcAddress用法:

FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName );

hModule:包含函数或变量的DLL模块的句柄。

lpProcName :函数名;

如果函数成功,则返回值是导出的函数或变量的地址。

如果函数失败,则返回值为NULL。

#include<Windows.h>
#include <stdio.h>


typedef void (*func_p)(void);

int main()
{
    HMODULE handle_dll = NULL;
    handle_dll = LoadLibrary(L"testDll1.dll");  //加载动态库(加L是因为编码问题)

    if (handle_dll == NULL)
        printf("load dll fail\n");
    else
    {
        printf("load dll OK!\n");

        func_p f;
        f = (func_p)GetProcAddress(handle_dll, "test_fun");

            f();
    }

    return 0;
}

运行结果符合预期。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值