Re: [ctypes-users] system crash problem
Brought to you by:
theller
From: <jU...@ar...> - 2007-05-25 11:54:06
|
Luca Politti schrieb: > Good morning group!!!! > > I have a problem that drives me crazy!!!! > > I'm working with TAPI, and I have to use the function "lineGetAddressCaps" > that have this definition: > > LONG WINAPI lineGetAddressCaps( > HLINEAPP hLineApp, > DWORD dwDeviceID, > DWORD dwAddressID, > DWORD dwAPIVersion, > DWORD dwExtVersion, > LPLINEADDRESSCAPS lpAddressCaps > ); > > This function fills the structure poited by lpAddressCaps. > The structure has a dwTotalSize attribute that indicates the total size > (in bytes) > of the structure, and it has to be set before calling lineGetAddressCaps. > So, I know that the structure needs 3392 bytes to work. Correctly, if I > set dwTotalSize > to 3391 or less, TAPI raise a LINEERR_STRUCTURETOOSMALL error...and I > understand it... > So I say: "let's allocate more bytes to the structure" and I set > dwTotalSize to 4096... > but the system crashes and appears the window: "send an error report..." > with the > Python icon... > It has the same behaviour if I set dwTotalSize exactly to 3392... > What could it be? > > I post you some of my code: > > lineAddressCaps = LINEADDRESSCAPS() # the structure > lineAddressCaps.dwTotalSize = 3392 # setting the max size > dwDeviceID = DWORD(209) # the phone device ID > dwAddressID = DWORD(0) > dwExtVersion = DWORD(0) > > lReturn = l.lineGetAddressCaps(hLineApp, dwDeviceID, dwAddressID, > dwTapiVersion, dwExtVersion, addressof(lineAddressCaps)) > > > I also found some C code that do the same thing and it work like this: > > lpAddressCaps = LocalAlloc(LPTR, 4096) // LPTR = 0x0040 > lpAddressCaps -> dwTotalSize = 4096 > > I've tried to do like it usig LocalAlloc from kernel32.dll, but when I do > lpAddressCaps.dwTotalSize = 4096 Python raises an error like "int object > have no > attribute dwTotalSize"... > > I hope have been clear enough...please help me... > > Thanks in advance > > Luca > > > Still struggeling ;-) I didn't look closely at the api, but my best guess is that you make a first call to it, find out about the required size, allocate as much as needed and pass the memory in a second call. Never hard code any sizes. So, maybe you should try first with "dwTotalSize" set to 0 or maybe sizeof(LINEADDRESSCAPS) and check "dwNeededSize" as the function returns. Next you could set up a a byte array of the required size, pass it over and read the data from the buffer. -------------------------------------- lineAddressCaps = LINEADDRESSCAPS() lineAddressCaps.dwTotalSize = sizeof(lineAddressCaps) (...) result = lineGetAddressCaps(......, byref(lineAddressCaps)) buf = (c_ubyte*lineAddressCaps.dwTRequiredSize)() result = lineGetAddressCaps(......, byref(buf)) lineAddressCaps = LINEADDRESSCAPS.from_address(addressof(buf)) # interpret data at the offsets as specified in the struct See also: [http://msdn2.microsoft.com/en-us/library/ms735674.aspx] Jürgen |