LoadLibrary windows动态库加载

windows下的gcc下载参考【1】

写下如下代码sum.c

#include "stdio.h"
__declspec(dllexport) int sum(int a, int b)
{
  return a + b;
}
使用gcc编译

gcc -shared -o sum.dll sum.c
会生成dll文件

注意1:

上面代码可以直接写成

int sum(int a, int b)
{
  return a + b;
}
经测试 无影响

注意2:

如果是sum.cc,则需要加extern C

写下main.c

#include "windows.h"
#include "stdio.h"
int main() {
  auto handle = LoadLibrary("sum.dll");
  int (*sum)(int a, int b);
  sum = (int (*)(int, int))GetProcAddress(handle, "sum");
  int res = sum(7, 8);
  printf("%d\n", res);
  FreeLibrary(handle);
}
g++ main.c 

执行a即可得到15

【1】 windows 下 gcc/g++ 的安装

2 loadLibrary参数

LoadLibrary函数的参数为宽字符,有两种方式设置宽字符

1. 通过C自带的函数等

    1.1 TEXT(“c:/test.dll”)

    1.2 _T(“c:/test.dll”)   #include <tchar.h>其实_T是一个宏。

    这两种方式都是在字符串上添加L,字符串不可使用变量替换

2. 通过窄字符串转换的方式

    参考代码:

char *str = "c:/test.dll";
WCHAR wszClassName[256];
memset(wszClassName, 0, sizeof(wszClassName));
MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, wszClassName,sizeof(wszClassName) / sizeof(wszClassName[0]));
str 当前为窄字符串,通过上面的转换成为宽字符串,类型WCHAR,便可以直接作为LoadLibrary的参数了,比较灵活。

我当初是为了加载一个文件夹下的所有dll文件,所以我用的第2种这种方式

3. 查看dll基本信息

文章目录

引言

软件中存在着大量以 .dll 为扩展名的文件,这些文件就是动态链接库(Dynamic Link Library),简称为 DLL 。

DLL 可以使用不同的编程语言来编写,如 VB、C、C++、C# 等。

DLL 也可以被不同的编程语言调用,例如:可以使用 VB 调用 C 语言生成的 DLL 文件。确切的说是调用 DLL中的API函数。只要使用正确的调用格式,就可以直接调用不同语言写成的 DLL 中的函数。


本文将介绍 2 种查看 DLL 中函数的工具:dumpbin.exe 和 Dependencies

方法一:Visual Studio 自带工具(dumpbin.exe)

如果电脑上安装了 Visual Studio, 可以使用 Visual Studio 自带的 dumpbin.exe 查看 DLL 中的函数。
打开开始菜单,找到 VS 自带的命令行工具(随便选择图片中的一个就可以)
在这里插入图片描述
打开 VS 的 cmd 窗口,键入 dumpbin /exports XXX.dll,分析 XXX.dll 中有哪些函数。

下面以 C:\Windows\System32C:\Windows\System32\kernel32.dll 为例。

输入下面命令即可导出 kernel32.dll中包含的函数信息。

 dumpbin /exports C:\Windows\System32\kernel32.dll
  • 1

在这里插入图片描述

方法二:逆向分析工具 Dependencies

Dependency Walker 是分析 DLL 的神器,但目前为止 Dependency Walker 还不支持 Win10。在 Win10 下使用 Dependency Walker 分析任何 DLL 都会进入未响应的状态。那么,Dependencies 就是一个可以替代 Dependency Walker 的不错选择。

Dependencies 是一个 GitHub 开源代码库GitHub - lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues. 。
点击 Release 下的版本链接即可下载,这里给出 64 位的最新版本下载链接 v1.11 。

在这里插入图片描述

下载完成后,解压文件夹,双击以下.exe即可打开。

在这里插入图片描述
使用 File->Open 打开要分析的 DLL 文件,这里以 C:\Windows\System32\kernel32.dll 为例,进行分析。
双击相应的 dll ,就可以看到包括的 Function 。

在这里插入图片描述

重要补充:快速分析项目依赖于哪些.dll

  1. 引言:
    在看别人代码的时候,有时工程中会有很多不用的.dll,为保持项目整洁,需要删除。

  2. 前提:
    所有的dIl都已经找到,但是不清楚哪些是多余的dll

  3. 方法:
    (1)打开.exe运行程序,程序会自动加载所有用到的dIl。
    (2)然后删除所有dll,被exe占用的删不掉跳过即可,剩下的dlll就是exe需要的dll了。

  4. 缺陷:
    此种方法只能删除当前运行时用到的dll(实际情况是:程序不同运行阶段可能调用不同的dll),但那些当前还没用到的dll无法通过此法删除。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值