Hier ist der Code, funktioniert problemlos unter XP 32bit und Win7 32bit, jedoch nicht unter Win7 64bit.
Ich habe das ganze als Beispielprojekt für Delphi 7 (inklusive debugmeldungen) angehängt.
Hier ein Codeauszug:
Delphi-Quellcode:
function GetIEFromHWND(WHandle: HWND;
var IE: IWebbrowser2): boolean;
var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
Res:HResult;
begin
{$IFDEF DEBUG}op('
GetIEFromHWND')
{$ENDIF};
Result := False;
hInst := LoadLibrary('
Oleacc.dll');
if hInst <> 0
then
begin
@ObjectFromLresult := GetProcAddress(hInst, '
ObjectFromLresult');
if @ObjectFromLresult <>
NIL then
begin
{$IFDEF DEBUG}op('
GetIEFromHWND Lib opened')
{$ENDIF};
try
MSG := RegisterWindowMessage('
WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 3000, lRes);
{$IFDEF DEBUG}op('
GetIEFromHWND after message')
{$ENDIF};
Res := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Res = S_OK
then
begin
Result := True;
if assigned(pDoc)
and assigned(pDoc.parentWindow)
then
begin
{$IFDEF DEBUG}op('
GetIEFromHWND got pdoc')
{$ENDIF};
(pDoc.parentWindow
as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
{$IFDEF DEBUG}if assigned(IE)
then op('
GetIEFromHWND got object')
else op('
GetIEFromHWND query error');
{$ENDIF};
end else
begin
{$IFDEF DEBUG}op('
pDoc Error!')
{$ENDIF};
end;
end
else
{$IFDEF DEBUG}op('
GetIEFromHWND error')
{$ENDIF};
finally
FreeLibrary(hInst);
end;
end;
end;
{$IFDEF DEBUG}op('
+GetIEFromHWND')
{$ENDIF};
end;
pDOC ist immer <> nil, die Variable IE ist <> nil unter 32 bit, jedoch NIL unter 64 bit.