myPythonClient
(poniżej) chce wywołać funkcję ringBell
(ładowaną z biblioteki DLL za pomocą ctypes
). Jednak próba uzyskania dostępu do ringBell
za pośrednictwem jego nazwy o nazwie skutkuje uzyskaniem AttributeError
. Czemu?Python: dostęp do funkcji DLL przy użyciu ctypes - dostęp przez funkcję * nazwa * kończy się niepowodzeniem
RingBell.h
zawiera
namespace MyNamespace
{
class MyClass
{
public:
static __declspec(dllexport) int ringBell (void) ;
} ;
}
RingBell.cpp
zawiera
#include <iostream>
#include "RingBell.h"
namespace MyNamespace
{
int __cdecl MyClass::ringBell (void)
{
std::cout << "\a" ;
return 0 ;
}
}
myPythonClient.py
zawiera
from ctypes import *
cdll.RingBell[1]() # this invocation works fine
cdll.RingBell.ringBell() # however, this invocation errors out
# AttributeError: function 'ringBell' not found
Masz rację. Użyłem następujących sposobów, aby odkryć "zniekształconą" nazwę: link.exe/dump/exports RingBell.dll i odkryłem, że w bibliotece DLL nazwa funkcji brzmiała: "? RingBell @ MyClass @ MyNamespace @@ SAHXZ ". Dziękujemy! –
Wspomnę również, że użyłem funkcji getattr Pythona, aby uzyskać odwołanie do funkcji RingBell: myRingBellFunction = getattr (cdll.RingBell, "? RingBell @ MyClass @ MyNamespace @@ SAHXZ") myRingBellFunction() # wywołanie funkcji jeszcze raz –