Dav*_*ens 8 vba ole adodb powerpoint-vba
我正在开发一个应用程序,它打开并读取以前嵌入PowerPoint演示文稿或Word文档中的XML文档.为了读取这个对象(xmlFile as Object),我必须这样做:
xmlFile.OLEFormat.DoVerb 1
这将打开包对象,我有另一个子例程,它获取Notepad.exe的打开实例,并将其内容读入ADODB流.
Google文档中提供了此过程的示例:
在此过程中,Notepad.exe会在几秒钟内获得焦点,并且无意中击键可能会导致意外结果或读取XML数据时出错.
我正在寻找两件事之一:
MouseKeyboardTest,在下面的子程序中不控制用户机器的东西.要么,对于#1:这是我发现的功能,我对它的使用持怀疑态度.我担心对用户系统进行这种控制.##我可以使用其他任何方法吗?##
Private Declare Function BlockInput Lib "USER32.dll" (ByVal fBlockIt As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub MouseKeyboardTest() 'both keyboard and mouse blocked
BlockInput True ' Turns off Keyboard and Mouse
' Routine goes here
Sleep 5000 ' Optional coding
BlockInput False ' Turns on Keyboard and Mouse
End Sub
Run Code Online (Sandbox Code Playgroud)
对于#2:一些背景,但问题似乎是无法使用除以外的任何方法可靠地提取嵌入对象DoVerb 1.由于我正在处理一个不受我的VBA技能影响的应用程序(记事本)中未保存的文档,这似乎是唯一的方法.完整的背景,在这里:
我的理解是,您首先可以控制 XML 文件如何嵌入到 PowerPoint 演示文稿中。在这里我不太明白为什么你选择将所需的数据保留为嵌入对象的内容。
可以肯定的是,取回这些内容的任务并不是小菜一碟。实际上,只要没有(简单甚至中等难度)方法从 VBA 调用QueryInterface和使用IPersist*接口,就只有一种方法来获取嵌入对象的内容。该方法包括以下步骤:
OLEFormat.DoVerb 1是那个。更好的方法是致电OLEFormat.Activate,但这与您的特定问题无关。Notepad.exe没有公开这样的编程模型,并且您采取了WinAPI可用的最佳选择。不幸的是,您当前的方法至少有两个缺陷:
notepad.exe导致用户干扰的可能性)。.txt文件的程序而不是notepad.exe,那么您的方法就注定失败。如果您确实可以控制嵌入对象的创建方式,那么更好的方法是将 XML 数据存储在Shape对象的某些属性中。我会使用(使用起来非常简单;如果您将其导出为 HTML 或有一些不同的重要场景,则Shape.AlternativeText不应使用)或(这可能是该任务在语义上最正确的)。.pptmAlternativeTextShape.Tags