.NET操作WORD经验之谈
本帖最后由 小林飞刀 于 2014-8-16 13:28 编辑问题阐述:exam.gopep.cn上传DOC文件后,执行生成图片时报错,所有生成出来的图片只有一个字母“C”。摘要:上传DOC文件后,执行生成图片时报错,Dcom权限问题,解决WORD生成不了PIC全过程解决过程:1. 首先以为是文档标签排序弄错,认真检查之下,确认文档正确。2. 于是开始怀疑程序问题,找到generate.gopep.cn的PHP端开始从头寻找根源。依次把调取exe的参数一一打印出来,没发现任何问题,PHP端也暂时正常。3. 接下来,就只有exe程序了,打开exe历史文档一看,程序执行完会正确,只是记录的图片高度只有“196px”,也就是只有一行文字“C”的高度,显然,生成PIC时,数据出错。4. 于是,开始调试.NET程序。打开CMD窗口,直接执行生成PIC,居然没报错,去历史记录查看,一切正常,图片高度是“975px”,再回到WEB端,看了刚刚生成出来的图片,也正常打印出来了。这样一来,是不是也说明.NET本身也没问题。5. 归因于此,PHP端调用参数正常,而.NET端自身也没问题。到此为止,问题变得有点意思了。两方都没问题,只能是两者发生握手时脱节。考虑到PHP与EXE之间有数据通过Redis传递,于是清空一下缓存,重启服务器。6. 重新回到WEB端测试,问题变得更有意思了,调用EXE直接返回“-2”(注:-2代表‘初始化环境出错’),现在问题更严重,.NET初始化DOC文档时报错。7. 再次回到.NET做调试。打开CMD窗口,直接执行生成PIC,居然一路下来没报错,去历史记录查看,一切正常,.Net本身还是没问题。图片也正常生成了出来。8. EXE直接执行正常,WEB端报-2,还是回到“握手”问题上,想到了两运行时使用的身份不同(注:cmd用Administrator身份,而WEB端用System身份),开始怀疑权限问题。Cmd权限正常,只有web端,于是到PHP端去对远程地址写文件,也正常,证明读写正常。9. 考虑到Microsoft对DCOM组件调用的配置有特殊要求,于是,初步确定是DCOM组件权限问题,首先在.NET里把初始化时的报错catch出来,报错信息为:System.Runtime.InteropServices.COMException(0x8000401A): Retrieving the COM class factory for component with CLSID{000209FF-0000-0000-C000-000000000046} failed due to the following error:8000401a 因为配置类型不正确,系统无法开始服务器进程。请检查用户名和密码。(Exception from HRESULT: 0x8000401A).atModifyQuestion.WordPro.get_WordApp() in D:\projects\ModifyQuestion\GenerateExamQuestion\WordPro.cs:line105atModifyQuestion.WordPro.OpenDoc(String path) inD:\projects\ModifyQuestion\GenerateExamQuestion\WordPro.cs:line 128atModifyQuestion.WordPro.InitDoc(String docPath) inD:\projects\ModifyQuestion\GenerateExamQuestion\WordPro.cs:line 561atModifyQuestion.WordPro.ProcessDoc(String questionId, Boolean isDebug) inD:\projects\ModifyQuestion\GenerateExamQuestion\WordPro.cs:line 21210. 问题显面易见了,直接进入“控制面板->管理工具->组件服务”依次打开“组件服务->计算机->我的电脑->DCOM配置”,找到“Microsoft Office Word 97 - 2003 文档”,右键“属性”,打开“标识”选项卡,选中“启动用户”,如图
打开“安全”选项卡,访问权限里选中“自定义”,编辑,对“SYSTEM”启动“本地访问,远程访问”,如图
确定保存。11.问题终于迎刃而解。
特别鸣谢:张凯宇(支持),丘文标(指导)----Janku2014/8/16
页:
[1]