Deutsch
Forum

ATL.DLL

 

Frank
Tretter
Bin neu hier und das ist meine erste Frage.
Ich wollte mir selber einen kleinen Browser basteln und habe auch schon viel im Netz dafür gefunden. Mein Programm benutzt IWebBrowser2.ph.
Das Demo das als Beispiel dabei war läuft auch gut. Nun möchte ich aber das Menü erweitern und die Befehle wie Markieren, Kopieren einfügen.

Leider lässt das erzeugte Browserfenster auch nicht die Tastenkompination STRG+A zu.
Hoffe es kann mir jemand helfen und zeigen wie man das Menü erweitert.
Mit den Befehlen AppendMenuBar komm ich klar, aber nicht mit der Procedure CallMethod die im Demo benutzt wir.

Hier das Demo
KompilierenMarkierenSeparieren
 $H c:XProfan 8.0INCLUDEWindows.ph
 $H c:XProfan 8.0INCLUDEIWebBrowser2.ph
Declare a$, a&, a#, b#, Error&, ATLdll&, WebControl&, IUnknown&, IWebBrowser&
Dim a#,1024
Dim b#,256
Def CLSIDFromString(2) !ole32,CLSIDFromString
Def AtlAxWinInit(0) !atl.dll,AtlAxWinInit
Def AtlAxGetControl(2) !atl.dll,AtlAxGetControl

Proc CallMethod-----------------------------------------------Interface-Methoden aufrufen

    Parameters IFace&,Method&
    Declare VTable&
    VTable&=long(IFace&,0)
    Method&=long(VTable&,Method&*4)
    case %pcount=2:return call( Method&,IFace& )
    case %pcount=3:return call( Method&,IFace&,&(3) )
    case %pcount=4:return call( Method&,IFace&,&(3),$(4) )
    case %pcount=5:return call( Method&,IFace&,&(3),&(4),&(5) )
    case %pcount=6:return call( Method&,IFace&,&(3),&(4),&(5),&(6) )
    case %pcount=7:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7) )
    case %pcount=8:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7),&(8) )

EndProc

