首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么会失败,通过AccessibleObjectFromEvent.call获取idispatch成员的idispatch接口

为什么会失败,通过AccessibleObjectFromEvent.call获取idispatch成员的idispatch接口
EN

Stack Overflow用户
提问于 2014-01-06 16:31:12
回答 1查看 447关注 0票数 0

我获取了一个ms-word的句柄,然后使用AccessibleObjectFromEvent获取is的IDispatch(后期绑定)。然后我想调用它的属性或方法,它是失败的。

但是使用c#是可以的。

How to use use late binding to get excel instance?

代码是这样的。

代码语言:javascript
复制
function GetProperty(dispobj: IDispatch; PropertyName: widestring;
    var retvalue: IDispatch): Boolean;
var
    hr: HResult;
    DispId1: Integer;
    value: Variant;
    params: TDispParams;
begin
    Result := false;
    hr := dispobj.GetIDsOfNames(GUID_NULL, @(PropertyName), 1,
        LOCALE_SYSTEM_DEFAULT, @DispId1);
    if (hr >= 0) then begin
        hr := dispobj.Invoke(DispId1, GUID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYGET, params, @value, nil, nil);
        if (hr >= 0) then begin
            retvalue := value;
            Result := true;
        end;
    end;
end;

    hWindow := GetWordHandle(Trim(LabeledEdit1.Text));
hWindow := GetChildWndHandle(hWindow, '_WwG');
if `AccessibleObjectFromWindow`(hWindow, 0, IID_IDispatch, WordObject) = S_OK then begin
    //GetProperty(WordObject, 'Application', WordApp);
   // WordObject.GetTypeInfoCount(nCount);
    //Showmessage(IntToStr(nCount));
    //WordApplication1.ConnectTo((WordObject.Application) as _Application);
   // Showmessage(WordObject.Application.Version)
    OleCheck(WordObject.QueryInterface(IID_IDispatch, WordApp));
    WordApplication1.ConnectTo(IDispatch(WordApp) as _Application);
    Showmessage(WordApplication1.Version)
end
EN

回答 1

Stack Overflow用户

发布于 2014-01-07 22:47:42

@David Heffernan完整的代码:

代码语言:javascript
复制
procedure TMainForm.Button3Click(Sender: TObject);
var
  WordObject: IDispatch; // IDispatch;
  hWindow: hWnd;
  iWordApp: IDispatch;
  WordApp: _Application;
begin
  hWindow := GetWordHandle(Trim(LabeledEdit1.Text));
  hWindow := GetChildWndHandle(hWindow, '_WwG');
  if AccessibleObjectFromWindow(hWindow, 0, IID_IDispatch, WordObject) = S_OK
  then
  begin
    OleCheck(WordObject.QueryInterface(IID_IDispatch, iWordApp));
    WordApp :=  (iWordApp) as _Application;   // <--- interface not supported
    WordApplication1.ConnectTo(WordApp);
    Showmessage(WordApplication1.Version)
  end
end;

从C#代码转换而来。

How to use use late binding to get excel instance?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20945909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档