如何获取同名的多个实例?

changechange 2008-03-25 08:44:51
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/modcore/html/deconUsingCreateObjectGetObjectFunctions.asp

如果您要自动化的应用程序的多个实例都在运行,则无法保证 GetObject 函数将返回哪一个实例。例如,如果 Access 的两个会话正在运行,并且您通过在 Excel 中运行的代码使用 GetObject 函数来检索某个 Access 实例,则无法保证将使用哪一个 Access 实例。

很少有情况需要您使用 GetObject 函数来返回对正在运行的 Office 应用程序的实例的引用。如果用户打开了正在运行的实例,则几乎不会希望用代码操纵该应用程序实例中的对象。但是,如果使用 Shell 函数启动 Access 应用程序(以便能够提供密码和工作组信息文件来打开安全的数据库),则一定可以通过使用 GetObject 函数返回对已启动的 Access 实例的引用来处理 Access 的运行实例。




但是我现在要获取系统中所有实例名为 WORD.APPLICAITON 的实例,该如何写代码?
...全文
308 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
changechange 2008-07-11
  • 打赏
  • 举报
回复
to yinweihong

snap一下windows下面的正在运行的application不就拿到了?
http://blog.csdn.net/yinweihong/archive/2004/09/27/117687.aspx


抱歉,你给的地址是什么程序?VB6 提示“操作符 AddressOf 使用无效”


Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const SW_SHOW = 5
Public Const SW_RESTORE = 9
Public Const GW_OWNER = 4
Public Const GWL_HWNDPARENT = (-8)
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_TOOLWINDOW = &H80
Public Const WS_EX_APPWINDOW = &H40000
Public Const LB_ADDSTRING = &H180
Public Const LB_SETITEMDATA = &H19A
Public Const EWX_FORCE = 4
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1
Const MAX_PATH& = 260
Private Const SW_HIDE = 0
Private Const WM_CLOSE = &H10
Public HHWnd As Long

Public Function WhichWindowsCallBack(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim lReturn As Long
Dim lExStyle As Long
Dim bNoOwner As Boolean
Dim sWindowText As String

If hwnd <> Form1.hwnd Then
If IsWindowVisible(hwnd) Then
If GetParent(hwnd) = 0 Then
bNoOwner = (GetWindow(hwnd, GW_OWNER) = 0)
lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE)

If (((lExStyle And WS_EX_TOOLWINDOW) = 0) And bNoOwner) Or _
((lExStyle And WS_EX_APPWINDOW) And Not bNoOwner) Then

sWindowText = Space$(256)
lReturn = GetWindowText(hwnd, sWindowText, Len(sWindowText))
If lReturn Then

sWindowText = Left$(sWindowText, lReturn)
lReturn = SendMessage(lParam, LB_ADDSTRING, 0, ByVal sWindowText)
Call SendMessage(lParam, LB_SETITEMDATA, lReturn, ByVal hwnd)
End If
End If
End If
End If
End If
HHWnd = hwnd
WhichWindowsCallBack = True
End Function

Public Function fEnumWindows(lst As ListBox) As Long
With lst
.Clear
Call EnumWindows(AddressOf WhichWindowsCallBack, .hwnd) '提示“操作符 AddressOf 使用无效”
fEnumWindows = .ListCount
End With
End Function
Private Sub Form_Load()
Call fEnumWindows(List1)
End Sub

changechange 2008-07-11
  • 打赏
  • 举报
回复
to myjian ,你试验看看吧

Private Sub Command1_Click()

Dim doc1 As New Word.Application
Dim doc2 As New Word.Application


doc1.Visible = True
doc2.Visible = True

doc1.Documents.Open "j:\mytemp\a.doc
doc2.Documents.Open "j:\mytemp\b.doc
'建立测试环境结束。

Dim wObj
Dim I As Long

Set wObj = GetObject(, "Word.Application")


For I = 1 To wObj.Documents.Count
Debug.Print wObj.Documents(I).Name
Next I

Set wObj = Nothing
End Sub
tortoisespeed 2008-05-22
  • 打赏
  • 举报
