为什么这些类型不兼容?

时间:2020-06-24 17:51:19

标签: c++ dll wrapper labview

我是C ++的新手。我试图获取一个C ++ DLL以便正确导入LabVIEW,因此,为了做到这一点,我试图围绕该DLL创建自己的包装器。这是relevant article关于我为什么需要的原因。

此过程的一部分包括定义自己的类型,以便将LabVIEW数据转换为与C ++兼容的格式。让我举个例子。请注意,我没有原始DLL的源代码,只有头文件。

我要调用的函数之一具有以下原型:

BirdBDS2API int DLL_CALLING bds2dll_setStdConfig(BDS2DLL_HANDLE p_bds2dll_handle, BDS2_StdConfig* p_stdCfg, BDS2_Fundamental* p_funds, BDS2_MultiState* p_states);

我要重新定义的参数在头文件中定义如下:

typedef struct _DLLStdConfig_t
{
    unsigned int numFunds;          // The number of fundamentals.
    unsigned int pulseTriggerDelay; // Pulse mode trigger delay in microSeconds.
    unsigned int displayUpdateRate; // Data production rate.
    unsigned int numStates;         // The number of states.
    unsigned int pulsePeriod;       // Pulse period in usecs. 
    unsigned int numMeasReq;        //  number of measurements required. 
} BDS2_StdConfig;

typedef struct _DLLFundamental_t
{
    unsigned int  freqHz;                       // Fundamental frequency (in Hz).
    unsigned int  harmSel[BDS2_MAX_HARMONICS];  // Harmonic selection.
    unsigned int  intermodFund2;                // F2 fundamental for intermod.
    unsigned int  intermodSel;                  // as defined BDS2_eIntermodSel
    unsigned int  detFilter;                    // as defined in BDS2_eDetFilter.
    float         vNoiseLevel;                  // Voltage Noise floor level. volts.
    float         iNoiseLevel;                  // Current Noise floor level. amps.
    unsigned int  viTracking;                   // as defined in BDS2_eVITracking.
    unsigned int  measMode;                     // as defined in BDS2_eMeasMode.
    unsigned int  trackingMode;                 // as defined in BDS2_eTrackingMode.
    unsigned int  stateFreqHz[BDS2_MAX_STATES]; // state measurement freq..

} BDS2_Fundamental;

typedef struct _DLLMultiStateConfig_t
{
    unsigned int trkStateDelay;             // Std tracking state delay.
    unsigned int trkStateDuration;          // Std tracking state duration.
    unsigned int trkStateNumberOfFrames;    // Std tracking state number of frames.
} BDS2_MultiState;

LabVIEW在导入DLL时错误地解释了这些内容,因此我尝试使用LabVIEW工具重新定义它们:

typedef struct {
    unsigned int numFunds;
    unsigned int pulseTriggerDelay;
    unsigned int displayUpdateRate;
    unsigned int numStates;
    unsigned int pulsePeriod;
    unsigned int numMeasReq;
} TD1;

typedef struct {
    int dimSize;
    unsigned int harmSel[4];
} TD3;
typedef TD3** TD3Hdl;

typedef struct {
    int dimSize;
    unsigned int stateFreqHz[4];
} TD4;
typedef TD4** TD4Hdl;

typedef struct {
    unsigned int freqHz;
    TD3Hdl harmSel;
    unsigned int intermodFund2;
    unsigned int intermodSel;
    unsigned int detFilter;
    float vNoiseLevel;
    float iNoiseLevel;
    unsigned int viTracking;
    unsigned int measMode;
    unsigned int trackingMode;
    TD4Hdl stateFreqHz;
} TD2;

typedef struct {
    unsigned int trkStateDelay;
    unsigned int trkStateDuration;
    unsigned int trkStateNumberOfFrames;
} TD5;

然后我有自己的函数定义:

int DLL_CALLING bds2wrap_setStdConfig(BDS2DLL_HANDLE p_bds2dll_handle, TD1* p_stdCfg, TD2* p_funds, TD5* p_states)
{
    int out = bds2dll_setStdConfig(p_bds2dll_handle, p_stdCfg, p_funds, p_states);
    return out;
}

但是,我收到错误"Argument of type TD1 *" is incompatible with parameter of type "BDS2_StdConfig *"。对于尝试重新定义的每个参数,我都会收到类似的错误。就像我说的那样,我是C ++的新手,所以我不确定这是否是错误,是否丢失了一些对更有经验的人显而易见的东西,或者我尝试使用的LabVIEW工具特有的东西。 。据我所知,我正在重新定义的类型等同于它们的原始类型。我使用的数组大小与原始头文件中的变量声明匹配。

0 个答案:

没有答案
相关问题