我有一个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而不是。 任何人都可以帮助我使用以下代码?我不知道我哪里出错了?
答案 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
希望它能帮助你开始。