[toc]

使用C语言在windows中动态调用自己写的动态链接库

1.使用C语言在VistualStudio2022中创建动态链接库项目

  1. 新建项目->windows桌面->动态链接库(DLL)->项目名称dll1

  2. 属性->c/c++->代码生成->运行库设置为多线程调试DLL(/MTd)

  3. 选择Solution Explorer->Property->c/c++->Procompiled Headers->选择Not Using Precompiled Headers

  4. 新建文件myfunc.h,与myfunc.c

myfunc.h

1
2
3
4
//myfunc.h
#pragma once
__declspec(dllexport) int add(int numberA, int numberB);

myfunc.c

1
2
3
4
5
6
7
8
//myfunc.c
#include "pch.h"
#include "myfunc.h"

int add(int numberA, int numberB)
{
return numberA + numberB;
}

dllmain.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// dllmain.c : Defines the entry point for the DLL application.
#include <windows.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;
}

4.编译生成

2.新建一个c语言项目调用刚刚生成的DLL文件里的函数

  1. 编写代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Message.c
#include <stdio.h>
#include <windows.h>

typedef int(*addition)(int numberA, int numberB);

int main()
{
HMODULE hDll = LoadLibraryA("DLL1.dll");
addition function = (addition)GetProcAddress(hDll, "add");
int result = function(1, 2);
printf("%d\r\n", result);
system("pause");
return 0;
}

将dll文件放入项目中

编译运行程序

C语言程序调用动态链接库中的全局变量

1.编写动态链接库代码

添加空项目

1右键项目->添加新建项->修改名称MyDll

2在属性->常规->配置类型中改为动态库.Dll

3.添加源文件DllMain.cpp

4.写入口函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>

int _declspec(dllexport) varlabel = 10;

BOOL APIENTRY DLLMain(HMODULE hModule,/*当前DLL模块句柄*/DWORD call_Reason,/*调用原因*/LPCVOID lpReserved)
{
switch (call_Reason)
{
case DLL_PROCESS_ATTACH:/*被进程加载的时候*/
/*这会我们DLL已经打入敌人内部*/
/*这里可以开始加载你的程序界面*/

break;
case DLL_THREAD_ATTACH:/*当进程有新的线程的时候*/
break;
case DLL_THREAD_DETACH:/*进程有一个线程关闭的时候*/
break;
case DLL_PROCESS_DETACH:/*进程被卸载的时候*/
break;
}
return TRUE;

}

5.编译成dll文件并复制到调用dll的程序文件夹里面

2.编写C语言程序调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <windows.h>

int main()
{
HMODULE DLL = LoadLibraryA("DLL1.dll");
if (!DLL)
{
printf("加载DLL失败\n");
}
//我们要使用DLL中的变量
int varlabel = *(int*)GetProcAddress(DLL, "varlabel");
printf("var is %d\n", varlabel);
Sleep(200000);
return 0;
}

动态加载User32.dll中的MessageBoxA函数

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Message.c
#include <windows.h>
#include <stdio.h>

int main() {
// 动态加载 User32.dll
HMODULE hUser32 = LoadLibraryA("User32.dll");
// 获取 MessageBoxA 函数的地址
typedef int (WINAPI* MessageBoxA_t)(HWND, LPCSTR, LPCSTR, UINT);
MessageBoxA_t pMessageBoxA = (MessageBoxA_t)GetProcAddress(hUser32, "MessageBoxA");
// 调用 MessageBoxA 函数
pMessageBoxA(NULL, "Hello, World!", "My Message Box", MB_OK);
// 释放 User32.dll
FreeLibrary(hUser32);
return 0;
}