New submission from Igor Kudrin: It looks like resolving https://bugs.python.org/issue20160 didn't fix all the issues. When a large struct is used as a parameter, a reference to the object itself is passed to the function, not a reference to a temporary copy, as it is required in https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx.
Here is the reproduction sample: === Sample.c: === typedef struct { int v[3]; } Data; __declspec(dllexport) void Cripple(Data data) { data.v[0] = 0; } === Sample.py === from ctypes import * class Data(Structure): _fields_ = [("v", c_int * 3)] lib = cdll.LoadLibrary('Sample.dll') getattr(lib, 'Cripple').argtypes = [Data] data = Data() data.v[0] = 42 lib.Cripple(data) assert data.v[0] == 42 print "OK" === repro.cmd === call "%VS140COMNTOOLS%/../../VC/vcvarsall.bat" x86_amd64 cl /LD Sample.c python Sample.py ---------- components: Windows, ctypes messages: 287831 nosy: Igor Kudrin, christian.heimes, doko, mark.dickinson, meador.inge, paul.moore, steve.dower, tim.golden, vinay.sajip, zach.ware priority: normal severity: normal status: open title: Still broken ctypes calling convention on MSVC / 64-bit Windows (large structs) type: behavior versions: Python 2.7 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue29565> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com