OcTrbug:C++中Python和CeaFieleA中的cType访问违规写入

2024-09-29 20:18:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个C++程序,与串口连接的设备进行通信,我想用一个更大的Python文件来集成它。在调试了一段时间后,我制作了这个较小的示例,给出了相同的错误。我的研究表明,它可能与CyType有关,以及C++在Python文件中使用指针时如何处理,但我不太清楚是什么导致了这个错误。p>

serialpy.py:

from ctypes import cdll
lib = cdll.LoadLibrary('./serialcpp.so')

class SerialPy(object):
    def __init__(self):
        self.obj = lib.SerialCPP_New()

    def startComm(self):
        lib.SerialCPP_startComm(self.obj)

serialObj = SerialPy()
serialObj.startComm()

serialcpp.cpp:

#include <windows.h>
#include <string>

class SerialCPP {
    public:
        HANDLE serialHandle;

    public:
        void startComm() {
           COMMTIMEOUTS timeout = { 0 };
           DCB serialParams = { 0 };
           int returnStatus;

           // Start connection to the port
           serialHandle = CreateFileA((LPCSTR) "\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
        }
};

extern "C" {
    SerialCPP* SerialCPP_New(){ return new SerialCPP(); }
    void SerialCPP_startComm(SerialCPP* SerialCPPObj) { SerialCPPObj->startComm(); }
}  

这是我如何将.cpp文件编译成.so文件的

>g++ -c -fPIC serialcpp.cpp -o serialcpp.o
>g++ -shared -o serialcpp.so serialcpp.o

在生成.so文件后运行python文件时,出现以下错误:

PS C:\Users\Luke\Documents\GitHub\---------\src\main> & C:/ProgramData/Anaconda3/python.exe c:/Users/Luke/Documents/GitHub/---------/src/main/serialpy.py
Traceback (most recent call last):
  File "c:/Users/Luke/Documents/GitHub/---------/src/main/serialpy.py", line 12, in <module>
    serialObj.startComm()
  File "c:/Users/Luke/Documents/GitHub/---------/src/main/serialpy.py", line 9, in startComm
    lib.SerialCPP_startComm(self.obj)
OSError: exception: access violation writing 0x00000000B77919B0

我正在使用python 3.8.8

当我用注释掉的CreateFileA行运行这段代码时,它工作得很好,但我不确定是什么导致了这个错误。我最好的猜测是,它与字符串“\\.\COM3”被写入内存有关,python程序也没有访问权限

编辑: 当我删除

HANDLE serialHandle;

改变

serialHandle = 

HANDLE serialHandle =

它开始工作了。我真的需要这个变量是全局的,因为我在startComm之外的其他方法中访问它,所以我的问题没有得到解决

编辑2: 原来我初始化全局变量时出错了。我不得不把我的变量放在课堂之外,不知道为什么


Tags: 文件pyselfgithubsolib错误users

热门问题