2012-03-21 4 views
0

私はctypesを使用してPython経由でいくつかのCコードにアクセスしようとしていますので、非常に基本的なDLLを書きましたが(次のように)、DLLを読み込んで関数を呼び出すと、ctypes経由でDLLにアクセスすると、不思議な結果になるのですか?

ここはCコードです。これは、Open Watcomを使用してDLLとしてコンパイルしたものです。あなたが見ることができるように派手な何も:私はDLL関数を呼び出すとき

#include <stdio.h> 

__declspec(dllexport) int sum(int a, int b) { 
    return (a + b); 
} 

ここで、出力はません(Watcomのコンパイラは、各エクスポートの名前に_が追加されます...聞かないでください。):

Python 3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> from ctypes import cdll 
>>> mydll = cdll.LoadLibrary('c:\\dev\\C\\TestDLL\\test.dll') 
>>> mydll 
<CDLL 'c:\dev\C\TestDLL\test.dll', handle 1cb0000 at 1910a30> 
>>> mydll.sum_(8,3) 
4451768 
>>> 

私はいくつかの種類の魂私の方法の誤りを指摘し、私の悲惨さから私を入れていただければ幸いです...関係なく、関数に渡されているもののパラメータ

を同じ出力を得ることはありません。事前に:-)

おかげで、

ジェームズ

+2

watcomコンパイラのデフォルトの呼び出し規約です。 'cdecl'を強制してください。さもなければ私はこれがいかに悪くなることができるか見ることができない。 –

答えて

0

はcdecl呼び出し規約を指定してください。私のための作品:

+0

それは動作します!あなたは私のヒーローです。 :-)私の質問は、エクスポートされた関数が__cdeclデコレーションを必要とする理由は何ですか? __declspecは何ですか? DLLから関数をエクスポートする際の検索でこれを見るのは覚えていません。どんな考えにも感謝します!再度、感謝します。 – James

+1

@Jamesでは、 'ctypes.cdll'は' __cdecl'呼び出し規約を必要とします。 'ctypes.windll'は' __stdcall'呼び出し規約を使います。これらは、関数呼び出し元と呼び出し先の間でスタックにパラメータを渡す方法と、それらをクリーンアップする方法に関する特定の合意です。 '__declspec(dllexport)'は関数がDLLからエクスポートされていることを示していますが、呼び出し規約については何も表示していません。 –

+0

多くのありがとう - 私は明確化を感謝します! – James

関連する問題