VFP 请教 怎么用 GetObject 获取指定 文件名 或者 Caption的窗口对象

weixin_42519927 2018-07-11 10:43:12
从SAP上下载下来的Excel文件都是加密的 ,我用VFP Createobject 访问打开都是乱码
目前只能用ShellExcute 打开Excel文件 然后全选 拷贝 ,然后切换到 Vfp Createob( "Excel.appplication") 对象窗口粘贴
这个办法实在太麻烦了 键盘鼠标还不能动

刚刚了解到可以用 GetObject 来取得 ShellExcute 打开的加密Excel文件的窗口对象 这样可以正常
但是万一这个时候要是打开了多个 Excel ,那么GetObject 获取的对象 万一不是我刚刚ShellExcute 打开的文件怎么办

求 GetObject 详细用法 能不能解决这个问题
谢谢
...全文
369 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sych11 2018-11-06
  • 打赏
  • 举报
回复
我测试了,可以正常运行
weixin_42519927 2018-07-16
  • 打赏
  • 举报
回复
老大 您的代码 GetAllExcelObjs Function 其中省略了太多的代码 不要把我当高手 其实我就是小小白一个 把Function 中的代码 详细的贴出来呗 运行程序立刻就显示错误 找不到 m.oRet
都市夜猫 2018-07-11
  • 打赏
  • 举报
回复
以前倒是研究过这个问题,简化成一个函数如下:
*-- 测试代码
Local ii, jj
Local oCollection as Collection
Local oExcel as Excel.Application
Local oBook as Excel.Workbook

Clear
m.oCollection = GetAllExcelObjs()
If m.oCollection.Count > 0
? '找到 ' + Transform(m.oCollection.Count) + ' 个 Excel 实例:'
? '-------------------------'
For m.ii = 1 to m.oCollection.Count
m.oExcel = m.oCollection[m.ii]
? '实例 ' + Transform(m.ii) + ',打开文件数: ' + Transform(m.oExcel.Workbooks.Count)
For m.jj = 1 to m.oExcel.WorkBooks.Count
m.oBook = m.oExcel.WorkBooks(m.jj)
? ' 文件 ' + Transform(m.jj) + ': ' + m.oBook.FullName
EndFor
EndFor
Else
? '未找到任何 Excel 实例。'
EndIf
*-- end of 测试代码


*-- 函数 GetAllExcelObjs: 查找并返回所有打开的 Excel 实例对象集合
#define IID_IDispatch '{00020400-0000-0000-C000-000000000046}'
#define OBJID_NATIVEOM 0xFFFFFFF0

Function GetAllExcelObjs() as Collection
Local cIID, hExcel, hDesk, hBook, cName, nLen, oBook
Local oRet as Collection

Declare Long IIDFromString in ole32 String, String @
Declare Long FindWindowEx in win32api Long, Long, String, String
Declare Long GetClassName in win32api Long, String @, Long
Declare Long AccessibleObjectFromWindow in oleacc Long, Long, String @, Object @

m.oRet = NewObject('Collection')
m.cIID = Replicate(0h00, 16)
IIDFromString(Strconv(IID_IDispatch, 5) + 0h00, @ m.cIID)

m.hExcel = FindWindowEx(0, 0, 'XLMAIN', Null)
Do while !Empty(m.hExcel)
m.hDesk = FindWindowEx(m.hExcel, 0, 'XLDESK', Null)
If !Empty(m.hDesk)
m.hBook = FindWindowEx(m.hDesk, 0, Null, Null)
Do while !Empty(m.hBook)
m.cName = Space(256)
m.nLen = GetClassName(m.hBook, @ m.cName, 256)
If Left(m.cName, m.nLen) == 'EXCEL7'
m.oBook = Null
If 0 == AccessibleObjectFromWindow(m.hBook, OBJID_NATIVEOM, m.cIID, @ m.oBook)
m.oRet.Add(m.oBook.Application)
Exit
EndIf
EndIf
m.hBook = FindWindowEx(m.hDesk, m.hBook, Null, Null)
EndDo
EndIf
m.hExcel = FindWindowEx(0, m.hExcel, 'XLMAIN', Null)
EndDo

Return m.oRet
EndFunc

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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