Visual Studioなどで作成したWin32 DLL Dynamic Link LibraryをPythonで呼び出す際に”例外が発生しました:OSError [WinError 193] %1 は有効な Win32 アプリケーションではありません。”が表示された場合の対処法を紹介します。
ctypesのインストール
外部モジュールを取り扱うためのライブラリとしてctypesが必要になります。Python 3がインストールされている場合、既定値でctypesはインストールされているので問題ないですが、pipコマンドを使ってctypesをインストールすることができます。
例外が発生しました:有効な Win32 アプリケーションではありません
Visual Studioなどで作成したWindows DLLをPythonのctypesライブラリで呼び出した際に”例外が発生しました:OSError [WinError 193] %1 は有効な Win32 アプリケーションではありません。”が表示される場合があります。
PythonとDLLのアーキテクチャーを一致させる
Win32という言葉が紛らわしいですが、実行するPythonとDLLのアーキテクチャーが異なることが原因です。
アーキテクチャーは、オペレーティングシステムやアプリケーションでx86とかx64と呼ばれる部分です。
Python3をインストールする場合、だいたいx64版が選択されます。Visual StudioでDLLをビルドする場合、既定値ではx86になっているので、x64アーキテクチャーのPython3で、x86のDLLを実行しようとするために、エラーになります。
ビルドするDLLをx64に変更することで改善することができます。
具体的にはVisual Studioで次のような操作を行います。
1. Visual Studioで[ビルド|構成マネージャー]メニューを選択します。
2. 表示された[構成マネージャー]画面で[アクティブ ソリューション プラットフォーム]の一覧から[x64]を選択して[閉じる]をクリックします。
3.[ビルド|ソリューションのビルド]メニューを選択して、DLLを再ビルトします。
再度PythonでDLLを呼び出し、”例外が発生しました:OSError [WinError 193] %1 は有効な Win32 アプリケーションではありません。”エラーが表示されなければ修正が完了です。
まとめ
Visual Studioなどで作成したWindows DLLをPythonのctypesライブラリで呼び出した際に”例外が発生しました:OSError [WinError 193] %1 は有効な Win32 アプリケーションではありません。”が表示された場合には、実行するPythonとDLLのアーキテクチャーを一致させることで対処することができます。
具体的には、Visual Studioの[構成マネージャー]画面で[アクティブ ソリューション プラットフォーム]で実行するPythonのアーキテクチャーと一致させます。(例えばx64版のPython3を実行する場合にはx64に設定)
Windowsのネイティブな機能を利用する場合は、PythonよりもWin32 DLLの方が高速で高度な操作をすることができるので、DLLを利用できることは便利です。
スポンサーリンク
最後までご覧いただき、ありがとうございます。