我是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工具特有的东西。 。据我所知,我正在重新定义的类型等同于它们的原始类型。我使用的数组大小与原始头文件中的变量声明匹配。