diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index 94197e4..5a29087 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -620,6 +620,16 @@ def _ExtractCDefineConstantsFromPyi(pyi_path: str, all_dc: dict[str, object]) -> if isinstance(node, ast.AnnAssign) and isinstance(node.target, ast.Name): if AnnotationContainsName(node.annotation, 'CDefine') and node.value: val: object = ConstEvaluator.eval_full(node.value, ctx) + if val is None and isinstance(node.value, ast.Call) and len(node.value.args) == 1: + # 类型构造的**裸别名**形态(如 `DWORD(-11)`,非 `t.CUnsignedLong(-11)`): + # eval_full 只认 `t.X(...)` / `from t import X`(见 ConstEvaluator + # _eval_compile_time_call),裸 typedef 别名既不在 _t_module 也不在 + # mock ctx 的 _t_type_symbols 里 → 返回 None → 该常量被整条丢弃。 + # 现场:win32file.vp 的 STD_INPUT/OUTPUT/ERROR_HANDLE 是全仓**唯一**用 + # 别名构造写的 define → 唯独这三个进不了 _all_define_constants,导致 + # 模块属性访问 `wf.STD_ERROR_HANDLE` 解析落空、退化成未定义的全局符号 + # (链接失败)。CDefine 关心的是常量值,故回退求值其唯一实参(位型一致)。 + val = ConstEvaluator.eval_full(node.value.args[0], ctx) if val is not None and isinstance(val, (int, float, str)): all_dc[node.target.id] = val except Exception as e: