Initial commit - Mold Cost Calculator Application (Security Fixed)
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
import os
|
||||
import sys
|
||||
import ctypes
|
||||
from ctypes.util import find_library
|
||||
from pathlib import Path
|
||||
|
||||
class DLLLoaderError(Exception):
|
||||
"""自定义DLL加载异常"""
|
||||
pass
|
||||
|
||||
def setup_dependencies(dll_paths=None):
|
||||
"""配置DLL搜索路径"""
|
||||
if dll_paths is None:
|
||||
dll_paths = [
|
||||
Path(__file__).parent / 'libs',
|
||||
Path(os.getenv('LOCALAPPDATA')) / 'MSYS2' / 'mingw64' / 'bin'
|
||||
]
|
||||
|
||||
os.environ['PATH'] = os.pathsep.join([
|
||||
str(p.resolve()) for p in dll_paths if p.exists()
|
||||
]) + os.pathsep + os.environ.get('PATH', '')
|
||||
|
||||
def load_dll(dll_name, mode=ctypes.DEFAULT_MODE, handle_errors=True):
|
||||
"""增强版DLL加载函数"""
|
||||
try:
|
||||
# 尝试标准加载方式
|
||||
dll = ctypes.CDLL(dll_name, mode=mode)
|
||||
print(f"✅ 成功加载 {dll_name}")
|
||||
return dll
|
||||
except OSError as e:
|
||||
if handle_errors:
|
||||
# 尝试通过PATH查找
|
||||
lib_path = find_library(dll_name)
|
||||
if lib_path:
|
||||
return ctypes.CDLL(lib_path, mode=mode)
|
||||
|
||||
# 尝试MSYS2路径
|
||||
msys_path = Path(os.getenv('LOCALAPPDATA')) / 'MSYS2' / 'mingw64' / 'bin' / dll_name
|
||||
if msys_path.exists():
|
||||
return ctypes.CDLL(str(msys_path), mode=mode)
|
||||
|
||||
# 生成详细错误报告
|
||||
path_list = os.environ.get('PATH', '').split(os.pathsep)
|
||||
raise DLLLoaderError(
|
||||
f"无法加载 {dll_name}\n"
|
||||
f"错误详情: {str(e)}\n"
|
||||
f"搜索路径:\n• " + "\n• ".join(path_list)
|
||||
)
|
||||
else:
|
||||
raise
|
||||
|
||||
# 自动配置默认路径
|
||||
try:
|
||||
setup_dependencies()
|
||||
except Exception as e:
|
||||
print(f"⚠️ 初始化依赖失败: {e}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
# 自测试代码
|
||||
try:
|
||||
test_dll = load_dll('gtk-3-0.dll')
|
||||
print(f"测试DLL句柄: {test_dll._handle}")
|
||||
except DLLLoaderError as e:
|
||||
print(f"❌ 自测试失败: {e}")
|
||||
Reference in New Issue
Block a user