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