【问题标题】:IAccessible: How Get value of url bar in Mozilla Firefox?IAccessible:如何在 Mozilla Firefox 中获取 url bar 的值?
【发布时间】:2014-09-12 21:47:31
【问题描述】:

我正在编写一个承诺从 url 栏获取值的代码,但现在在 IAccessible get_accValue 属性的某些参数中出现一个编译错误。那么,怎么修呢?

任何帮助将不胜感激!

这是我的代码:

uses
  oleacc;

function ffdoc: THandle;
const
  A_szClassName: array[0..6] of PChar = ('MozillaUIWindowClass','MozillaWindowClass',
  'MozillaWindowClass','MozillaWindowClass','MozillaContentWindowClass',
  'MozillaWindowClass','MozillaWindowClass');
var
  i: Integer;
begin
  Result:= 0;
  for i:= 0 to 6 do
    Result:= FindWindowEx(Result,THandle(nil),A_szClassName[i],nil);
end;

function ffurl:string;
var
  acc: IAccessible;
  pw: PWChar;
begin
  if AccessibleObjectFromWindow(ffdoc,OBJID_CLIENT,IID_IAccessible,Pointer(acc)) = 0 then
    Acc.get_accValue(CHILDID_SELF,pw);
  Result:= pw;
end;

【问题讨论】:

  • 缺乏错误检查并不是好兆头。如果编译器给出错误消息,请告诉我们它是什么。 Thandle 不是 HWND。传递 0 而不是 THandle(0)。
  • 而且我们不知道 PWChar 是什么。
  • @David Heffernan,这是返回的错误 => prntscr.com/4m8l35
  • 没有。请将其作为文本包含在问题中。
  • 您需要阅读编译器消息,然后查看您传递的参数的类型,以及函数参数的类型。第二个参数应该是 WideString。

标签: delphi delphi-xe6


【解决方案1】:

如果您查看 oleacc.IAccessible.get_accValue() 的声明,就会很明显地知道您收到错误的原因:

function Get_accValue(varChild: OleVariant; out pszValue: WideString): HResult; stdcall;

您正在尝试传递 PWChar ,其中应该是 out WideString。 Delphi 对varout 参数非常严格。

您需要更改您的 pw 变量:

function ffurl:string;
var
  acc: IAccessible;
  pw: WideString;
begin
  if AccessibleObjectFromWindow(ffdoc, OBJID_CLIENT, IID_IAccessible, acc) = 0 then
    acc.get_accValue(CHILDID_SELF, pw);
  Result := pw;
end;

COM 使用BSTR 作为它的字符串,Delphi 用WideString 包装它。因此,在将字符串传入/传出 COM 接口时,请始终使用WideString

【讨论】:

  • @Ramy Lebeau,现在编译正确!但函数ffurl返回空:(,但谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多