ホームページ >バックエンド開発 >Python チュートリアル >Python で ctypes を使用して DLL をロードすると、「OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません」が表示されるのはなぜですか?

Python で ctypes を使用して DLL をロードすると、「OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません」が表示されるのはなぜですか?

DDD
DDDオリジナル
2024-12-01 13:19:09431ブラウズ

Why Am I Getting

問題:

Python で ctypes を使用して DLL をロードしようとすると、次のエラーが発生します:

OSError: [WinError 193] %1 is not a valid Win32 application

このエラーは、32 ビット アプリケーションを 64 ビット上で実行しようとすると発生しますsystem.

解決策:

根本的なエラーは ERROR_BAD_EXE_FORMAT (193, 0xC1) です。これは、Windows が実際には存在しない実行可能 (PE) イメージをロードしようとしたときに発生します。 。このエラーにはさまざまな理由が考えられます。

  1. ダウンロードが失敗したため、ファイルは不完全です。
  2. ファイルは上書きまたは破損しました。
  3. ファイル システムの問題により、ファイルが破損しました。 file.

DLL をロードする Python の特定のケースでは、LoadLibraryW が呼び出されます。 DLL 名が指定されており、DLL のアーキテクチャ (32 ビットと 64 ビット) が Python プロセスのアーキテクチャと一致しない場合にも同じエラーが発生します。プログラムを正しく実行するには、CPU アーキテクチャが一致している必要があります。

Python Context:

CTypes は LoadLibrary を使用して DLL をロードしますが、これにより同じエラーが発生する可能性があります。次に例を示します。

import ctypes
import os
dll_name = os.path.join(
    os.path.dirname(__file__),
    DLL_BASE_NAME + ("dll" if sys.platform[:3].lower() == "win" else "so"))
print(f"Attempting to load: [{dll_name}]")
dll00 = cts.CDLL(dll_name)

DLL に無効なコンテンツが含まれている場合、次のエラーが表示されます。

Traceb (most recent call last):
  File "code00.py", line 25, in <module>
    rc = main(*sys.argv[1:])
  File "code00.py", line 14, in main
    dll00 = ct.CDLL(dll_name)
  File "c:\Install\pc064\Python\Python.07.09\lib\ctypes\__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application

ボーナス:

DLL他の DLL に依存することもあるため、依存関係が満たされていない場合は同じエラーが発生する可能性があります。このエラーは、コンパイル中に DLL が別の DLL にリンクされると自動的に発生する可能性があります。

結論:

このエラーを回避するには、次のことを確認してください。

  • 64 ビット プロセスは 64 ビット DLL のみをロードします。
  • 32 ビット プロセスはのみロードします。 32 ビット DLL。

エラーが発生した場合は、依存関係からエラーが伝播する可能性があるため、関連する DLL の依存関係ツリーを確認してください。さらに、ツールを使用して DLL の依存関係を確認します。

推奨事項:

この特定のケースでは、互換性がより高い 64 ビット Python をインストールして実行します。 .

以上がPython で ctypes を使用して DLL をロードすると、「OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません」が表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。