5

Python の C-Types を使用して、kernel32 ライブラリで GetModuleHandleA を呼び出そうとしています。ライブラリへのハンドルを取得して、それを使用して LoadLibraryA の GetProcAddress を呼び出したいと考えています。以下は私のコードです...

import sys
from ctypes

kernel32 = windll.kernel32
print("The kernel32 is %s" % kernel32)
#The kernel32 is <WinDLL 'kernel32', handle 765b0000 at 1c2a9f0>

h_kernel32 = kernel32.GetModuleHandleA("C:\\Windows\\System32\\kernel32.dll")
if h_kernel32 == False:
        error = GetLastError()
        print("ERROR: %d - %s" % (error, FormatError(error)))

「エラー: 126 - 指定されたモジュールが見つかりませんでした」というエラーが表示されます。「C:/Windows/System32/kernel32.dll」と「kernel32」だけも試しました。私は Python 3.2 を使用しており、これは Windows 7 マシン上にあります。dll がそこにあり、上記のコードで設定したパスにあることを確認しました。私はいくつかの調査を行ってきましたが、問題が何であるかを見つけることができないようです。どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

7

ハンドルは に格納されkernel32._handleます。呼び出しGetModuleHandleは同じ値を返す必要がありますが、型の安全性のために [*]を設定restypeしてください:argtypes

import ctypes
from ctypes import wintypes

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

kernel32.GetModuleHandleW.restype = wintypes.HMODULE
kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR]

hMod = kernel32.GetModuleHandleW('kernel32.dll')

「A」ではなく「W」サフィックスに注意してください。Python 3 は、ctypes がc_wchar_p( LPCWSTR) を作成する Unicode 文字列を使用します。[A]NSI バージョンを呼び出す理由はありません。[W]ide 文字列バージョンの単なるラッパーであるためです。ただし、必要な場合は、バイトを使用する必要があります。

kernel32.GetModuleHandleA.restype = wintypes.HMODULE
kernel32.GetModuleHandleA.argtypes = [wintypes.LPCSTR]

hMod = kernel32.GetModuleHandleA(b'kernel32.dll')

[*]kernel32 = WinDLL('kernel32', use_last_error=True)の代わりに使用することをお勧めしwindll.kernel32ます。これにより、 を使用する他のモジュールとの競合が回避されますwindll。また、スレッドの保護も有効にしますLastErrorValue。この場合、WinAPIとを直接呼び出す代わりにctypes.get_last_error()とを使用します。ctypes.set_last_error(err)GetLastErrorSetLastError

于 2013-06-10T23:02:51.240 に答える