生成DLL和调用DLL是C++编程中非常常见的操作,下面是详细的步骤和示例说明:
生成DLL
- 写好需要导出的函数。在其定义前加上
__declspec(dllexport)
,用于导出函数。
cpp
__declspec(dllexport) int Add(int a, int b)
{
return a + b;
}
-
设置项目属性。
-
配置属性 -> 常规 -> 配置类型:选择 DLL。
- 配置属性 -> C/C++ -> 常规 -> 预处理器定义:添加
_USRDLL
。 - 配置属性 -> 链接器 -> 输入 -> 加载项地址:选择
/BASE:0x10000000
。
注意:导出函数需要与调用方进行一致的声明约定。在 C++ 中,可以采用 __cdecl
声明约定。
- 编译生成 DLL 文件。
调用DLL
- 在调用方项目中添加头文件,并定义函数指针。头文件名称通常为该 DLL 的名称。
```cpp
#include "MyDll.h"
typedef int(__cdecl* PFUNC_ADD)(int, int);
```
- 加载 DLL 文件。
```cpp
#include
HMODULE hLib = LoadLibrary("MyDll.dll");
if (hLib == NULL)
{
// 加载失败
return FALSE;
}
```
- 获取需要调用的函数地址。
cpp
PFUNC_ADD func_add = (PFUNC_ADD)GetProcAddress(hLib, "Add");
if (func_add == NULL)
{
// 函数不存在
return FALSE;
}
- 调用函数。
cpp
int result = func_add(1, 2);
示例说明1
以下示例为一个简单的加法计算器,其中 Add
函数在 DLL 中定义:
// MyDll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
extern "C" MYDLL_API int Add(int a, int b);
// Add.cpp
#include "stdafx.h"
#include "MyDll.h"
MYDLL_API int Add(int a, int b)
{
return a + b;
}
// ConsoleApp.cpp
#include <Windows.h>
#include <stdio.h>
#include "MyDll.h"
typedef int(__cdecl* PFUNC_ADD)(int, int);
int main()
{
HMODULE hLib = LoadLibrary("MyDll.dll");
if (hLib == NULL)
{
printf("Cannot load DLL.\n");
return 1;
}
PFUNC_ADD func_add = (PFUNC_ADD)GetProcAddress(hLib, "Add");
if (func_add == NULL)
{
printf("Cannot find function.\n");
return 1;
}
int result = func_add(1, 2);
printf("Result: %d\n", result);
FreeLibrary(hLib);
return 0;
}
示例说明2
以下示例为一个简单的日历应用程序,其中 GetDaysInMonth
函数在 DLL 中定义:
// MyDll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
extern "C" MYDLL_API int GetDaysInMonth(int year, int month);
// GetDaysInMonth.cpp
#include "stdafx.h"
#include "MyDll.h"
MYDLL_API int GetDaysInMonth(int year, int month)
{
int days_in_month = 0;
switch (month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days_in_month = 31;
break;
case 4: case 6: case 9: case 11:
days_in_month = 30;
break;
case 2:
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
days_in_month = 29;
else
days_in_month = 28;
break;
}
return days_in_month;
}
// CalendarApp.cpp
#include <Windows.h>
#include <stdio.h>
#include "MyDll.h"
typedef int(__cdecl* PFUNC_GET_DAYS_IN_MONTH)(int, int);
int main()
{
HMODULE hLib = LoadLibrary("MyDll.dll");
if (hLib == NULL)
{
printf("Cannot load DLL.\n");
return 1;
}
PFUNC_GET_DAYS_IN_MONTH func_get_days_in_month = (PFUNC_GET_DAYS_IN_MONTH)GetProcAddress(hLib, "GetDaysInMonth");
if (func_get_days_in_month == NULL)
{
printf("Cannot find function.\n");
return 1;
}
int year, month;
printf("Input year: ");
scanf_s("%d", &year);
printf("Input month: ");
scanf_s("%d", &month);
int days_in_month = func_get_days_in_month(year, month);
printf("Days in month: %d\n", days_in_month);
FreeLibrary(hLib);
return 0;
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++生成dll和调用dll的方法实例 - Python技术站