Я сталкиваюсь с вопросом, может ли dll java или php вызвать успешно, но когда я использую вызов python, получаю ошибку нарушения доступа,
Я хочу знать, что c ++ char * это ошибка для ctypes c_char_p, как я могу использовать python ctypes map c ++ char *
c ++ dll define
#define Health_API extern "C" __declspec(dllexport)
Health_API unsigned long Initialization(int m_type,char * m_ip,int m_port)
Health_API int GetRecordCount(unsigned long m_handle)
код питона
from ctypes import *
lib = cdll.LoadLibrary(r"./Health.dll")
inita = lib.Initialization
inita.argtype = (c_int, c_char_p, c_int)
inita.restype = c_ulong
getcount = lib.GetRecordCount
getcount.argtype = c_ulong
getcount.retype = c_int
# here call
handle = inita(5, '127.0.0.1'.encode(), 4000)
print(handle)
result = getcount(handle)
информация об ошибке:
2675930080
Traceback (most recent call last):
File "C:/Users/JayTam/PycharmProjects/DecoratorDemo/demo.py", line 14, in <module>
print(getcount(handle))
OSError: exception: access violation reading 0x000000009F7F73E0
После модификации
Я нахожу, если не определить restype = long, он вернет отрицательное число, это заслуживающая внимания проблема, но я изменяю restype = u_int64, он также не может подключиться.
Восхитительно, что мой школьный товарищ использует свой компьютер (win7 x64) с тем же успехом в dll, использует простой код, как следует
from ctypes import *
lib = cdll.LoadLibrary("./Health.dll")
handle = lib.Initialization(5, '127.0.0.1'.encode(), 4000)
lib.GetRecordList(handle, '')
Я win10 x64, моя среда python - annaconda, и я изменяю ту же среду, что и она, использую тот же код, но по-прежнему возвращаю ту же ошибку
питон против Java
Хотя я знаю, что это должна быть причина окружающей среды, я действительно хочу знать, Что именно вызвало это?
питон
каждый прогон дескриптор - это неправильный номер, компьютер моего одноклассника получает обычный номер
, например: 288584672,199521248,1777824736, -607161376 (я не устанавливаю restype)
это использует DLL-вызов Python, невозможно подключить порт 4000
Java
также получите обычный номер без отрицательного числа
, например: 9462886128,9454193200,9458325520,9451683632
это java вызов dll
так что я думаю, что это должно быть из-за ошибки в коде, но в других ПК нет проблем, это удивительно
handle = lib.Initialization(5, '127.0.0.1'.encode(), 4000)
c ++ dll:
Health_API unsigned long Initialization(int m_type,char* m_ip,int m_port)
{
CHandleNode* node;
switch(m_type)
{
case BASEINFO:
{
CBaseInfo* baseInfo = new CBaseInfo;
baseInfo->InitModule(m_ip,m_port);
node = m_info.AddMCUNode((unsigned long)baseInfo);
node->SetType(m_type);
return (unsigned long)baseInfo;
}
break;
case BASEINFO_ALLERGENS:
{
CBaseInfo_Allergens* baseInfo_Allergens = new CBaseInfo_Allergens;
baseInfo_Allergens->InitModule(m_ip,m_port);
node = m_info.AddMCUNode((unsigned long)baseInfo_Allergens);
node->SetType(m_type);
return (unsigned long)baseInfo_Allergens;
}
break;
. (case too many, ... represent them)
.
.
}
return -1;
}
Health_API int GetRecordList(unsigned long m_handle,char* m_index)
{
CHandleNode* node = m_info.GetMCUNode(m_handle);
if( node == NULL)
{
return -1;
}
switch(node->GetType())
{
case BASEINFO:
{
CBaseInfo* baseInfo = (CBaseInfo*)m_handle;
return baseInfo->GetRecordList(m_index);
}
break;
case BASEINFO_ALLERGENS:
{
CBaseInfo_Allergens* baseInfo_Allergens = (CBaseInfo_Allergens *)m_handle;
return baseInfo_Allergens->GetRecordList(m_index);
}
break;
. (case too many, ... represent them)
.
.
}
return -1;
}