使用MinGW构建DLL并使用Python的ctypes模块加载它

时间:2013-05-19 00:08:05

标签: python dll mingw

我正在尝试使用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位,还是重要的。

谢谢!

1 个答案:

答案 0 :(得分:2)

使用32位python - 您的DLL可能未编译为64位代码。