ctypes help

Nick Craig-Wood nick at craig-wood.com
Fri May 23 06:30:09 EDT 2008


gianluca <geonomica at gmail.com> wrote:
>  On 23 Mag, 07:48, Marc 'BlackJack' Rintsch <bj_... at gmx.net> wrote:
> > On Thu, 22 May 2008 21:55:41 -0700, gianluca wrote:
> > > Yes, I know it but when I load a function (a=myDLL.myFUNCT()) I've an
> > > exception like this:
> >
> > > Traceback (most recent call last):
> > >   File "<pyshell#18>", line 1, in <module>
> > >     myDLL.myFUNCT()
> > >   File "C:\Python25\lib\ctypes\__init__.py", line 353, in __getattr__
> > >     func = self.__getitem__(name)
> > >   File "C:\Python25\lib\ctypes\__init__.py", line 358, in __getitem__
> > >     func = self._FuncPtr((name_or_ordinal, self))
> > > AttributeError: function 'myFUNCT' not found
> >
> > Then maybe the DLL doesn't contain a function called `myFUNCT`.  Any
> > chance you compiled your C as C++ and name mangling kicked in?
> >
> > Can you show a minimal C source for a DLL, how you compiled it, what you
> > did on the Python side to call it, and how it fails?
> >
> > Ciao,
> >         Marc 'BlackJack' Rintsch
> 
>  I've located my dll in c:\windows\system32 (in linux I aven't any
>  problem) and I compiled it with dev-c++. The source code is C standard
>  ANSII and is quite havy. If you like I can send it via mail (you can
>  realy at geonomica at gmail.com) . I've tryed to build a wrape with swig
>  olso with same code and I can access at all the function.

You can use objdump from mingw or cygwin to look inside the dll and
see exactly what it is exporting, eg

objdump -x OurSharedCodeLibrary.dll

This prints a great deal of stuff!  In the middle you'll see

[snip]
The Export Tables (interpreted .rdata section contents)
[snip]
Ordinal/Name Pointer] Table
        [   0] OSCL_DEBUG_fakeInitComplete
        [   1] OSCL_close
        [   2] OSCL_displayIdent
        [   3] OSCL_getCurrentDynamicParams
        [   4] OSCL_getCurrentStaticParams
        [   5] OSCL_getErrorString
        [   6] OSCL_getIdent
[snip]

This is a dll we used in a project, and those names exactly worked
with ctypes, eg some snips from the ctypes code

        self.dll = cdll.LoadLibrary("OurSharedCodeLibrary")
        self.dll.OSCL_getErrorString.restype = c_char_p

    def getErrorString(self, status):
        return self.dll.OSCL_getErrorString(c_int(status))

-- 
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick



More information about the Python-list mailing list