ctypes.windll.loadlibrary(...) を使用して Python 内にロードできる C DLL を構築しようとしています。
http://www.mingw.org/wiki/MSVC_and_MinGW_DLLsの MinGW チュートリアルに従って動作する DLL とクライアント プログラムをすべて C で作成できます。
Python 内で同じ DLL を読み込もうとすると、エラーが発生します。
OSError: [WinErrror 193] %1 is not a valid Win32 application
誰かが私が間違っていることについて何か考えを教えてもらえますか?
ファイルは次のとおりです。
ノイズ_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
ノイズ_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 ファイルを削除してもクライアントをビルドできることはわかっているので、その目的が何であるかさえわかりません。私が知っているのは、それが複数のオブジェクトファイルのある種のアーカイブ形式であることだけです
ctypes.windll.loadlibrary(...) windows/system32 にある通常の Windows DLL を問題なく実行できます。
最後のポイント: 私は 64 ビットの Python 3.3 を使用しています。推奨インストーラー (mingw-get-inst-20120426.exe) に付属の minGW tat のバージョンを使用しています。それが32ビットなのか、それが問題なのかはわかりません。
ありがとう!