2014-01-06 138 views
0

我得到一個ms字的句柄,然後使用AccessibleObjectFromEvent得到的是IDispatch(遲bingding)。然後我想調用它的屬性或方法,它是失敗的。爲什麼它失敗了,idispatch接口是通過AccessibleObjectFromEvent.call獲得idispatch的成員

但可以使用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 
+1

什麼故障?哪一行代碼?什麼是錯誤信息? –

+0

除了大衛的問題,什麼office版本? – whosrdaddy

+0

@DavidHeffernan 無論WordApp或wordobject都會引發「接口不支持」 異常。 WordApplication1.ConnectTo(IDispatch(WordObject)as _Application); 那麼,有沒有辦法使用WordApplication1.ConnectTo連接IDispatch? – chenybin

回答

0

@大衛赫弗南的完整代碼:

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?