回复
可以解决这个问题的,用VB比较麻烦,需要做一个COM接口对象,但VB只是封装了这个COM接口(如类模块里的枚举),没有显露出来,所以需要DIY一个TLB类型库,两年前做的程序,我现在找不到了,找到就给你发上来,但我可以负责地告诉你,VB是可以做到的.
yinweihong 2008-05-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 changechange 的回复:]
开了四个空WORD,出现两个WINWORD.EXE进程.

运行代码,点按钮,列出了所有WORD文档的标题.

确实如豆子所说,只有一个WORD服务器,进程有多少个那是没有关系的.

不知道楼主是不是要这效果.

-------------------不是。

实际上系统中会出现多个 WINWORD.EXE 的,只是大家平时不注意,最简单的,如果两个应用程序都用 WORD.APPLICATION 新建了一个对象,系统中就会出现2个 WINWORD.EXE。
[/Quote]

snap一下windows下面的正在运行的application不就拿到了?
http://blog.csdn.net/yinweihong/archive/2004/09/27/117687.aspx
changechange 2008-05-07
  • 打赏
  • 举报
回复
开了四个空WORD,出现两个WINWORD.EXE进程.

运行代码,点按钮,列出了所有WORD文档的标题.

确实如豆子所说,只有一个WORD服务器,进程有多少个那是没有关系的.

不知道楼主是不是要这效果.

-------------------不是。

实际上系统中会出现多个 WINWORD.EXE 的,只是大家平时不注意,最简单的,如果两个应用程序都用 WORD.APPLICATION 新建了一个对象,系统中就会出现2个 WINWORD.EXE。
嗷嗷叫的老马 2008-04-03
  • 打赏
  • 举报
回复
按豆子的思路,作成代码如下:

Option Explicit

Private Sub Command1_Click()
Dim wObj As Object
Dim I As Long

Set wObj = GetObject(, "Word.Application")

For I = 1 To wObj.Documents.Count
Debug.Print wObj.Documents(I).Name
Next I

Set wObj = Nothing
End Sub


开了四个空WORD,出现两个WINWORD.EXE进程.

运行代码,点按钮,列出了所有WORD文档的标题.

确实如豆子所说,只有一个WORD服务器,进程有多少个那是没有关系的.

不知道楼主是不是要这效果.
嗷嗷叫的老马 2008-04-03
  • 打赏
  • 举报
回复
还没解决?
zxl250 2008-04-02
  • 打赏
  • 举报
回复
我明白楼主说的什么意思啊,我也一直被这个问题困扰啊。
GetActiveObject,假如当前正在运行多个实例,GetActiveObject只能返回一个实例,这个返回的实例又可能是我们不关注的。
其实WINWORD不论你打开多少文档都只会起一个实例,楼主在任务管理器中观察一下啊;只能正对WINWORD的话这个问题不成在啊。
嗷嗷叫的老马 2008-03-26
  • 打赏
  • 举报
回复
你是MSMVP??
嗷嗷叫的老马 2008-03-26
  • 打赏
  • 举报
回复
无语.....
changechange 2008-03-26
  • 打赏
  • 举报
回复
系统里只会有一个word应用程序的服务器-----------是指什么意思?可以有多个 WINWORD.EXE 实例呀?

getobject后通过word对象的documents获取所有打开的文档------------我的问题是“如何获取同名的多个实例?”不是要打开文档。
chxljtt 2008-03-26
  • 打赏
  • 举报
回复
路過幫頂
supergreenbean 2008-03-25
  • 打赏
  • 举报
回复
系统里只会有一个word应用程序的服务器,getobject后通过word对象的documents获取所有打开的文档
changechange 2008-03-25
  • 打赏
  • 举报
回复
枚举进程--------怎么个枚举法?有代码么?
changechange 2008-03-25
  • 打赏
  • 举报
回复
枚举正在运行的的实例。-------怎么个枚举法?有代码么?
CathySun118 2008-03-25
  • 打赏
  • 举报
回复
枚举进程
嗷嗷叫的老马 2008-03-25
  • 打赏
  • 举报
回复
路过帮顶
东方之珠 2008-03-25
  • 打赏
  • 举报
回复
枚举正在运行的的实例。

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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