proc WebOpen-------------------------------------------------------------Irgendwas öffnen

    Parameters X$
    ~RedrawWindow(%hwnd,0,0,$485)
    casenot len(x$):return
    ~MultiByteToWideChar(0,0,addr(x$),-1,a#,250)
    clear b#
    CallMethod(IWebbrowser&,~Navigate,a#,b#,b#,b#,b#)

EndProc

*****************************************************************************************
windowstyle 16+8+4+2+1
window 10,10-700,500
usermessages 16
ATLdll&=usedll(atl.dll)
AtlAxWinInit()
WebControl&=control(AtlAxWin,Shell.Explorer.1,$50000000,0,0,0,0,%hwnd,0,0,$200)
~GetClientRect(%hwnd,b#)
setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)
Werte von Error& und IUnknown& im Fehlerfall ausgeben lassen!
Error&=AtlAxGetControl(WebControl&,addr(IUnknown&))
IWebBrowser2-Interface ermöglicht Kontrolle über das WebControl
clear a#,b#
a$=~IID_IWebBrowser2
~MultiByteToWideChar(1,1,addr(a$),-1,a#,80)-------------ANSI zu WideChar
CLSIDFromString(a#,b#)----------------------------------String zu Interface-ID
Error&=CallMethod(IUnknown&,~QueryInterface,b#,addr(IWebBrowser&))
--damit es beim Start nicht so leer aussieht
CallMethod(IWebBrowser&,~GoHome)
--------------------------------------------------------------------FensterMenü
appendmenubar 101,Zurück
appendmenubar 102,Vorwärts
appendmenubar 103,Abbrechen
appendmenubar 104,Aktualisieren
appendmenubar 105,Startseite
appendmenubar 106,Suchen
appendmenubar 107,Datei öffnen
appendmenubar 108,Ordner öffnen
appendmenubar 109,URL öffnen
--------------------------------------------------------------------Eingabeschleife

while 1

    if %key=4----------------------------------------------Grössenänderung des Fensters

        ~GetClientRect(%hwnd,b#)
        setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)

    elseif menuitem(101)-----------------------------------Zurück

        CallMethod(IWebBrowser&,~GoBack)

    elseif menuitem(102)-----------------------------------Vorwärts

        CallMethod(IWebBrowser&,~GoForward)

    elseif menuitem(103)-----------------------------------Abbrechen

        CallMethod(IWebBrowser&,~Stop)

    elseif menuitem(104)-----------------------------------Aktualisieren

        CallMethod(IWebBrowser&,~Refresh)

    elseif menuitem(105)-----------------------------------Startseite

        CallMethod(IWebBrowser&,~GoHome)

    elseif menuitem(106)-----------------------------------Suchen

        CallMethod(IWebBrowser&,~GoSearch)

    elseif menuitem(107)-----------------------------------Datei öffnen

        a$=loadfile$(Bitte Bild oder HTML-Datei wählen,*.*)
        WebOpen a$

    elseif menuitem(108)-----------------------------------Ordner  öffnen

        a$=choosedir$(Bitte Ordner wählen)
        WebOpen a$

    elseif menuitem(109)-----------------------------------URL öffnen

        a$=input$(Bitte Web-Adresse eingeben:,URL:,)
        WebOpen a$
        endif----------------------------------------------------------------------

        while 1----------------------------Warten, bis Aktion ausgeführt ist

            sleep 200
            CallMethod(IWebBrowser&,~get_Busy,addr(a&))
            casenot a&:break
            endwhile------------------------------------------------------------
            waitinput
            case %umessage=16:break-----------Ende
            endwhile-----------------------------------------------------------------Ende Eingabeschleife
            destroywindow(WebControl&)
            case ATLdll&:freedll ATLdll&
            End

Gruß Fränki
 
Seit 2008 endlich XProfan 10, ist einfach klasse
19.02.2007  
 



Also zum Ersten solltest Du Deinen Quellcode auch mit
KompilierenMarkierenSeparieren ummanteln (das ist in allen Foren üblich) - Codes mit Smilies drin wird sich keiner anschauen. Du kannst Dein Posting ja bearbeiten. Und dann wäre es noch hilfreich wenn Du die zusätzliche PH auch als DateiAnhang beifügst - denn diese gehört nicht zum XProfanumfang.

Wir wissen auch nicht welche XProfanversion Du nutzt (hast ja nix angegeben) - das könntest Du aber auch in Deine Signatur schreiben.

Die Bereiche a# und b# werden nicht disposed .

Bis denne.

@Admins: Ich finde diese Postingform kommt in letzter Zeit sehr oft vor - wir sollten vor dem Posten ein Vorstellungsgespräch führen - inform einer Erklärungsseite howTo Post. Ich werd das mal zusammenbasteln.
 
19.02.2007  
 



Nachtrag: Inhalt der iwebbrowser2.ph
KompilierenMarkierenSeparieren
 
19.02.2007  
 




Frank
Tretter
Sorry, kenne mich da noch nicht so aus.
Ich habe XProfan 8. iwebbrowser2.ph wurde von Dir schon hier angezeigt, Danke.

Jetzt versuch ich das mit dem Code noch einmal.
KompilierenMarkierenSeparieren
 $H c:XProfan 8.0INCLUDEWindows.ph
 $H c:XProfan 8.0INCLUDEIWebBrowser2.ph
Declare a$, a&, a#, b#, Error&, ATLdll&, WebControl&, IUnknown&, IWebBrowser&
Dim a#,1024
Dim b#,256
Def CLSIDFromString(2) !ole32,CLSIDFromString
Def AtlAxWinInit(0) !atl.dll,AtlAxWinInit
Def AtlAxGetControl(2) !atl.dll,AtlAxGetControl

Proc CallMethod-----------------------------------------------Interface-Methoden aufrufen

    Parameters IFace&,Method&
    Declare VTable&
    VTable&=long(IFace&,0)
    Method&=long(VTable&,Method&*4)
    case %pcount=2:return call( Method&,IFace& )
    case %pcount=3:return call( Method&,IFace&,&(3) )
    case %pcount=4:return call( Method&,IFace&,&(3),$(4) )
    case %pcount=5:return call( Method&,IFace&,&(3),&(4),&(5) )
    case %pcount=6:return call( Method&,IFace&,&(3),&(4),&(5),&(6) )
    case %pcount=7:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7) )
    case %pcount=8:return call( Method&,IFace&,&(3),&(4),&(5),&(6),&(7),&(8) )

EndProc

proc WebOpen-------------------------------------------------------------Irgendwas öffnen

    Parameters X$
    ~RedrawWindow(%hwnd,0,0,$485)
    casenot len(x$):return
    ~MultiByteToWideChar(0,0,addr(x$),-1,a#,250)
    clear b#
    CallMethod(IWebbrowser&,~Navigate,a#,b#,b#,b#,b#)

EndProc

*****************************************************************************************
*****************************************************************************************
windowstyle 16+8+4+2+1
window 10,10-700,500
usermessages 16
ATLdll&=usedll(atl.dll)
AtlAxWinInit()
WebControl&=control(AtlAxWin,Shell.Explorer.1,$50000000,0,0,0,0,%hwnd,0,0,$200)
~GetClientRect(%hwnd,b#)
setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)
Werte von Error& und IUnknown& im Fehlerfall ausgeben lassen!
Error&=AtlAxGetControl(WebControl&,addr(IUnknown&))
IWebBrowser2-Interface ermöglicht Kontrolle über das WebControl
clear a#,b#
a$=~IID_IWebBrowser2
~MultiByteToWideChar(1,1,addr(a$),-1,a#,80)-------------ANSI zu WideChar
CLSIDFromString(a#,b#)----------------------------------String zu Interface-ID
Error&=CallMethod(IUnknown&,~QueryInterface,b#,addr(IWebBrowser&))
--damit es beim Start nicht so leer aussieht
CallMethod(IWebBrowser&,~GoHome)
--------------------------------------------------------------------FensterMenü
appendmenubar 101,Zurück
appendmenubar 102,Vorwärts
appendmenubar 103,Abbrechen
appendmenubar 104,Aktualisieren
appendmenubar 105,Startseite
appendmenubar 106,Suchen
appendmenubar 107,Datei öffnen
appendmenubar 108,Ordner öffnen
appendmenubar 109,URL öffnen
--------------------------------------------------------------------Eingabeschleife

while 1

    if %key=4----------------------------------------------Grössenänderung des Fensters

        ~GetClientRect(%hwnd,b#)
        setwindowpos WebControl&=0,0-long(b#,8),long(b#,12)

    elseif menuitem(101)-----------------------------------Zurück

        CallMethod(IWebBrowser&,~GoBack)

    elseif menuitem(102)-----------------------------------Vorwärts

        CallMethod(IWebBrowser&,~GoForward)

    elseif menuitem(103)-----------------------------------Abbrechen

        CallMethod(IWebBrowser&,~Stop)

    elseif menuitem(104)-----------------------------------Aktualisieren

        CallMethod(IWebBrowser&,~Refresh)

    elseif menuitem(105)-----------------------------------Startseite

        CallMethod(IWebBrowser&,~GoHome)

    elseif menuitem(106)-----------------------------------Suchen

        CallMethod(IWebBrowser&,~GoSearch)

    elseif menuitem(107)-----------------------------------Datei öffnen

        a$=loadfile$(Bitte Bild oder HTML-Datei wählen,*.*)
        WebOpen a$

    elseif menuitem(108)-----------------------------------Ordner  öffnen

        a$=choosedir$(Bitte Ordner wählen)
        WebOpen a$

    elseif menuitem(109)-----------------------------------URL öffnen

        a$=input$(Bitte Web-Adresse eingeben:,URL:,)
        WebOpen a$
        endif----------------------------------------------------------------------

        while 1----------------------------Warten, bis Aktion ausgeführt ist

            sleep 200
            CallMethod(IWebBrowser&,~get_Busy,addr(a&))
            casenot a&:break
            endwhile------------------------------------------------------------
            waitinput
            case %umessage=16:break-----------Ende
            endwhile-----------------------------------------------------------------Ende Eingabeschleife
            destroywindow(WebControl&)
            case ATLdll&:freedll ATLdll&
            End

2 kB
Hochgeladen:19.02.2007
Ladeanzahl125
Herunterladen
 
Seit 2008 endlich XProfan 10, ist einfach klasse
19.02.2007  
 




Uwe
''Pascal''
Niemeier
Hallo Frank!

Das WebBrowser-Control wird komplett über sogenannte COM-Interfaces gesteuert; das gilt sogar für Clipboard-Aktionen. Mit Messages (wie bei Edits) ist da nichts zu machen; dafür muss sogar ein neues Interface aufgerufen werden.
Diese Prozedur sollte helfen:
KompilierenMarkierenSeparieren
proc CopyToClipBoard----------------------------------------------------------

    declare IOleCommandTarget&,CLSID$
    CLSID$={b722bccb-4e68-101b-a2bc-00aa00404770}--IID_IOleCommandTarget
    ~MultiByteToWideChar(1,1,addr(CLSID$),-1,a#,80)--ANSI zu WideChar
    CLSIDFromString(a#,b#)---------------------------String zu Interface-ID
    CallMethod(IWebBrowser&,~QueryInterface,b#,addr(IOleCommandTarget&))
    CLSID$={de4ba900-59ca-11cf-9592-444553540000}--CGID_MSHTML (Kommandomodus)
    ~MultiByteToWideChar(1,1,addr(CLSID$),-1,a#,80)--ANSI zu WideChar
    CLSIDFromString(a#,b#)---------------------------String zu Interface-ID
    CallMethod(IOleCommandTarget&,4,b#,15,0,0,0)-----Exec : IDM_COPY
    CallMethod(IOleCommandTarget&,~Release)----------Interface freigeben
    endproc-----------------------------------------------------------------------

Eine Routine zum Markieren reiche ich noch nach!

@ iF: Bist du sicher, dass DISPOSE am Programmende  so wichig ist?

HTH
Pascal
 
20.02.2007  
 




RGH
Uwe Pascal Niemeier
@ iF: Bist du sicher, dass DISPOSE am Programmende  so wichig ist?


Bei Win9x (dazu gehört auch Win ME) grundsätzlich ja, da sonst der Speicher oiftmals nicht vor dem nächsten Neustart freigegeben wird.
Win2000/XP/Vista regelt das Betriebssystem bei Programmende die Freigabe in aller Regel nötigenfalls selbst.

Trotz allem sollte man sich angewöhnen mit DIM reservierten Speicher grundsätzlich durch DISPOSE wieder freizugeben. Sollte man dieses z.B. mal in einer Prozedur vergessen, hat man sehr schnell Probleme ...

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
20.02.2007  
 




Frank
Tretter
Vielen Dank erstmal für die schnelle Hilfe. Das bringt mich schon weiter.
Wenn ich dann noch die Routine für das Markiern bekomm bin ich Glücklich und es hat mir sehr geholfen.

Kann leider nicht immer gleich antworten, bin nicht immer am PC und zum Programmieren fehlt als die Zeit.

Gruß Fränki
 
Seit 2008 endlich XProfan 10, ist einfach klasse
21.02.2007  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.817 Betrachtungen

Unbenanntvor 0 min.
Christof Neuß04.06.2019
Walter08.05.2016
Uwe ''Pascal'' Niemeier31.12.2014
Michael Borowiak27.11.2014
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie