【问题标题】:Why did it fail ,idispatch interface which get by AccessibleObjectFromEvent.call the idispatch's member为什么会失败,通过AccessibleObjectFromEvent获取的idispatch接口。调用idispatch的成员
【发布时间】:2014-01-06 08:31:11
【问题描述】:

我得到一个ms-word的句柄,然后用AccessibleObjectFromEvent得到is的IDispatch(late bingding)。然后我想调用它的属性或方法,它失败了。

但是用c#没关系。

How to use use late binding to get excel instance?

这样的代码。

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

【问题讨论】:

  • 什么失败了?哪一行代码?错误信息是什么?
  • 除了大卫的问题,还有什么office版本?
  • @DavidHeffernan 无论 WordApp 还是 wordobject 都会引发“不支持接口”异常。 WordApplication1.ConnectTo(IDispatch(WordObject) as _Application);那么,有没有办法使用 WordApplication1.ConnectTo 连接 IDispatch?
  • @whosrdaddy 所有office 2000以上版本
  • 好的。失败在哪里?是as吗?还是在 ConnectTo 中?您需要分离出该代码来回答这个问题。

标签: delphi late-binding idispatch


【解决方案1】:

@David Heffernan 完整代码:

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?

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 2021-03-15
    • 2013-06-10
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多