ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c – 使用带有python的DLL(使用ctypes),不工作

2019-08-26 06:55:38  阅读:188  来源: 互联网

标签:python c ctypes dll


我正在尝试编写一个可以在Python(2.7)中导入的DLL,并且我遇到了“使其工作”的困难.当我使用WinDLL()或windll.LoadLibrary()在Python中加载库时,测试导出的函数,我得到的输出是空的.如果我向TestFunction()添加一个参数,它会引发一个ValueError,它声明可能有很多参数(实际上并非如此).

Python文件:

from ctypes import *

x = windll.LoadLibrary('./pymod.dll')
print x.TestFunction(123) #Should return 123.

main.h:

#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
#define DLL_EXPORT __declspec(dllexport)    

#ifdef __cplusplus
extern "C"
{
#endif

int DLL_EXPORT TestFunction(int data);

#ifdef __cplusplus
}
#endif

#endif

和main.cpp:

#include "main.h"

int DLL_EXPORT TestFunction(int x = 0) {
    return x;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch (fdwReason){
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return TRUE;
}

解决了:调用约定的问题是错误的.

解决方法:

我的第一个猜测是你使用的是与Python假设不同的调用约定.

int DLL_EXPORT TestFunction(int data);

该声明可能意味着将使用cdecl调用约定;使用windll时,Python认为应该使用stdcall约定.这有效地改变了参数传递的方式,从而使Python相信您传递了错误数量的参数.这在ctypes documentation中有所说明.

如果是这种情况,您可以执行以下任一操作:

>将C代码中的调用约定更改为stdcall(在Windows系统DLL中使用).如果你使用MSVC,他们有a doc on developing DLLs;
>将Python代码期望的调用约定更改为cdecl.这是通过使用cdll而不是windll来完成的.

标签:python,c,ctypes,dll
来源: https://codeday.me/bug/20190826/1727577.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有