myPythonClient
(下記)はを使用してDLLからロードされたringBell
関数を呼び出したいとします。ただし、の名前を介してringBell
にアクセスしようとすると、AttributeError
になります。どうして?Python:ctypesを使用したDLL関数へのアクセス - 関数* name *によるアクセスが失敗しました
RingBell.h
は
namespace MyNamespace
{
class MyClass
{
public:
static __declspec(dllexport) int ringBell (void) ;
} ;
}
RingBell.cpp
が
#include <iostream>
#include "RingBell.h"
namespace MyNamespace
{
int __cdecl MyClass::ringBell (void)
{
std::cout << "\a" ;
return 0 ;
}
}
myPythonClient.py
が含まれている含まれているC++の名前がコンパイラによって壊さとRingBell
としてDLLからエクスポートされていないため、
from ctypes import *
cdll.RingBell[1]() # this invocation works fine
cdll.RingBell.ringBell() # however, this invocation errors out
# AttributeError: function 'ringBell' not found
あなたは正しいです。 link.exe/dump/exports RingBell.dll と、DLL内で、関数の名前が "?ringBell @ MyClass @ MyNamespace @@ SAHXZであることが判明しました。 " ありがとうございます! –
また、私はringBell関数への参照を得るためにPythonのgetattr関数を使用したことにも言及します: myRingBellFunction = getattr(cdll.RingBell、 "?ringBell @ MyClass @ MyNamespace @@ SAHXZ") myRingBellFunction()#関数を呼び出すもう一度 –