__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;
}



相关推荐