6c0d5a4e63
- Flask-based mold cost calculation application - PostgreSQL database with SQLAlchemy ORM - Docker/Podman containerization - Comprehensive documentation in docs/ - Clean, organized codebase without obsolete files - Production-ready deployment configuration - Enhanced pytest configuration with coverage reporting - Master/Development branch structure
65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
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}")
|