마침내이 문제의 해결 방법을 찾았습니다. 외부 라이브러리를로드 한 후 EnumProcessModules
을 사용하여로드 된 모듈을 열거하고 GetModuleFileName
을 사용하여 파일 이름을 확인한 다음 올바른 모듈을 참조하고이 런타임에서 free()
-function을로드하십시오.
다음과 같이 내가이 일을 사용하고 코드는 다음과 같습니다
from ctypes import *
def enumProcessModules():
# Get handle of current process
kernel32 = windll.kernel32
kernel32.GetCurrentProcess.restype = c_void_p
hProcess = kernel32.GetCurrentProcess()
# Load EnumProcessModules either from kernel32.dll or psapi.dll
try:
EnumProcessModulesProc = windll.psapi.EnumProcessModules
except AttributeError:
EnumProcessModulesProc = windll.kernel32.EnumProcessModules
EnumProcessModulesProc.restype = c_bool
EnumProcessModulesProc.argtypes = [c_void_p, POINTER(c_void_p), c_ulong, POINTER(c_ulong)]
hProcess = kernel32.GetCurrentProcess()
hMods = (c_void_p * 1024)()
cbNeeded = c_ulong()
if EnumProcessModulesProc(hProcess, hMods, sizeof(hMods), byref(cbNeeded)):
return hMods
return None
def getLoadedModule(moduleName):
kernel32 = windll.kernel32
kernel32.GetModuleFileNameA.restype = c_ulong
kernel32.GetModuleFileNameA.argtypes = [c_void_p, c_char_p, c_ulong]
modules = enumProcessModules()
if modules is None:
return None
for module in modules:
cPath = c_char_p(' ' * 1024)
kernel32.GetModuleFileNameA(module, cPath, c_ulong(1024))
path = cPath.value
if path.lower().endswith(moduleName):
return module
return None
올바른 런타임을로드하고 내가 위의 코드를 사용하는 free()
기능을 찾으려면 :
runtimeModuleHandle = getLoadedModule("msvcr80.dll")
runtimeModule = ctypes.CDLL('', handle = runtimeModuleHandle) # cdecl calling convention
runtimeModule.free.restype = None
runtimeModule.free.argtypes = [ctypes.c_void_p]
myFreeProc = runtimeModule.free
열심히 그것을 찾기 DLL이 당신이 DLL을 사용하는 특정 런타임에서'free'를 호출하여 해방해야하는 리소스를 여러분에게 넘겨 줄 수 있다고 믿으십시오. 그것은 옳다는 것은 매우 어렵습니다. 무료 리소스를 호출하기 위해 DLL이 루틴을 내 보내지 않았습니까? 만약 당신이 말한다면, 당신은 벤더가 그들의 디자인을 고치거나 다른 라이브러리를 찾거나 리소스를 누출시킬 필요가 있다고 생각합니다! –
@ David : 유감스럽게도 API에 의해 노출 된 무료 루틴은 없습니다. 끔찍한 일이지만 벤더가이 문제를 해결하는 데 어려움을 겪을 것입니다. 왜 그렇게 생각하는지에 대한 주된 이유는이 라이브러리가 대개 .NET 래퍼를 통해서만 노출된다는 것입니다. C++ 라이브러리는 대개 고객에게 직접 배포되지 않습니다. – larsmoa
예치! 올바르게하기위한 한 가지 방법은 활성화 컨텍스트 API를 사용하는 것입니다. 그것은 ctypes에 의해'msvcrt80'이 올바르게로드되었는지 확인하는 좋은 방법입니다. 지저분한 방법은 프로세스에서 모듈을 열거하고 올바른 것을 선택하는 것입니다! –