擅长:python、mysql、java
<p>根据问题中提供的信息,解决方案是:</p>
<pre><code>import ctypes
lib = ctypes.CDLL(r'C:\Users\toto\FIProtocol.dll')
CommOpen = getattr(lib, "?CommOpen@CFIPcmd@@QAEJEJ@Z")
CommOpen.argtypes = [c_byte, c_long]
CommOpen.restype = c_long
</code></pre>
<p>现在它准备好呼叫:</p>
^{pr2}$
<p>注意事项:</p>
<ol>
<li>使用<code>CDLL</code>而不是<code>WinDLL</code>,因为函数使用了默认的<code>cdecl</code>调用约定。在</li>
<li>使用<code>getattr</code>可以指定损坏的名称。在</li>
<li>显式地指定<code>argtypes</code>和<code>restype</code>总是值得的。在</li>
</ol>
<hr/>
<p>然而,它表明你有一个更大的问题。以上是基于您的函数是一个非成员函数而编写的。这是一个合理的假设,因为<code>ctypes</code>要求函数要么是非成员,要么是静态的。在</p>
<p>但是,当我将托管函数名放入demanger(例如<a href="http://pear.warosu.org/c++filtjs/" rel="nofollow">http://pear.warosu.org/c++filtjs/</a>)时,似乎该函数实际上是:</p>
<pre><code>public: long __thiscall CFIPcmd::CommOpen(unsigned char,long)
</code></pre>
<P>这是C++对象的成员函数。无法从<code>ctypes</code>访问。您需要创建一个纯C风格的包装器,或者找到一个不同的互操作方法。在</p>