我知道Delphi有一个getOleObject("word.application")可知是否有word已打开,不知VB怎么做。(50分)

B

Boblee

Unregistered / Unconfirmed
GUEST, unregistred user!
由于特殊原因,一时无法改用Delphi开发,所以想知道VB有无办法可得到内存中已存在word,
引用它来新建activedoucment。我现在的VB控件有这个问题:
1.如果先开一个word,再用我的控件在ASP页面中开一个word,在我控件关闭由控件开的word
时,不会把其它不是由控件打开的word也给关了,如果把顺序换一下,先用我的控件开一个word
,再用普通方式打开一个word,那我的控件就会把所有的word给关了而不管这个word是用什么方式
打开的。我通过任务管理器发现以上两点的不同在于:
如果先用普通方式开一个word,再用我的控件开一个word,内存中就有两个word,按我理解
就是有两个word.application.如查先用控件开一个word,再开一个普通word,内存中就只有一个
word.从中可得。用普通方式打开word时,它会先在内存中找有无已有的word.application,如果有
好就用这个word.application,随后建一个activedocument.由于我的控件在退出时会关闭整个
word.application,所以基于这个word.application的所有activedocument都会被关。
所以我想知道,为什么用普通方式打开的word能找到内存中已存在word.appliction.VB要怎么做才能
知道内存中已存在的word.application。
不知各位对这个问题有无更好的解决方法。
 
在dephi中还有一个方法是可以调用一个window的api函数findwindow。我想vb中自然也可以使用。
在delphi中FindWindow('OpusAPP',nil),第一个参数是Word主窗体的类名。具体在VB中这个函数
是什么样的形式,我在vb中看到是这样声明的
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
如果存在,返回一个不为零的整数,否则返回零。你可以试试[:D]
 
我刚刚试了一下,可以找到。程序如下:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Sub Command1_Click()
If FindWindow("opusapp", "") <> 0 Then
MsgBox "Word已经打开"
End If
End Sub

 
那现在的问题是如何在找到的窗口基础上建document,而不是新建一个application,再建
document.用FindWindow返回是一个句柄,如何转化成application对象?
 
这个就很难了,用api一般返回的是IDispatch接口,如何转换成application对象实在有些高难
[:D],我在delphi下是利用getactiveoleobject函数获得的,VB中不知有没有
 
Dfw不就是专门解决高难问题的?:)
有无解决方案?
 
在VB中用getobject函数就可以得到word的控制,其他的用word的对象模型中的
application.documents.add方法就可以根据一个模板文件新建文档,这就是你所说的,
加分吧[:D]。
 
?getobject,能得到内存中已存在的word application,语句怎么写?如果确实可用,马上给分。
 
getobject(,"word.application")即可,返回一个applicaiton对象
 
补充:
下面的程序是显示内存中存在的word的打开的word文件名
Private Sub Command1_Click()
Dim wdapp As Object
Set wdapp = GetObject(, "word.application")
MsgBox wdapp.activedocument.Name
End Sub
 
好用马上给分。:)请稍等。
 
顶部