通过 C DLL 调用函数时出错
Error while calling function through C DLL
我有一个 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。
任何人都可以帮助我使用以下代码吗?我不知道我哪里错了?
我认为这是你应该做的:
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)
这是 windows&vs 的完整示例,如果您想尝试 linux,您只需更改数据类型并删除 windows headers :
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
希望它能帮助您入门。
您的代码没有调用 getversion
。您的代码创建一个默认值 ulong()
(初始化为零)并打印它。
version=c_ulong()
print("Version=",version.value)
这是工作代码:
from ctypes import *
mydll = CDLL('demo.dll')
mydll.getversion.argtypes = [POINTER(c_ulong)]
mydll.getversion.restype = None
version=c_ulong()
mydll.getversion(byref(version)) # call function with address of version
print("Version=",version.value)
这是我测试过的 DLL(你的无法编译...没有 ulong
的定义)并用 Microsoft Visual Studio.
编译
__declspec(dllexport) void getversion(unsigned long* version)
{
*version = 1;
}
我有一个 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。 任何人都可以帮助我使用以下代码吗?我不知道我哪里错了?
我认为这是你应该做的:
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)
这是 windows&vs 的完整示例,如果您想尝试 linux,您只需更改数据类型并删除 windows headers :
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
希望它能帮助您入门。
您的代码没有调用 getversion
。您的代码创建一个默认值 ulong()
(初始化为零)并打印它。
version=c_ulong()
print("Version=",version.value)
这是工作代码:
from ctypes import *
mydll = CDLL('demo.dll')
mydll.getversion.argtypes = [POINTER(c_ulong)]
mydll.getversion.restype = None
version=c_ulong()
mydll.getversion(byref(version)) # call function with address of version
print("Version=",version.value)
这是我测试过的 DLL(你的无法编译...没有 ulong
的定义)并用 Microsoft Visual Studio.
__declspec(dllexport) void getversion(unsigned long* version)
{
*version = 1;
}