2

この関数をエクスポートする C で記述された dll があります。

typedef struct testResult_t {
    int testId;
    int TT; 
    double fB;
    double mD;
    double mDL;
    int nS;
    int nL;
} TestResult;

TestResult __stdcall dummyTest(){
    TestResult a = {0};
    a.testId = 3;
    return a;
};

私はこの方法でPythonから関数を呼び出しています:

class TestResult(Structure):
    _fields_ = [
        ("testId", c_int),
        ("TT", c_int),
        ("fB", c_double),
        ("mD", c_double),
        ("mDL", c_double),
        ("nS", c_int),
        ("nL", c_int)
    ]

astdll.dummyTest.restype = TestResult
result = astdll.dummyTest()
print "Test ID: %d" % (result.testId)

スクリプトの実行中に次のエラーが発生します。

Traceback (most recent call last):
  File "ast.py", line 330, in <module>
    main()
  File "ast.py", line 174, in main
    result = astdll.dummyTest()
  File "_ctypes/callproc.c", line 941, in GetResult
TypeError: an integer is required

何が問題なのですか?

4

1 に答える 1

0

問題を再現できません (Windows 7 x64、32 ビット Python 2.7.3)。あなたの問題を再現するために私が試したことを説明します。

Visual C++ Express 2008 で新しいプロジェクトとソリューションを作成しました。どちらも「CDll」という名前です。このプロジェクトは、C コードとしてコンパイルし、stdcall 呼び出し規約を使用するように設定されています。VC++ 2008 が自動生成したものとは別に、次の 2 つのファイルがありました。

CDll.h:

#ifdef CDLL_EXPORTS
#define CDLL_API __declspec(dllexport) 
#else
#define CDLL_API __declspec(dllimport) 
#endif

typedef struct testResult_t {
    int testId;
    int TT; 
    double fB;
    double mD;
    double mDL;
    int nS;
    int nL;
} TestResult;

TestResult CDLL_API __stdcall dummyTest();

CDll.cpp (はい、拡張子が「.cpp」であることは知っていますが、それは問題ではないと思います):

#include "stdafx.h"
#include "CDll.h"

TestResult __stdcall dummyTest() {
    TestResult a = {0};
    a.testId = 3;
    return a;
};

次に、DLL をコンパイルしてビルドしました。次に、それを読み込んで、次の Python スクリプトで関数を呼び出そうとしました。

from ctypes import Structure, c_int, c_double, windll

astdll = windll.CDll

class TestResult(Structure):
    _fields_ = [
        ("testId", c_int),
        ("TT", c_int),
        ("fB", c_double),
        ("mD", c_double),
        ("mDL", c_double),
        ("nS", c_int),
        ("nL", c_int)
    ]

astdll.dummyTest.restype = TestResult
result = astdll.dummyTest()
print "Test ID: %d" % (result.testId)

このスクリプトを実行すると、出力が得られましたTest ID: 3


問題が何であるかについて最初に考えたのは、 を使用CDLLする必要があるときに を使用して DLL を読み込もうとしているということでしたwindllが、 を使用しようとするとCDLL、まったく異なるエラー メッセージが表示されました。DLL をどのようにロードしているかは示されていませんが、windll上記で行ったように使用していると思われます。

于 2013-05-07T20:25:27.163 に答える