single.php

PythonでctypesでDLL読込時に[有効な Win32 アプリケーションではありません。]と表示された場合の対処法

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を利用できることは便利です。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です