Re: [ctypes-users] Re: Converting macro..
Brought to you by:
theller
From: Thomas H. <th...@py...> - 2005-02-15 20:55:42
|
Andrew Markebo <and...@co...> writes: > Ok follow up with source and so on, unfortunetaly I can't hand you the > dll.. if you don't have labview. > > Running the call as: > Cut_string(5, > LStrToLStrHandle(instr), \ > LStrToLStrHandle(outstr) ) > > gives > > LStrToLStrHandle(outstr) \ > WindowsError: exception: access violation reading 0x0000000F > > running it as: > > Cut_string(5, > pointer(LStrToLStrHandle(instr)), \ > pointer(LStrToLStrHandle(outstr)) ) > > popups a dialogue from LabView: "Error#3 memory.cpp, line 600 contact > us..." > > Here my minimal example comes... > > from ctypes import * > > class LStr(Structure) : > _fields_ = [ ("cnt", c_int), ("str", c_char_p) ] That doesn't match the C definition of LStr that you gave before. The C version consists of one integer plus one character (one int plus an array of one character, to be exact), the ctypes version contains an integer plus a *pointer* to characters. The former has 5 bytes, the latter has 8. The ctypes version would look like this: class LStr(Structure): _fields_ = [("cnt", c_int), ("str", c_char * 1)] Normally, in C instances of structures like these (which are really variable sized) are allocated with code like this: LStr *p = (LStr *)malloc(sizeof(LStr) + count); where <count> specifies the actual size of the character array. If you wrote this: LStr instring; then the array would only have one character. As I said, ctypes can't handle these variable sized structures (not very well, at least). So, again I would suggest you look up the code that I posted using the struct module to build memory blocks containing these beasts. Then, assuming you have a 'LStr' function that creates them, you can: instr = LStr(15, "abcdefghijklmno") outstr = LStr(10, "..........") pointer(instr) is then probably a LStrPtr. And pointer(pointer(instr)) a LStrHandle. Try calling the function like this: P_instr = pointer(instr) P_outstr = pointer(outstr) Cut_string(5, byref(instr), byref(outstr)) Sorry, no more time. Thomas > LStrP=POINTER(LStr) # <class 'ctypes.LP_LStr'> > LStrH=POINTER(LStrP) # <class 'ctypes.LP_LP_LStr'> > > def LStrToLStrHandle(theLStr): > return LStrH(LStrP(theLStr)) > def LStrHandleToLStr(theHandle): > return theHandle.contents.contents > > instr=LStr(15, "abcdefghijklmno") > outstr=LStr(10,"0123456789") > > Cut_string=windll.LoadLibrary("Cut_String.dll").Cut_string > # void __stdcall Cut_string(int32 NewStringLength, LStrHandle *StringIn, > # LStrHandle *StringOut); > > Cut_string(5, > LStrToLStrHandle(instr), \ > LStrToLStrHandle(outstr) \ > ) > > > > > > -- > All people are equal, but some are more equal that the others > - Someone more equal > But we all are told that we differ?? > - Me.. > > > > ------------------------------------------------------- > SF email is sponsored by - The IT Product Guide > Read honest & candid reviews on hundreds of IT Products from real users. > Discover which products truly live up to the hype. Start reading now. > http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click > _______________________________________________ > ctypes-users mailing list > cty...@li... > https://lists.sourceforge.net/lists/listinfo/ctypes-users |