我获取了一个ms-word的句柄,然后使用AccessibleObjectFromEvent获取is的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发布于 2014-01-07 22:47:42
@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#代码转换而来。
https://stackoverflow.com/questions/20945909
复制相似问题