Я пытаюсь преобразовать программу из Python (2.7, 32-разрядная версия) в Go (1.12.5, 32-разрядная версия), и терпит неудачу с нарушением прав доступа.Программа вызывает функцию в 32-битной dll (ehlapi32.dll).
Следующие фрагменты кода Python работают нормально (я не утверждаю, что они правильные!):
class ehlapi32:
hllDll = "C:\Program Files (x86)\IBM\Personal Communications\EHLAPI32.dll"
hllDll = ctypes.WinDLL(hllDll)
hllApiProto = ctypes.WINFUNCTYPE(ctypes.c_int,ctypes.c_void_p,ctypes.c_void_p,
ctypes.c_void_p,ctypes.c_void_p)
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
pFunConnect = ctypes.c_int(1)
...
def connect(self):
shlSession = self.session + b'\0\0\0'
pText = ctypes.c_char_p (shlSession)
pLength = ctypes.c_int (len(shlSession))
pReturn = ctypes.c_int (13)
ehlapi32.hllApi (ctypes.byref (ehlapi32.pFunConnect), pText,
ctypes.byref (pLength), ctypes.byref (pReturn))
Теперь вот что я пытаюсь использовать как эквивалент Go.Ошибка:
// ElFunc: EHLLAPI Functions
type ElFunc uint32
const (
eConnect ElFunc = 1 // Connect to a terminal
)
...
// Session: a 3270 session handle
type Session struct {
SessId string
SysId string
Entry string
Result []string
Headers int
Footers int
Rows int
Cols int
Scroll int
Proc *syscall.LazyProc
}
...
func (s Session) Connect() uint32 {
// Load EHLLAPI DLL
dll := syscall.NewLazyDLL(dllName)
s.Proc = dll.NewProc(dllProc)
// Connect to session
rc := s.ecall(eConnect, s.SessId, 1, 0)
if rc == 0 {
defer s.Disconnect()
}
...
// ecall: provides simplified EHLLAPI DLL calls
func (s Session) ecall(fun ElFunc, buffer string, count uint32, ps uint32) uint32 {
rc := ps
_, _, _ = s.Proc.Call(
uintptr(unsafe.Pointer(uintptr(uint32(fun)))),
uintptr(unsafe.Pointer(&buffer)),
uintptr(unsafe.Pointer(uintptr(count))),
uintptr(unsafe.Pointer(uintptr(rc))),
)
return rc
}
Ошибка выглядит как нарушение прав доступа на s.Proc.Call
в ecall()
.
Я понимаю, что syscall
устарела;Я тоже пробовал с golang.org/x/sys/windows
, но безуспешно.У меня нет никаких ограничений в отношении того, что я использую.
Признаюсь, я здесь далеко от моей глубины.