- Details
- Written by: Stanko Milosev
- Category: Web
- Hits: 12582
If you need to automate IE8, popup windows, then read this article
Window structure go like this:
Frame Tab,
TabWindowClass,
Shell DocObject View,
Internet Explorer_Server.
So, code would go something like this:
var
Wnd: HWND;
WndChild: HWND;
IE: iwebbrowser2;
begin
webBrowser.Quit;
try
Wnd := FindWindow('IEFrame', nil);
if Wnd = 0 then //No running instance of Internet Explorer so stop!
begin
showmessage('No Running instance of Internet Explorer');
exit;
end;
WndChild := FindWindowEX(Wnd , 0, 'Frame Tab', nil);
Wnd := FindWindowEX(WndChild, 0, 'TabWindowClass', nil);
Wnd := FindWindowEX(Wnd, 0, 'Shell DocObject View', nil);
Wnd := FindWindowEX(Wnd, 0, 'Internet Explorer_Server', nil);
if Wnd <> 0 then
begin
GetIEFromHWnd(Wnd, IE); //Get Iwebbrowser2 from Handle
Result := IE;
end;
except
on e: Exception do
ShowMessage('GetIE' + e.Message);
end;
end
function .GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
begin
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
if @ObjectFromLresult <> nil then
begin
try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Result = S_OK then
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
finally
FreeLibrary(hInst);
end;
end;
end;
I was using myCatch, to get windows structure.
This code which I left here is just to give you idea, I hope that soon I will upload example of automation IE6, IE7 and IE8...
- Details
- Written by: Stanko Milosev
- Category: Web
- Hits: 6547
One way to show user location on the google maps, in his/her default browser:
http://maps.google.com/maps?q=pot%20na%20hrese%2C+Ljubljana
Where, of course, you should put instead of:
pot%20na%20hrese%2C+Ljubljana
adress you would like to search...
- Details
- Written by: Stanko Milosev
- Category: Web
- Hits: 7706
I was using TEmbeddedWB:
EmbeddedWb1.ElementByID['username'].SetAttribute('value', 'stanko', 0)
This is if you ger error:
Exception class EOleError with message 'Method 'Name' not supported by automation object
In TEmbeddedWB.
- Details
- Written by: Stanko Milosev
- Category: Delphi
- Hits: 5280
One piece of code which is not working anymore, not sure why, problem is probably somewhere in line: MyStream.WriteBuffer(Pointer(String2BeSaved)^,Length(String2BeSaved)); but I just don't want to loose it. Originally writen by Written by G.A. Carpenter, and original you see here.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, shellapi;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
Procedure Add2File(DemarcStr,FileName,String2Add: String);
Function File2String(FileName: String):String;
Procedure String2File(String2BeSaved,FileName: String);
Procedure ExtractAndStrip(DemarcStr,FileName: String);
Procedure ExtractFromExe(DemarcStr: String; var ExtractedStr: String);
Procedure DelFromString(DemarcStr: String; var String2Change: String);
Procedure AddFile2Exe(DemarcStr,FileName: String);
private
procedure ReadExe;
Procedure Add2String(DemarcStr,String2Add: String;var String2Alter: String);
Procedure AlterExe;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
exe: String;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.ReadExe;
Var
ExeStream: TFileStream;
begin
ExeStream:=TFileStream.Create(Application.ExeName,fmOpenRead or fmShareDenyNone);
Try
SetLength(Exe, ExeStream.Size);
ExeStream.ReadBuffer(Pointer(Exe)^, ExeStream.Size);
Finally
ExeStream.Free;
end;
end;
procedure TForm1.Add2File(DemarcStr, FileName, String2Add: String);
var
MyString: String;
begin
MyString := File2String(FileName);
MyString := MyString+uppercase('so!#'+DemarcStr)+String2Add+uppercase('eo!#'+DemarcStr);
String2File(MyString,FileName);
end;
function TForm1.File2String(FileName: String): String;
var
MyStream: TMemoryStream;
MyString: String;
begin
MyStream := TMemoryStream.Create;
try
MyStream.LoadFromFile(FileName);
MyStream.Position := 0;
SetLength(MyString,MyStream.Size);
MyStream.ReadBuffer(Pointer(MyString)^,MyStream.Size);
finally
MyStream.Free;
end;
Result := MyString;
end;
procedure TForm1.String2File(String2BeSaved, FileName: String);
Var
MyStream: TMemoryStream;
begin
if String2BeSaved = '' then exit;
SetCurrentDir(ExtractFilePath(Application.ExeName));
MyStream := TMemoryStream.Create;
try
MyStream.WriteBuffer(Pointer(String2BeSaved)^,Length(String2BeSaved));
MyStream.SaveToFile(FileName);
finally
MyStream.Free;
end;
end;
procedure TForm1.ExtractAndStrip(DemarcStr, FileName: String);
Var
Temp: String;
begin
ExtractFromExe(DemarcStr,Temp);
DelFromString(DemarcStr,Exe);
String2File(Temp,FileName);
end;
procedure TForm1.ExtractFromExe(DemarcStr: String;
var ExtractedStr: String);
Var
d,e: integer;
begin
if Length(Exe) = 0 then ReadExe;
if Pos(uppercase('so!#'+DemarcStr),Exe) > 0 then
begin
d := Pos(uppercase('so!#'+DemarcStr),Exe)
+length(uppercase('so!#'+DemarcStr));
e := Pos(uppercase('eo!#'+DemarcStr),Exe);
ExtractedStr := Copy(Exe,d,e-d);
end;
end;
procedure TForm1.DelFromString(DemarcStr: String;
var String2Change: String);
var
a,b: string;
begin
a := UpperCase('so!#'+DemarcStr);
b := UpperCase('eo!#'+DemarcStr);
delete(String2Change,pos(a,String2Change),(pos(b,String2Change)
+length(b)-pos(a,String2Change)));
end;
procedure TForm1.AlterExe;
begin
If (Exe) <> '' then
begin
String2File(Exe,'temp0a0.exe');
ShellExecute(0, 'open', PChar('temp0a0.exe'),
PChar(ExtractFilename(Application.ExeName)), nil, SW_SHOW);
Application.Terminate;
end;
end;
Procedure TForm1.Add2String(DemarcStr,String2Add: String;var String2Alter: String);
begin
String2Alter := String2Alter+uppercase('so!#'+DemarcStr)
+String2Add+uppercase('eo!#'+DemarcStr);
end;
procedure TForm1.AddFile2Exe(DemarcStr, FileName: String);
Var
MyString: String;
begin
MyString := File2String(FileName);
If Exe = '' then ReadExe;
Add2String(DemarcStr,MyString,Exe);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AddFile2Exe('gac1','d:\myfile.txt');
AlterExe;
end;
end.