静态对象及其创建方法

巴特

我的程序出现问题,我正在使用Embarcadero XE8 C ++构建器进行32位工作。

当我想使用一种方法将内容读/写到PLC(可编程逻辑控制器,通常用于与机器通信)时,我得到的对象是NULL

我只是有一个Main表单,我想在其中创建与PLC的连接。

在我的主要我有:

static CEasyPLCHandler *pPLCHandler;

在同一页面上的方法中,我有:

long ReadWriteTest(void)
{
unsigned long ulStart;
PlcSymbolDesc *pSymbols;
unsigned long ulNumOfSymbols = 0;
int iNumOfVars = 2;
int i;
char **ppszVars = new char*[iNumOfVars];

for (i=0; i< iNumOfVars; i++)
    ppszVars[i] = new char[255];

long lResult = RESULT_FAILED;
lResult = pPLCHandler->GetAllItems(&pSymbols, &ulNumOfSymbols);
if (lResult == RESULT_OK)

当我调试时,它显示pPLCHandler = NULL

当我检查出哪里CEasyPLCHandle来的时候,我来到一个页面(我从库中包含了该页面),并看到以下几行:

class PLCH_DLL_DECL CEasyPLCHandler : public CPLCHandler
{
public:
    CEasyPLCHandler(RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
    CEasyPLCHandler(PlcConfig *pPlcConfig, PlcDeviceDesc *pDeviceDesc, RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
    CEasyPLCHandler(unsigned long ulId, char *pszIniFile, RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
    CEasyPLCHandler(char *pszPlcName, char *pszIniFile, RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
    virtual ~CEasyPLCHandler(void);

    // See PLCConfig.h for defines of pszProtocol
    // e.g. #define PLCC_DN_TCPIP_L2ROUTE   "Tcp/Ip (Level 2 Route)"
    virtual long ConnectTcpipViaGateway(char *pszGatewayIP, char *pszPlcIP, char *pszProtocol = PLCC_DN_TCPIP_L2ROUTE, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT, unsigned long ulPort = 1200); 
    virtual long ConnectRs232ViaGateway(char *pszGatewayIP, short sPort, unsigned long ulBaudrate, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
    virtual long ConnectRs232ViaGatewayEx(char *pszGatewayIP, short sPort, unsigned long ulBaudrate, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT, EXT_RS232_PARAMStyp *pExtParams = NULL);
    virtual long ConnectTcpipViaArti(char *pszPlcIP, char *pszProtocol = PLCC_DN_TCPIP_L2ROUTE, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT, unsigned long ulPort = 1200);
    virtual long ConnectRs232ViaArti(short sPort, unsigned long ulBaudrate, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
    virtual long ConnectToSimulation(char *pszSdbFile, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
    virtual long ConnectViaGateway3(char *pszGatewayIP, char *pszAddress, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
    virtual long ConnectViaGateway3Ex(char *pszGatewayIP, unsigned long ulPort, char *pszAddress, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
    virtual long ConnectViaArti3(char *pszAddress, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
    virtual long ConnectToSimulation3(char *pszSdb3XmlFile, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);


    // Attention: The structure of the service must be known in detail! 
    //            An erroneous service might cause a crash of the PLC! 
    // Send own service to plc and receive reply
    virtual long SyncSendService(/*[In]*/ unsigned char *pbySend, /*[In]*/ unsigned long ulSendSize, /*[Out]*/ unsigned char **ppbyRecv, /*[Out]*/ unsigned long *pulRecvSize);
    // Send own service to plc
    virtual long AsyncSendService(/*[Out]*/ int *piInvokeId, /*[In]*/ unsigned char *pbySend, /*[In]*/ unsigned long ulSendSize, /*[In]*/ CPLCHandlerCallback *pAsyncServiceCallback = NULL);
    // Get service reply
    virtual long AsyncGetServiceReply(/*[In]*/ int *piInvokeId, /*[Out]*/ unsigned char **ppbyRecv, /*[Out]*/ unsigned long *pulRecvSize, long *plServiceResult);
    // Get SessionId for Device services (only used for GW3 and ARTI3) 
    virtual unsigned long GetDeviceSessionId(void);
};

那么如何创建该对象?

我添加了一行:

pPLCHandler = new CEasyPLCHandler(RTS_INVALID_HANDLE);

并得到一些未解决的外部错误:

[ilink32错误]错误:从C:\ USERS \ BART \ DOCUMENTS \ EMBARCADERO \ STUDIO \ PROJECTS \ REALTEST \ WIN32 \ DEBUG \ UNIT1.OBJ引用的未解决的外部'CEasyPLCHandler ::〜CEasyPLCHandler()'

但是这些已经在另一个文件中了吗?他为什么不能使用这些?

避难所

作为...我不能拼写名字的希腊人,已经正确地说了,您不是在初始化指针。静态或全局简单变量(int,double,char及其指针)将始终被初始化为0,这NULL就是从那里来的。

为了正确地初始化静态对象,您要么需要使用指针,new要么使用诸如之类的东西static CEasyPLCHandler PLCHandler(RTS_INVALID_HANDLE);,它将构造该对象并为您保存新对象和后续对象delete(避免内存泄漏)。

但是,从外观上看,您缺少包含您的代码的实际共享库CEasyPLCHandler object(至少链接器告诉我的是这样)。

请记住,如果您决定使用自动静态对象,则需要使用.而不是进行访问->

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaScript对象创建及其原型

来自分类Dev

加载类时静态方法是否创建对象

来自分类Dev

关于python对象及其方法

来自分类Dev

如何从静态块创建对象?

来自分类Dev

静态/全局对象的创建顺序

来自分类Dev

如何从静态块创建对象?

来自分类Dev

访问Java类方法的最佳方法是创建对象或使方法成为静态类型?

来自分类Dev

从方法对象获取方法调用及其参数

来自分类Dev

为什么可以通过创建对象在main方法中调用非静态方法?爪哇

来自分类Dev

为什么可以通过创建对象在main方法中调用非静态方法?爪哇

来自分类Dev

Typescript中的抽象类及其静态方法类型

来自分类Dev

调用Python静态方法对象

来自分类Dev

静态方法对象描述的含义?

来自分类Dev

静态工厂方法每次调用时都会创建一个新对象

来自分类Dev

通过静态方法(或工厂(?))创建的Boost python对象中的虚拟覆盖

来自分类Dev

为什么单例对象创建的scala程序不需要静态的main方法?

来自分类Dev

难道是明智的,有一个静态方法负责创建它驻留在类的对象?

来自分类Dev

为什么单例对象创建的scala程序不需要静态的main方法?

来自分类Dev

在 Windows 服务中使用静态方法调用 webform 中的数据而不创建新对象

来自分类Dev

从基类的静态创建方法中调用非静态方法

来自分类Dev

Java使用实例方法而不是类/静态方法为每个实例化对象创建唯一的ID

来自分类Dev

Python方法对象创建

来自分类Dev

在方法上创建对象

来自分类Dev

对象创建方法困惑

来自分类Dev

调用静态方法时会创建静态类变量-Java

来自分类Dev

在空对象上调用静态方法

来自分类Dev

Java中的同步(对象和静态方法)

来自分类Dev

php array_map与对象的静态方法

来自分类Dev

在对象上调用自身的静态方法

Related 相关文章

  1. 1

    JavaScript对象创建及其原型

  2. 2

    加载类时静态方法是否创建对象

  3. 3

    关于python对象及其方法

  4. 4

    如何从静态块创建对象?

  5. 5

    静态/全局对象的创建顺序

  6. 6

    如何从静态块创建对象?

  7. 7

    访问Java类方法的最佳方法是创建对象或使方法成为静态类型?

  8. 8

    从方法对象获取方法调用及其参数

  9. 9

    为什么可以通过创建对象在main方法中调用非静态方法?爪哇

  10. 10

    为什么可以通过创建对象在main方法中调用非静态方法?爪哇

  11. 11

    Typescript中的抽象类及其静态方法类型

  12. 12

    调用Python静态方法对象

  13. 13

    静态方法对象描述的含义?

  14. 14

    静态工厂方法每次调用时都会创建一个新对象

  15. 15

    通过静态方法(或工厂(?))创建的Boost python对象中的虚拟覆盖

  16. 16

    为什么单例对象创建的scala程序不需要静态的main方法?

  17. 17

    难道是明智的,有一个静态方法负责创建它驻留在类的对象?

  18. 18

    为什么单例对象创建的scala程序不需要静态的main方法?

  19. 19

    在 Windows 服务中使用静态方法调用 webform 中的数据而不创建新对象

  20. 20

    从基类的静态创建方法中调用非静态方法

  21. 21

    Java使用实例方法而不是类/静态方法为每个实例化对象创建唯一的ID

  22. 22

    Python方法对象创建

  23. 23

    在方法上创建对象

  24. 24

    对象创建方法困惑

  25. 25

    调用静态方法时会创建静态类变量-Java

  26. 26

    在空对象上调用静态方法

  27. 27

    Java中的同步(对象和静态方法)

  28. 28

    php array_map与对象的静态方法

  29. 29

    在对象上调用自身的静态方法

热门标签

归档