__declspec(dllexport) 和 __declspec(dllimport)
阅读数:120 评论数:0
跳转到新版页面分类
C/C++
正文
一、概述
在 Windows 上创建和使用 DLL 时,__declspec(dllexport)
和 __declspec(dllimport)
是两个非常重要的关键字,它们用于控制函数和变量的导出和导入。
__declspec(dllexport)
:用于在 DLL 中导出函数或变量,使得这些函数或变量可以被其他模块(如应用程序或其他 DLL)使用。__declspec(dllimport)
:用于从 DLL 中导入函数或变量,使得这些函数或变量可以在当前模块中使用。
二、如何使用
1、头文件
在头文件中,我们使用条件编译来控制导出和导入。这通常通过定义一个宏来实现,例如 DLL_EXPORT
。当编译 DLL 时,我们定义 BUILDING_DLL
,使得函数和变量被导出;而在使用 DLL 时,不定义 BUILDING_DLL
,使得函数和变量被导入。
#pragma once
#ifdef _WIN32
#ifdef BUILDING_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#else
#define DLL_EXPORT
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct tagMotorParameter {
const wchar_t* positionOnSite;
const wchar_t* TYPE;
double RatedPower;
double RatedFrequency;
double RatedVoltage;
double RatedCurrent;
double RatedPowerFactor;
double RatedSpeed;
int MotorConnectionType;
int CurrentMeasurementWay;
} MotorParameter;
DLL_EXPORT int DLL_recommendSWITSC(
unsigned long uiDataLength,
const double* uAB,
const double* uBC,
const double* uCA,
const double* iA,
const double* iB,
const double* iC,
const MotorParameter* mParameter,
int* startInstant
);
#ifdef __cplusplus
}
#endif
2、实现文件
在实现文件中,我们定义 BUILDING_DLL
,以便函数和变量被导出。
#define BUILDING_DLL
#include "motorDLL.h"
int DLL_recommendSWITSC(
unsigned long uiDataLength,
const double* uAB,
const double* uBC,
const double* uCA,
const double* iA,
const double* iB,
const double* iC,
const MotorParameter* mParameter,
int* startInstant
) {
// 函数实现
return 0; // 示例返回值
}
3、在使用DLL的代中,我们只需包含头文件,并确保链接到DLL
#include "motorDLL.h"
#include <QDebug>
int main() {
MotorParameter mParameter;
mParameter.positionOnSite = L"测试";
mParameter.TYPE = L"test01";
mParameter.RatedPower = 1;
mParameter.RatedFrequency = 50;
mParameter.RatedVoltage = 1;
mParameter.RatedCurrent = 1;
mParameter.RatedPowerFactor = 0.83;
mParameter.MotorConnectionType = 0;
mParameter.CurrentMeasurementWay = 0;
mParameter.RatedSpeed = 800;
double* array = new double[3];
int *a = new int;
int result = DLL_recommendSWITSC(
3,
array,
array,
array,
array,
array,
array,
&mParameter, // 传递指针
a
);
qDebug() << "done, result:" << result;
delete[] array;
delete a;
return 0;
}