通过C DLL调用函数时出错

2024-10-01 07:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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。 有人能帮我做以下代码吗?我不知道我哪里出错了?你知道吗


Tags: 文件import头文件demoversionexportctypesdll
3条回答

下面是一个完全适用于windows&V的示例,如果您想在linux上试用,只需更改数据类型并删除windows标头:

演示.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);

演示.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;
}

演示.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;
}

我认为你应该这样做:

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)

相关问题 更多 >