Вызов DDL функции которая возвращает HANDLE из Python на win64 и win32
Подключаюсь к PLC.Для связи по TCP c PLC есть 2 DDL. Первая 32 разрядная версия m1com.dll, вторая для 64 разрядной версии для windows m1com64.dll. В Visual Studio эти библиотеки работают без проблем. Python win32 версия работает, а win64 версия выдает OSError. Код для 32 разрядной версии:
# -*- coding: utf-8 -*-
import sys
print(sys.version)
import os
import ctypes
import ctypes.wintypes
TEST_IP = b"192.0.1.230"
TEST_USER = b"USER"
TEST_PASSWD = b"***********"
str_TEST_IP = ctypes.create_string_buffer(TEST_IP)
str_TEST_USER = ctypes.create_string_buffer(TEST_USER)
str_TEST_PASSWD = ctypes.create_string_buffer(TEST_PASSWD)
M1C_TCP = 0
M1C_OK = 0
cwd = os.getcwd()
print(cwd)
#give location of dll
M1dll = ctypes.CDLL(cwd+"\m1com.dll", use_last_error=True)
print(M1dll)
version = ctypes.create_string_buffer(6)#create zero string buffer
#M1COM VOID M1C_GetVersion(CHAR* version, UINT32 strLen);
M1C_GetVersion = M1dll.M1C_GetVersion
M1C_GetVersion.argtypes = (ctypes.POINTER(ctypes.c_char), ctypes.c_size_t)
M1C_GetVersion.restypes = None
M1C_GetVersion(version, ctypes.sizeof(version))
print('version = ',version.value)
TARGET_Create = M1dll.TARGET_Create
TARGET_Create.argtypes = (ctypes.POINTER(ctypes.c_char), ctypes.c_uint, ctypes.c_uint)
TARGET_Create.restypes = ctypes.c_void_p
targetHandle = TARGET_Create(str_TEST_IP, 0, 1000)#M1C_TCP
print(ctypes.cast(targetHandle, ctypes.c_void_p).value)
print('HANDLE = ', targetHandle)
print(type(targetHandle))
print(hex(targetHandle))
p_TEST_USER = ctypes.c_char_p(TEST_USER)
p_TEST_PASSWD = ctypes.c_char_p(TEST_PASSWD)
p_toolName = ctypes.create_string_buffer(b"")
TARGET_Connect = M1dll.TARGET_Connect
#TARGET_Connect.argtypes = (c.c_void_p, c.POINTER(c_wchar), c.POINTER(c_wchar), c.POINTER(c_wchar))
TARGET_Connect.argtypes = (ctypes.wintypes.HANDLE, ctypes.POINTER(ctypes.c_char), ctypes.POINTER(ctypes.c_char), ctypes.POINTER(ctypes.c_char))
TARGET_Connect.restypes = ctypes.c_int
ret = TARGET_Connect(targetHandle, str_TEST_USER, str_TEST_PASSWD, p_toolName)
print(hex(ret))
if ret != M1C_OK:
M1dll.TARGET_Dispose(targetHandle)
print(f'connection established with {str_TEST_IP.value}')
M1dll.TARGET_Close(targetHandle)
# cleanup
M1dll.TARGET_Dispose(targetHandle)
Для 64 разрядной версии все тоже самое, только вместо m1com.dll вызываю m1com64.dll и получаю ошибку:
Traceback (most recent call last):
File "C:/Users/PC-Lite/PycharmProjects/cdd322/cddl64.py", line 58, in <module>
ret = TARGET_Connect(targetHandle, str_TEST_USER, str_TEST_PASSWD, p_toolName)
OSError: exception: access violation reading 0x0000000049E59440
Мне кажется, причина кроится в функции
targetHandle = TARGET_Create(str_TEST_IP, 0, 1000)#M1C_TCP
Она возвращает targetHandle для win64 неправильный. При отладке в Visual Studio для win64 размер Handle равен 64 bits, для win32 Handle равен 32 bits. Python в обоих случаях возвращает 32 bits Handle.
Как заставить работать функцию TARGET_Create на win64. Спасибо.