我正在尝试使用Pythons ctypes模块从DLL导入和使用函数,但我一直收到此错误:
Windows Error: exception: access violation writing 0x0000002C
我已经在这里查看过类似主题的其他问题,但似乎没有人能够提供有效的答案。 我目前的代码如下:
from ctypes import *
dll = "./WinlicenseSDK/WinlicenseSDK.dll"
mydll = cdll.LoadLibrary(dll)
name = c_char_p("A.N. Body")
org = c_char_p("ACME")
pcID = c_char_p("APC44567")
zero = c_int(0)
licenseKey = create_string_buffer("")
mydll.WLGenLicenseFileKey(HASH, name, org, pcID, zero, zero, zero, zero, zero, licenseKey)
背景:我正在调查一个软件的许可技术。上述函数通过散列参数生成许可证密钥。
WLGenLicenseFileKey的最后一个参数是一个字符串缓冲区,用于写入生成的密钥。
我尝试使用mydll.WLGenLicenseFileKey.argtypes = ...
为函数设置argtypes但这不起作用,因为没有字符串缓冲区ctypes原始类型,因为有字符串,整数,浮点数等。
有谁能告诉我哪里出错了?
编辑:
C / C ++函数定义:
int WLGenLicenseFileKeyW(
wchar_t* pLicenseHash,
wchar_t* pUserName,
wchar_t* pOrganization,
wchar_t* pCustomData,
wchar_t* pMachineID,
int NumDays,
int NumExec,
SYSTEMTIME* pExpirationDate,
int CountryId,
int Runtime,
int GlobalTime,
char* pBufferOut
);
这是文档提供的有关该功能的所有信息。
答案 0 :(得分:3)
licenseKey缓冲区的长度是一个字节,并且您没有传递Unicode字符串。我不在我的电脑前,但我应该接近假设你的参数是正确的。确保调用该函数的W版本。只要它们是整数和指针,您也不需要创建确切的类型。
buffer = create_string_buffer(REQUIRED_BUFSIZE)
mydll.WLGenLicenseKeyW(u"A.N. Body", u"ACME", u"APC44567", None, None, 0, 0, None, 0, 0, 0, buffer)
如果您确实想使用argtypes
,那么这就是您想要的:
mydll.WLGenLicenseKeyW.argtypes = [c_wchar_t,c_wchar_t,c_wchar_t,c_wchar_t,c_wchar_t,c_int,c_int,c_void_p,c_int,c_int,c_int,c_char_p]
如果你想传递除NULL之外的东西,还需要定义 SYSTEMTIME
。
修改强>
我找到了一些documentation。该函数使用stdcall调用约定,因此使用:
mydll = WinDLL(dll)