主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

向下

关于OLE-Automation(早期绑定)的问题 找到类似的分支


kimblch   (2002-04-10 02:29) [0]

如何判断Word是否正在运行,以及如何在程序执行期间关闭Word时捕获这种情况,我以前使用后期绑定所有内容...但我在这里找不到任何东西,告诉我



Дмитрий Орехов   (2002-04-10 06:56) [1]

如果不是VarIsEmpty(XLApp)那么
我有这个用于Excel,但我认为原理是一样的。 XLApp是一个Varint类型变量。
XLApp:= CreateOleObject(“Excel.Application”);



kimblch   (2002-04-10 11:16) [2]

>德米特里
所以事情的事实........据我所知,然后你把它带到了一个后期绑定(CreatOleObject)...用它你可以使用函数GetActiveOleObject(“Word”)(在try的上下文中除外)你可以。 ..当我将AutoConnect = True属性设置为此组件时,我使用TWordApplication类型的变量的早期绑定(来自Servers选项卡),Word在应用程序启动时自动启动,用户可以在应用程序运行时和尝试访问Verde时关闭Word RPC服务器没有响应(Word已关闭)所以这个问题出现了...... neo 每次尝试转向Verde检查它是否正在运行........
谁可以建议......有用的东西



Fantasist   (2002-04-10 22:28) [3]


>所以事情的事实........据我所知你带来的
>这是后期绑定(CreatOleObject)......用它
>您可以使用GetActiveOleObject(“Word”)函数(In
>上下文,尝试除了),你可以...我使用早期的
>我有一个TWordApplication类型的变量的绑定(其中
>从“服务器”选项卡中)为此组件设置属性时
> AutoConnect = True会在应用程序启动时自动启动
> Word,用户可以在应用程序运行时关闭应用程序。
> Word,当试图转向Verda时,会发出相应的信息
> RPC服务器没有响应(Word已关闭)所以这个问题
每当你试图访问佛得角时,都必须出现
>检查它是否正在运行........
>谁可以建议......有用的东西


这不是早期约束。 早期绑定在编译时使用类型库中可用的类型信息进行绑定。 TWordApplication通过CreateComObject创建Word应用程序。 唯一的问题是他不使用IDispatch。 虽然不确定。
一般来说,那里必须有一些财产。 您可以使用GetActiveObject - 最有可能的是,在任何情况下都使用此函数。 虽然可以使用带事件的变体 - 但Word肯定会返回一个结束事件。 在创建“获取窗口的手柄然后检查它”之后,您甚至可以变态。



Fantasist   (2002-04-10 22:31) [4]

顺便说一下,正如我所说,OLE-Automatation定义为后期绑定。



kull   (2002-04-10 23:17) [5]


>如果不是VarIsEmpty(XLApp)那么

如果Word处理关闭,那些家伙将无济于事。
该链接将保留在变量中......



kimblch   (2002-04-11 02:55) [6]

2很棒
根据定义,Ole-Automation只是简单地捆绑....它已经可能已经迟到或早了......可能就是这样
顺便说一下,IDispatch类型的函数CreateOleObject(),以及使用另一种类型的变量进行早期绑定,例如,类型为TWordApplication的组件.... 在编译时,创建了一个类,其中包含有关自动化服务器对象的所有信息(接口,可用方法和属性的描述)..尽可能多的你可以做



Fantasist   (2002-04-11 08:51) [7]


>根据定义,Ole-Automation只是捆绑....已经
>可能是迟到或早......可能就是这样


不,可能不完全相同。 :)自动化技术基于使用IDispatch和Variant类型的变量。

这是早期绑定(使用FlashPlayer时):
VAR
sh:TShockwavePlayer;
开始
sh:= TShokwavePlayer.Create;
sh.LoadMovie(5,“url”);
sh.Play;
结束;

后来:
VAR
sh:变体;
开始
sh:= CreateOleObject(“Tut ProgID Shockwave”a“);
sh.LoadMovie(5,“url”);
sh.Play;
结束;

在第二个变体中,编译器不知道将创建该对象。 在第一个 - 知道,从TypeLib收到信息。






kimblch   (2002-04-11 09:06) [8]

