窗体嵌入PowerPoint后产生的问题,难(200)

  • 主题发起人 主题发起人 叶不归
  • 开始时间 开始时间

叶不归

Unregistered / Unconfirmed
GUEST, unregistred user!
用CreateOleObject('PowerPoint.application');和SetParent将PowerPoint嵌入自己的窗口后,此时双击桌面上一个ppt文件,发现打不开。原因是PowerPoint进程只能创建一个(不像Word和Excel可以创建多个进程),在VBA中没有找到相关属性可解决该问题求解,取巧的方法也可以。
 
文件关联.ppt文件为你打开的程序,判断如果你的程序已经打开了ppt,那么就恢复Parent 1. 判断自己程序已经运行标志! (临时文件) if 运行 then begin 恢复保存的Parent; exit; end; 2. 写自己程序已经运行标志! (临时文件) 3. CreateOleObject('PowerPoint.application'); 4. 保存Parent:=PowerPoint HWnd;把这个exe关联到ppt就可以了!呵呵!
 
除了CreateOleObject,好像还有GetActiveOleObject,先get一下,得不到再creat
 
to wql:恢复parent,那我的程序里面就没有powerpoint了,这不行。请想想有没有办法启动两个powerpnt进程?
 
如果只是你一個人開發使用該程序,最取巧的方法就是安裝一個OpenOffice,在Delphi中調用或者在Windows調用,就可以空出一個PowerPoint進程
 
to forgot2002:这是个办法,可以将openoffice打包到程序中一同安装,不过我不知道openoffice是什么,而且代价也太高了。暂不考虑吧。我还是想知道powerpoint判断进程已启动的原理是什么,有没有办法改变它的已启动标识,从而实现启动powerpoint多个进程。
 
先给别人用好了,再恢复你的ppt啊!
 
先给别人用是啥意思?启动我的程序后,别人根本就不能打开PPT了
 
系统为每一个活动的 COM 对象建立一个活动对象表,当创建一个 COM 对象实例的时候,系统(或者叫 COM)根据 COM 注册的运行类型(单线程、多线程等等)来决定是否重新创建一个新的实例,还是复用已有的实例并转换运行模式。假如一个实例已经创建,就可以通过 GetActiveOleObject 来获得这个实例,不管你如何创建,理论上只有这个实例在运行,每一次连接,在系统中只是增加了一个引用计数。我看到这个问题的时候,特意运行了一下 Office 里的 PPT,打开2次后,发现任务条上其实还是出现了2个PPT标题,我不知道是否PPT就只能运行一个实例,假如只能运行一个实例,那么微软在任务条上就是做了一个假动作。微软可以做假动作,那么你也可以,甚至都不需要任何技术:设计一个全局共享内存,把PPT文件名、当前位置、窗口句柄保存在共享区,当再次运行你这个程序时,检查是否存在这个共享内存,假如存在,先通知原来的窗口释放PPT对象,然后再开启新PPT,原来窗口在放弃时,截下当前界面当作窗口画面,当发生窗口激活时再恢复PPT。或者,你是否也应该仅仅使用 GetActiveOleObject 来创建 PPT 文档呢?查下资料看看。
 
或者看看这二个函数 RegisterActiveObject 、RevokeActiveObject
 
首先谢谢小雨哥的热心回答。可能我遇到的问题没描述清楚,在此补充一下:>>用CreateOleObject('PowerPoint.application');和SetParent将PowerPoint嵌入自己的>>窗口后,此时双击桌面上一个ppt文件,发现打不开。---我的程序已经运行,并且已经将PPT嵌入到了Panel,这时,用户在程序外,双击桌面上或C盘里一个PPT文件,没有任何反应(没出现任何窗口、任务栏的任务条,甚至在嵌入到我的程序里的PPT程序的窗口下拉菜单中,也不能发现用户双击的这个PPT文件),这就是PPT和WORD/EXCEL的不同现象。就是说我的程序运行时,客户就不能正常使用PPT了。上面函数 RegisterActiveObject 、RevokeActiveObject 我会再查查是干什么,总之,之前的所有方法都是不能解决问题的。
 
代码很简单,有心人一试便知:var PptApp, PptPres: Variant; PptHandle: THandle;procedure CreatePpt;begin PptApp := CreateOleObject('PowerPoint.application'); PptHandle := FindWindow(nil, PChar(string(PptApp.Caption))); PptPres := PptApp.Presentations; PptPres.Add; PptApp.CommandBars.DisableCustomize := True; Windows.SetParent(PptHandle, Panel1.Handle); Windows.SetWindowLong(PptHandle, GWL_STYLE, GetWindowLong(PptHandle, GWL_STYLE) and WS_CHILD); Windows.MoveWindow(PptHandle, 0, 0, Panel1.Width, Panel1.Height, False); PptApp.Visible := msoTrue;end;
 
路过学习 你们继续 [:)]
 
后退
顶部