我正在尝试使用ctypes.windll.loadlibrary(...)构建一个可以在python中加载的C DLL
我可以在C中创建一个DLL和一个客户端程序,它们遵循http://www.mingw.org/wiki/MSVC_and_MinGW_DLLs的MinGW教程。
当我尝试在python中加载相同的DLL时,我收到一个错误:
OSError: [WinErrror 193] %1 is not a valid Win32 application
有人可以让我知道我做错了什么吗?
以下是文件:
noise_dll.h
#ifndef NOISE_DLL_H
#define NOISE_DLL_H
// declspec will identify which functions are to be exported when
// building the dll and imported when 'including' this header for a client
#ifdef BUILDING_NOISE_DLL
#define NOISE_DLL __declspec(dllexport)
#else
#define NOISE_DLL __declspec(dllimport)
#endif
//this is a test function to see if the dll is working
// __stdcall => use ctypes.windll ...
int __stdcall NOISE_DLL hello(const char *s);
#endif // NOISE_DLL_H
noise_dll.c
#include <stdio.h>
#include "noise_dll.h"
__stdcall int hello(const char *s)
{
printf("Hello %s\n", s);
return 0;
}
我用以下代码构建DLL:
gcc -c -D BUILDING_NOISE_DLL noise_dll.c
gcc -shared -o noise_dll.dll noise_dll.o -Wl,--out-implib,libnoise_dll.a
python 代码简单:
import ctypes
my_dll = ctypes.windll.LoadLibrary("noise_dll")
我得到上面的错误:'%1不是一个有效的Win32应用程序'
我知道DLL并不完全错误,因为如果我创建了一个客户端文件:
noise_client.c
#include <stdio.h>
#include "noise_dll.h"
int main(void)
{
hello("DLL");
return 0;
}
并使用:
构建gcc -c noise_client.c
gcc -o noise_client.exe noise_client.o -L. -lnoise_dll
我得到了一个有效的可执行文件。我对上面的代码,选项和预处理器指令中的所有内容有所了解,但是对于.dll文件和.a文件的使用方式仍然有点模糊。我知道如果删除.a文件,我仍然可以构建客户端,所以我甚至不确定它的用途是什么。我所知道的是它是多种目标文件的某种存档格式
我可以在windows / system32中找到一个普通的Windows DLL,而不会出现问题。
最后一点: 我使用64位python 3.3。我正在使用推荐的安装程序(mingw-get-inst-20120426.exe)附带的minGW tat版本。我不确定它是32位,还是重要的。
谢谢!
答案 0 :(得分:2)
使用32位python - 您的DLL可能未编译为64位代码。