Java调用PowerDesigner创建OOM模型报0x80990101错误如何解决
问题排查及解决步骤
错误码0x80990101是PowerDesigner OLE接口的专属错误,本质是接口调用上下文没有关联到有效模型实例,或者接口初始化时权限/环境不匹配导致模型创建后没有被OLE上下文捕获,可按以下顺序排查解决:
一、基础环境校验
- 确认PowerDesigner版本与Java代理的适配性:32位PowerDesigner必须搭配32位JDK,64位PowerDesigner必须搭配64位JDK,位数不匹配会导致OLE调用时COM对象初始化异常,创建的模型实例无法被代理捕获
- 确认当前Windows用户对PowerDesigner安装目录、临时目录有读写权限,先手动打开PowerDesigner创建一个OOM模型确认无弹窗提示(比如激活提示、用户协议提示),后台运行OLE接口时这些弹窗会阻塞模型创建流程
- 检查PowerDesigner的COM组件是否正常注册:以管理员身份运行cmd,执行
regsvr32 "你的PowerDesigner安装路径\PdShell170.dll"(版本号对应你的PD版本,比如16.5是PdShell165.dll),提示注册成功后再重试
二、代码逻辑排查
- 调用
CreateModel前必须先初始化PD应用实例,且需要显式设置应用可见性为true(部分版本PD后台运行时会禁用模型创建接口),正确初始化逻辑参考:
// 初始化PD应用实例 Application pdApp = new Application(); pdApp.setVisible(true); // 显式指定模型类型为OOM,第二个参数是模型名称,不要留空 Model oomModel = pdApp.CreateModel(PdCommon.ModelType.pdmOOM, "TestOOM");
- 不要复用之前销毁过的PD应用实例,每次调用前先判断
pdApp是否为null、是否已退出,如果是要重新初始化 - 检查是否在调用
CreateModel前误执行了Close类方法,导致活动上下文被清空
三、异常兼容兜底方案
如果上述步骤都确认正常还是报错,可以采用先创建空白模型再激活的兜底方案:
- 先调用
pdApp.NewModel()创建默认模型,再强制转换为OOM类型,设置对应的模型属性 - 调用
pdApp.getActiveModel()显式绑定活动模型后再执行后续操作,参考代码:
pdApp.NewModel(); Model activeModel = pdApp.getActiveModel(); if(activeModel == null) { throw new RuntimeException("模型创建失败,PD未返回活动模型实例"); } // 手动设置模型类型为OOM activeModel.setType(PdCommon.ModelType.pdmOOM);
四、常见坑点规避
- 不要在Citrix/远程桌面环境下调用PD OLE接口,会话隔离会导致COM对象无法正常创建
- 不要同时运行多个PD实例,OLE接口默认会绑定第一个启动的PD实例,如果之前有异常退出的PD残留进程,先到任务管理器杀掉所有
pd.exe进程再重试 - JVM参数不要加
-Djava.awt.headless=true,SWT依赖的COM交互需要图形上下文支持
内容的提问来源于stack exchange,提问作者Darla
相关产品推荐
相关产品推荐

