我想通过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
我不明白此错误,请帮忙
您尚未为DLL填充所有字符串,因此它们被初始化为零。您的dll试图从地址0x0(零)读取数据,并且为此被OS sm打。用适当的值填写所有必填字段。
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个。