通过C DLL调用函数时出错

时间:2016-08-12 13:33:11

标签: python c dll ctypes

我有一个DLL,其中以下是标题和.c文件:

//demo.h
#define vers 0x1
__declspec export void getversion(ulong * version);

//demo.c
#include"demo.h"
void getversion(ulong * version)
{
*version=(ulong)vers;
}

我用ctypes调用DLL编写的python脚本如下:

//python script
import ctypes 
import sys
from ctypes import *
vers=0x1
def getversion(version):
    mydll=cdll.LoadLibrary('demo.dll')
    mydll.getversion.argtypes=[POINTER(c_ulong)]
    mydll.getversion.restype=None
    mydll.getversion(version) 

version=c_ulong()
print("Version=",version.value)

但是我得到的版本的值是0。 输出应该是1而不是。 任何人都可以帮助我使用以下代码?我不知道我哪里出错了?

2 个答案:

答案 0 :(得分:0)

我认为这是你应该做的:

mydll = cdll.demo  # just a simpler way to load the dll, not the solution yet
ver = c_ulong()
mydll.getversion(byref(ver))
print(ver.value)

答案 1 :(得分:0)

这是windows& vs的完整工作示例,如果你想尝试使用linux,你只需要更改数据类型并摆脱windows标题:

<强> demo.h

#include <windows.h>

ULONG g_version = 0x3;

__declspec(dllexport) void set_version(ULONG version);
__declspec(dllexport) ULONG get_version();
__declspec(dllexport) void get_version_by_reference(ULONG* version);

<强> demo.c

// build: cl.exe /D_USRDLL /D_WINDLL demo.c /link /DLL /OUT:demo.dll
#include "demo.h"

void set_version(ULONG version) {
    g_version=version;
}

ULONG get_version() {
    return g_version;
}

void get_version_by_reference(ULONG* version) {
    *version=(ULONG)g_version;
}

<强> demo.py

import ctypes
import sys
from ctypes import *

mydll = cdll.LoadLibrary('demo.dll')

# __declspec(dllexport) void set_version(ULONG version);
mydll.set_version.restype = None
mydll.set_version.argtypes = [c_ulong]

# __declspec(dllexport) void get_version();
mydll.get_version.restype = c_ulong
mydll.get_version.argtypes = []

# __declspec(dllexport) void get_version_by_reference(ULONG* version);
mydll.get_version_by_reference.restype = None
mydll.get_version_by_reference.argtypes = [POINTER(c_ulong)]

print "Step1, testing get_version"
print '-'*80
print mydll.get_version()
print "\nStep2, testing set_version & get_version"
print '-'*80
mydll.set_version(c_ulong(0x05))
print mydll.get_version()
print "\nStep3, testing get_version_by_reference"
print '-'*80
vers = c_ulong(0x09)
print "before assigning...",vers.value
mydll.get_version_by_reference(vers)
print "after assigning...",vers.value

希望它能帮助你开始。