JHo*_*lta 3 c++ python dll ctypes
我正在尝试编写一个可以在Python(2.7)中导入的DLL,并且我遇到了"使其工作"的困难.当我使用WinDLL()或在Python中加载库时windll.LoadLibrary(),并测试导出的函数,我得到的输出是空的.如果我向TestFunction()它添加一个参数,则会引发一个ValueError声明可能存在许多参数(实际上并非如此).
蟒蛇文件:
from ctypes import *
x = windll.LoadLibrary('./pymod.dll')
print x.TestFunction(123) #Should return 123.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
和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;
}
Run Code Online (Sandbox Code Playgroud)
解决了:调用约定的问题是错误的.
我的第一个猜测是你使用的是与Python假设不同的调用约定.
int DLL_EXPORT TestFunction(int data);
Run Code Online (Sandbox Code Playgroud)
该声明可能意味着cdecl将使用调用约定; 使用windllmake时,Python认为stdcall应该使用约定.这有效地改变了参数传递的方式,从而使Python相信您传递了错误数量的参数.这在ctypes文档中有说明.
如果是这种情况,您可以执行以下任一操作:
stdcall(在Windows系统DLL中使用).如果您正在使用MSVC,他们有一个关于开发DLL的文档 ;cdecl.这是通过使用cdll而不是windll.| 归档时间: |
|
| 查看次数: |
2682 次 |
| 最近记录: |