C#生成注册COM+,可由PHP调用【自己解决 科普+散分】

APM60- 2013-04-09 03:24:40
先交代下背景。需要实现类似邮箱附件预览的功能,不能把文档传到第3放网站。服务器后台PHP,系统XP。

我就想用C#通过调用office组件来实现文档转换,再由PHP来触发。
参考了这上面的资料http://it.chinawin.net/softwaredev/article-1b87e.html

using System;
using System.Runtime.InteropServices;namespace ComLibrary {
[Guid("2BF6AD68-C374-4877-AB19-B523AC1148AD")]
public interface ITest {
[DispId(0)]
string GetGuid();
[DispId(1)]
string About();
[DispId(2)]
int Add(int a, int b);
} [Guid("585AC64C-53ED-4be8-A4F7-90397D676443")]
public class Test : ITest {
public string GetGuid() {
return System.Guid.NewGuid().ToString();
} public string About() {
return "Hello higkoo !";
} public int Add(int a, int b) {
return a + b; }
}

生成dll并注册。
注册方式:regsvr32 ComLibrary.dll /s

<?php
$c= new COM("ComLibrary.Test");
echo $c->About();
?>

PHP调用,以上都正常。
本机PHP环境为XMAPP。

然后我再加上文档转换的代码
我用的office2007,其中
using MSWord = Microsoft.Office.Interop.Word;

try
{
MSWord.ApplicationClass word = new MSWord.ApplicationClass();
Type wordType = word.GetType();
MSWord.Documents docs = word.Documents;
Type docsType = docs.GetType();
strMsg += "-打开文档" + docsType.ToString();
MSWord.Document doc = (MSWord.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] { wordFilePath, true, true });
Type docType = doc.GetType();
strMsg += "-另存文档" + docType.ToString();
docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod,
null, doc, new object[] { htmlFilePath, MSWord.WdSaveFormat.wdFormatFilteredHTML });
strMsg += "-退出WORD";
wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, word, null);
strMsg += "-转换成功";
}
catch (Exception ex)
{
strMsg += @"--错误信息:" + ex.Message;
}
finally
{
//最后关闭打开的winword 进程
Process[] myProcesses = Process.GetProcessesByName("WINWORD");
foreach (Process myProcess in myProcesses)
{
myProcess.Kill();
}
}
// 记录日志
strMsg += "--文档路径:" + wordFilePath + "--时间:" +DateTime.Now.ToString() + "\r\n";
using (var writer = new StreamWriter(logFilePath, true, Encoding.UTF8))
{
writer.Write(strMsg);
}

生成的dll在被其他winform程序调用时,能够正常转换文档。

但是用PHP调用时,就会出错。
在保存的日志里发现,在打开文档这一步出错了。

怀疑的几个可能出现错误的原因:
1、调用该dll再引用office组件时出错。但如果是这样的话,应该在创建MSWord.ApplicationClass实例时就会出错才对。
2、word文件路径错误。但是输出日志里的word文件路径是能够找到的。
3、文件读写权限。但是日志文件能够正常写入,估计也不是权限的问题。
4、生成dll的时候犯了某些基础性的错误。头一次这么用,确实不熟悉。
实在没什么头绪了。

我还想到了一个方法,就是新建一个exe实现文档转换。
上面的dll只调用这个exe。这样的话,dll需要知道exe文件具体路径才能正确调用。
最好是一个dll能够实现,最后再考虑这个方法。

恳请各位指点一下,如何才能实现这个功能?


...全文
438 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2014-01-20
  • 打赏
  • 举报
回复
C#写COM+,强制要有.NET支持,实用度太低。
eliphe 2014-01-20
  • 打赏
  • 举报
回复
请教各位大神,MSWord.ApplicationClass是需要安装word才可以的,那么,有没有办法不调用word,也可以编辑word文件呢?
  • 打赏
  • 举报
回复
引用 楼主 slowhand 的回复:
我还想到了一个方法,就是新建一个exe实现文档转换。 上面的dll只调用这个exe。这样的话,dll需要知道exe文件具体路径才能正确调用。 最好是一个dll能够实现,最后再考虑这个方法。 恳请各位指点一下,如何才能实现这个功能?
如果有一个桌面程序(或者是window service服务程序但是“为了能让其有权限操作Office”而启用“允许与桌面交互”模式),那么你的web服务程序可以与之进行进程间通讯。 进程间通讯有许多方式,例如你可以在你的桌面程序中写上两、三行代码监听udp请求,并返回处理结果。也可以采用命名管道方式。也可以采用共享内存方式。等等。这些方式都能实现高效率地“一问一答”式的服务,你的桌面程序是服务,你的php程序是客户。
emailtome 2014-01-18
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/04za0hca(v=vs.110).aspx regsvcs /appname:myTargetApp myTest.dll
Regan-lin 2014-01-18
  • 打赏
  • 举报
回复
没人回答也很正常,不是个个都有这方面的解决方案,我以前提问的也几乎很少人问津
  • 打赏
  • 举报
回复
日志能够写入,不代表着就有权限操作Office。
弱水垂钓 2014-01-18
  • 打赏
  • 举报
回复
emailtome 2014-01-18
  • 打赏
  • 举报
回复
regasm assembly.dll /codebase
  • 打赏
  • 举报
回复
我是来看解决方案的。
碼上道 2014-01-18
  • 打赏
  • 举报
回复
赞同楼主的解决问题的方式。
江湖评谈 2014-01-18
  • 打赏
  • 举报
回复
不错,楼主有潜力
本拉灯 2014-01-18
  • 打赏
  • 举报
回复
replace
黄大仙儿 2014-01-18
  • 打赏
  • 举报
回复
对于大神们只能仰望
APM60- 2013-04-15
  • 打赏
  • 举报
回复
自己解决 相关网址:http://blog.csdn.net/yeness/article/details/7754486 设置一下office的com组件的访问权限就好了。 难道是我提问的方式错了?每次提问都没什么回复~ 散分了(这次应该有回复的吧)

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