ctypes,python3.8:OSError:异常:访问冲突写入0x00000000

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

我想通过python 3.8运行dll我在dll部分中有一个功能是:

void DLLAPI __stdcall GenerateReport (
    int             SeqContext,
    char*           szHost,
    char*           szDBName,
    char*           szUser,
    char*           szPasswd,
    const char*     szUut_Result_Id,
    char            szStylesheet[MAX_PATHNAME_LEN],
    char            szDestinationDir[MAX_DIRNAME_LEN],
    char            szPrefix[MAX_FILENAME_LEN],
    char            szFileName[MAX_PATHNAME_LEN],
    char            szPathName[MAX_PATHNAME_LEN],
    short*          psErrorOccurred,
    long*           plErrorCode,
    char            szErrorMessage[1024]
    );

对于python,我确实是这样的:

def PrintReport():
    szNom_PV_Court = ''
    szErrormessage = ''
    sErrorok = 0
    lErrorcode = 0

    worker_ = cdll.LoadLibrary("D:\\users\\Worker.dll")

    if (worker_ == 0):
        print( " Could not open file DLL")

    worker_.GenerateReport( 0, "localhost" ,  "backend" , "user" , "test12", str( Uut_Result_Id ) , "D:\\users\\py\\ResourceFiles\\Gen.xsl" , "D:\\users\\py","" ,szNom_PV_Court , "D:\\users\\py" ,sErrorok ,lErrorcode ,szErrormessage )

当我执行我的代码时,我得到错误:OSError:异常:访问冲突写入0x0000000

我不明白此错误,请帮忙

python c ctypes
2个回答
0
投票

您尚未为DLL填充所有字符串,因此它们被初始化为零。您的dll试图从地址0x0(零)读取数据,并且为此被OS sm打。用适当的值填写所有必填字段。


0
投票

Python 3中的"localhost"之类的字符串是Unicode字符串,并由ctypes转换为wchar_t*。将b'localhost'用于转换为char*的字节字符串。

还要为函数定义.argtypes.restype,以使ctypes正确编组参数:

worker_.argtypes = c_int,c_char_p,c_char_p,c_char_p,c_char_p,c_char_p,c_char_p,c_char_p,c_char_p,c_char_p,c_char_p,POINTER(c_short),POINTER(c_long),c_char_p
worker_.restype = None

您在调用中也只有13个参数,但为该函数定义了14个。

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