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 自动生成的东西之外,它还有以下两个文件:

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 回答