2幻想家
它不再有趣.........
我已经不明白我们哪个是傻的.....在哪里
你写的是什么(不同类型的绑定的例子)我同意一切都是正确的只有CreateOleObject()有IDispatch类型,无论你怎么说(你不能相信在Delphi中点击F1)..........和CreateOleObject()是后来的绑定(对象是在应用程序执行期间创建的,在编译时我们不知道它的方法)如果我错误地解释我的逻辑已破解的地方.....
顺便说一句,在自动化中除了“IDispatch和Variant类型的变量”之外,还有vTAble接口(如果选择)。
PS:顺便说一句,我在你的例子中使用方法号XXUMX ......所以我想知道如何解决我的问题




REA   (2002-04-11 10:53) [9]

当我编写服务器客户端时,我没有想到如何立即跟踪它并在Try Except中结束所有功能



Romkin   (2002-04-11 11:07) [10]

在本地服务器的情况下,连接在任何情况下都使用IDispatch,在导入类型库的情况下,只是在编译阶段检查调用,并且没有调用GetIDsOfNames(仅调用)
因此,我们大胆地连接到运行的单词:

var
A: IDispatch;
AServer: _Application

A := GetActiveOLEObject(...
AServer := A as _Application; //или просто _Application(A);
WordServer.ConnectTo(AServer);

但要弄清楚服务器是否关闭是非常困难的,恕我直言不可能。 只是在访问时抛出异常。
因此,它可以在连接后立即隐藏单词,并仅在完成后显示它吗? 第二种方法是使用TOleContainer,并在您的应用程序中显示Word。



Севостьянов Игорь   (2002-04-11 11:09) [11]

原则上,我的答案来自假设领域,因为 没试过,但......

Word是否处于活动状态 - 如何找到指向窗口或进程的指针(如何 FindWindow, EnumThreadWindows, EnumWindows and etc)?

Word闭包 - 如何捕获消息 WM_CLOSE,WM_DESTROY,WM_NCDESTROY 对于这个窗口......( PeekMessage(Msg, hWnd, 0, 0, PM_REMOVE), GetMessage())
而且
DWORD WaitForSingleObject(
HANDLE hHandle, // handle of object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);


关于肥皂的问题......



Art_east   (2002-04-11 11:50) [12]

2kimblch
如果您使用TWordApplication,那么您可以通过事件TWordApplication.OnQuit捕获关闭Word“和用户可以使用的情况。这里Word有点流氓,因为它有一个来自您的程序的链接,因此它的RefCount> 0,因此它应该去不可见(例如像Excel一样),但不会以任何方式销毁。但是因为它仍然被销毁,所以你可以在这个事件中注册WordApplication1.Disconnect,以摆脱不存在的接口的链接 VA。
要检查Word是否正在运行,您可以
函数GetWord:IUnknown;
开始
如果没有成功(GetActiveObject(ProgIDToClassID(“Word.Application”),nil,Result))那么
结果:= CreateComObject(ProgIDToClassID(“Word.Application”));
WordApplication1.ConnectTo((pUnk as _Application));
结束

WordApplication1.ConnectTo((GetWord as _Application));

这实际上使用ConnectKind = ckRunningOrNew在Connect方法中生成TWordApplication



Севостьянов Игорь   (2002-04-11 13:01) [13]

是的,似乎Art_east(11.04.02 11:50)是正确的,这将是问题的最佳解决方案
好运



serg   (2002-04-11 13:36) [14]

我不明白的东西......
为什么不使用TWordApplication.OnQuit?



Fantasist   (2002-04-11 21:09) [15]


> ......这里我想知道如何解决我的问题


哈!
我在第一次发帖时提出了三种方法:

1。 处理来自Word的消息。
2。 使用GetActiveObject。
3。 在创建Word处理时将其处理为“a”并继续围绕它处理。



Fantasist   (2002-04-11 22:47) [16]


>我已经不明白我们哪个是笨蛋.....在哪里
>你写的(不同类型的绑定的例子)我同意
>一切都正确,只有CreateOleObject()属于IDispatch类型
>无论你怎么说(你不能相信它,点击Delphi中的F1).......... a
> CreateOleObject()是一个后期绑定(创建一个对象
>在运行时和编译时我们
>如果我说的不对,那就不知道他的方法了
>我的逻辑裂缝在哪里.....
>顺便说一下,在自动化中还有一个接口vTAble(如果选择)
>“IDispatch和Variant类型的变量。”


所以,有趣的是,让我们看看。
什么是早期和晚期绑定? 我们这样定义:
*早期绑定是通过vtable进行的方法调用。
*稍后通过IDispatch :: GetIDsOfNames()和IDispatch :: Invoke()调用方法

似乎不是撒谎。 现在让我们专门登上Word2000.pas。
连接方式:

var
punk: IUnknown;
begin
if FIntf = nil then
begin
punk := GetServer;
ConnectEvents(punk);
Fintf:= punk as _Application;
end;
end;

调用TOleServer.GetServer并以这种方式创建它:


if not Succeeded(GetActiveObject(FServerData^.ClassId, nil, Result)) then
Result := CreateComObject(FServerData^.ClassId);


(顺便说一下,正如我所建议的那样使用GetActiveObject)
Aga。我们得到IUnknown并将其转换为_Application,这是一个双接口。 然后使用这个接口调用TWordApplication方法,它意味着通过vtable,然后根据上面的协议(Columbur :)仍然有一个绑定,我错了。 差不多。 对于TWordApplicationProperties,将此接口转换为IDsipatch(通过OleVariant)并使用它。 所以我们有两种绑定方式。

Vtable作为接口是指COM的概念。 Automatation是一种使用COM的技术,因此您无需将它们混合使用。 虽然我不会在这里发言,但出于某种原因,COM中的术语有点明确。 在我看来,Automataion正是基于IDispatch和Variant的使用。 但也许某个地方这个词的理解方式不同,或者应该区别对待。

还有一件事。 当你这样做:

var
Word:TWordApplication;
begin
Word:=TWordApplication.Create;
end;

您创建一个类的Pascal(Delphi)实例,但不是COM对象。 COM类对象已在此类中创建,您对其创建没有任何影响,并且不会影响它。 我在第一个例子(与ShockWave)中展示的完全不同。



kimblch   (2002-04-12 02:57) [17]

2Art_east
试图制作你的方法

>function GetWord: IUnknown;
>begin
> if not Succeeded(GetActiveObject(ProgIDToClassID
>("Word.Application"), nil, Result)) then
> Result := CreateComObject(ProgIDToClassID
>("Word.Application"));
> WrdApp.ConnectTo((pUnk as _Application));
>end;

只有这里delph5发誓GetActiveObject找不到这样的功能帮助也是沉默的
请告诉我有什么问题....什么模块没有注册(ComObj已注册)



kimblch   (2002-04-12 03:48) [18]

可能只有我可以这样做.......
写道.....很难理解它是什么。 所以这垃圾也有效...... :)
简而言之,在调用verde之前,我调用了GetWord(); 并且vord是否启动并不重要

procedure GetWord();
begin
try
wrdApp.ConnectTo(wrdApp.Application as _Application);
except
MainForm.FormCreate(MainForm);
end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
wrdApp:=TWordApplication.Create(Self);
with wrdApp do
begin
ConnectKind := ckRunningOrNew;
AutoConnect := True;
AutoQuit := False;
Visible:=True;
end;
end;


这里的问题这样做是正确的....是否会释放内存......任何故障都无法工作......(否则所有对象都是类,我只是在这里混淆)



Art_east   (2002-04-12 15:53) [19]

2kimblch
关于你的消息(12.04.02 02:57): GetActiveObject 位于ActiveX模块中。
关于示例(12.04.02 03:48),会发生以下情况:
当你打电话 wrdApp.ConnectTo(wrdApp.Application as _Application); 当用户在工作时关闭Word时,“e,然后调用该方法 _Application.Get_Application (参见Word97.pas或Word2000.pas,它们位于ProgramFiles \ Borland \ Delphi5 \ Ocx \ Servers), _Application (这是通过它的界面 TWordApplication 与“om”字交流不再存在,你遇到了崩溃,你就去了 FormCreate 在哪里重新创建现有的 wrdApp。 如果你不介意额外的exeptn和新的创建 TWordApplication 每次你转向Word“,然后至少写入 Except wrdApp.Free 在前面 FormCreate 所以内存不会混乱,但是你永远不会知道什么,突然它会派上用场:)
虽然在我看来我的选择更加优化,但他们说主人是主人
祝你好运



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.04.25;
下载:[xml.tar.bz2];

楼上





内存:0.65 MB
时间:0.031 c
7-81095
ThaDrot
2001-12-24 19:23
2002.04.25
快速下载


6-81015
数据擦除
2002-02-12 13:01
2002.04.25
如何做到最好


3-80776
Labert
2002-04-04 13:19
2002.04.25
TQuery.Filter不起作用


14-81033
VuDZ
2002-03-18 15:43
2002.04.25
经济学中的神经网络


1-80886
初学者
2002-04-14 03:31
2002.04.25
屏幕上输出的实数





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский