求助~~~~~~~如何在ASP.NET中得到当前进程中已经运行的word程序的引用, Marshal.GetActiveObject()在winform中可以但在ASP.NET中不行

neverdown 2009-04-18 03:16:58

下面这种写法在C# WINDOWS窗体程序中可以通过,即WINFORM中可以,但在ASP.NET就会报异常

-----------------------------------------------------------------

Microsoft.Office.Interop.Word.ApplicationClass wordApp = null;
try
{
wordApp = Marshal.GetActiveObject( "Word.Application" ) as Microsoft.Office.Interop.Word.ApplicationClass;
}


-----------------------------------------------------------------
我在国外一个论坛里搜索一个帖子和我的问题差不多,帖子的地址如下:
http://www.developmentnow.com/g/16_2005_1_0_0_47728/Marshal-GetActiveObject-throws-an-exception-in-a-C-webservice-but.htm


里面有位老大好像说出了其中的原因(如下),但该帖好像最终也没有给出解决的方法,所以我就郁闷了。。。。。:(
-------------------------------------------------------
Hello,

Based on my research, GetActiveObject obtains a running instance of an
object from the running object table (ROT). Each WinStation has it's own
ROT. The interactive desktop is one WinStation and has it's own ROT and
that is where the desktop application will have registered the running
object. The ASP.NET process is running under a seperate account and exists
in a non-interactive WinStation with its own ROT. That is why it fails.

I think the only way for this to work would be to launch the third party
application process from ASP.NET so it exists in the same WinStation. Of
course the application will then not be visible and the user cannot
interact with it.
-------------------------------------------------------

请各位CSDN的大侠相助,小弟不胜感激!

另外,我们的项目需求必须“是在ASP.NET的网页中去得到当前运行的word的实例,而不是自己去new一个,new一个我们可以使用Activator.CreateInstance()成功实现了,但是Get一个当前已经运行的对象就不行”。
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hy5674482 2012-06-11
  • 打赏
  • 举报
回复
(Microsoft.Office.Interop.Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application")这样可以获取到当前word进程
shalen520 2009-11-19
  • 打赏
  • 举报
回复
1.确定服务器上有word
2.确定当前已经有了活动实例
3.确定asp.net启动账户与word启动账户相同
hansuzhi 2009-11-19
  • 打赏
  • 举报
回复
看看下面的写法, 如果有活动对象getObject,否则new:

Microsoft.Office.Interop.Excel.Application ap;
try
{
ap =(Microsoft.Office.Interop.Excel.Application)
Microsoft.VisualBasic.Interaction.GetObject(null, "Excel.Application");
}
catch
{
ap = new Microsoft.Office.Interop.Excel.Application();
}
周公 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 neverdown 的回复:]
感谢 wonsoft 的回复,但你这个帖子里是去打开了一个新的,即new了一个,但我们需要的是得到一个当前已经运行了的word的引用,而不是新打开一个。
我在提问的最后也这样说了:
-----------------------------------------------

“是在ASP.NET的网页中去得到当前运行的word的实例,而不是自己去new一个,new一个我们可以使用Activator.CreateInstance()成功实现了,但是Get一个当前已经运行的对象就不行”。


Anywa…
[/Quote]
你把运行ASP.NET系统帐号权限提升一下看看,WinForm运行的权限是比较高的,而ASP.NET运行的权限是比较低(不过我不建议你这么做,除非你觉得你们不在乎网站被黑)。
neverdown 2009-04-18
  • 打赏
  • 举报
回复
感谢 wonsoft 的回复,但你这个帖子里是去打开了一个新的,即new了一个,但我们需要的是得到一个当前已经运行了的word的引用,而不是新打开一个。
我在提问的最后也这样说了:
-----------------------------------------------

“是在ASP.NET的网页中去得到当前运行的word的实例,而不是自己去new一个,new一个我们可以使用Activator.CreateInstance()成功实现了,但是Get一个当前已经运行的对象就不行”。


Anyway, thanks for your help :)
wonsoft 2009-04-18
  • 打赏
  • 举报
回复
neverdown 2009-04-18
  • 打赏
  • 举报
回复
非常感谢 yagebu1983 的回复,就是这一步报异常啊:
Object obj = Marshal.GetActiveObject( "Word.Application" );
-------------------
你那测试可以么?

thanks
yagebu1983 2009-04-18
  • 打赏
  • 举报
回复
没看明白英文的意思。。。
反射的实例没问题,可能方法没有,
你单步调试试试。。

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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