尝试从 DLL 调用函数时出现“链接规范与先前的”错误 E0337 和“未声明的标识符”错误 C2065

问题描述 投票:0回答:1

我的目标是创建一个 DLL,允许我通过 ADS 从 Beckhoff PLC 程序读取数据。为此,我创建了一个 DLL 和一个测试程序。在 DLL 中,我使用 Beckhoff 的 TcAdsDll 和一个专门创建的类,其中包含所有必需的函数和数据类型。 DLL 编译时没有错误消息。当通过调用 DLL 的函数来编译我的测试程序时,我收到错误:

>E0337  linkage specification is incompatible with previous "AdsAmsPortEnabled" (declared at line 143)  famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h   
Error (active)  E0067   expected a '}'  famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h       
Error   C2065   'NULL': undeclared identifier   famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h   
Error   C2065   'BOOL': undeclared identifier   famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h   
Error   C2065   'pbEnabled': undeclared identifier  famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h   
Error   C2061   syntax error: identifier 'BOOL' famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h   

单击所有错误将转到 Beckhoff 的 ADS-Dll 的只读头文件。我已经能够使用搜索功能找出包含头文件时可能发生的错误。然而我找不到它

下面是我写的代码

Dll 头文件

#pragma once
#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h"
#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h"


#ifdef FAMOSADSLIBRARY_EXPORTS
#define FAMOSADSLIBRARY_API __declspec(dllexport)
#else
#define FAMOSADSLIBRARY_API __declspec(dllimport)
#endif 

class FAMOSADSLIBRARY_API adsCommunication {
private:
long      nErr, nPort = 0;
AmsAddr   Addr;
PAmsAddr  pAddr = &Addr;
int       adress;
int       datatyp;

public:

adsCommunication(int datatyp = 0x4, int adress = 0x0) {
    this->datatyp = datatyp;
    this->adress = adress;

}

void connectADS();
void disconnectADS();
float readADS();
void writeADS(int data);
};

DLL 主

#include "pch.h"
#include "famosAdsLibrary.h"
#include <iostream>
#include "framework.h"
#include <conio.h>
#include <windows.h>

using namespace std;


BOOL APIENTRY DllMain( HMODULE hModule,
                   DWORD  ul_reason_for_call,
                   LPVOID lpReserved
                 )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    break;
}
return TRUE;
}

void adsCommunication::connectADS() {

// Open communication port on the ADS router
nPort = AdsPortOpen();
nErr = AdsGetLocalAddress(pAddr);
if (nErr) cerr << "Error: AdsGetLocalAddress: " << nErr << '\n';
pAddr->port = 851;

}

float adsCommunication::readADS() {
INT data = 0;
nErr = AdsSyncReadReq(pAddr, 0x4020, adress, datatyp, &data);
if (nErr) cerr << "Error: AdsSyncReadReq: " << nErr << '\n';
cout << data << endl;
return data;
}

void adsCommunication::writeADS(int data) {

nErr = AdsSyncWriteReq(pAddr, 0x4020, adress, datatyp, &data);
if (nErr) cerr << "Error: AdsSyncWriteReq: " << nErr << '\n';
}


void adsCommunication::disconnectADS() {
nErr = AdsPortClose();
if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n';
}

测试程序头文件

#pragma once

#include <famosAdsLibrary.h>
#include <Windows.h>

测试程序主

#include "Main.h"


int main() {

int       value = 0;

adsCommunication data(0x4, 0x0);

data.connectADS();

while (1)
{
    value = data.readADS();

    if (value >= 800) {

        value = 0;

        data.writeADS(wert);
    }
}

data.disconnectADS();


system("PAUSE");

return 0;
}

以下是倍福头文件只读代码中的错误

#ifndef __ADSAPI_H__
#define __ADSAPI_H__

#define ADSAPIERR_NOERROR           0x0000
#ifdef __cplusplus
extern "C"
{
#endif

//other dllexports without error


__declspec( dllexport )
long __stdcall AdsAmsPortEnabled(BOOL *pbEnabled);

// more dllexports without error
__declspec( dllexport )
long __stdcall AdsAmsPortEnabledEx(long nPort, BOOL *pbEnabled);

感谢您的帮助

c++ dll ads
1个回答
0
投票

在 Testprogram.h 中交换 #include 和 #include 解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.