| |
|
|
- Seite 1 - |
|
Georg Hovenbitzer | Hallo Sebastian,
ich habe mal wieder ein größeres Problem. Der geniale folgende Code stammt vom Pascal, soetwas könnte ich mir nicht ausdenken. Er ermittelt den Quellcode aus einem geöffneten IE Fenster, wie z.B. www.google.de. Zum Test bitte keine große Seite nehmen, da die Zuweisung zum Edit Feld im Beispielt noch per SetText geht.
Im Interpreter und als Profan Exe läuft er super, übersezt kommt immer eine Schutzverletzung. Die Zeile die den Fehler verursacht ist die: Error& = CallMethod(IHTMLElement&,62,@Addr(Text&))
Der Grund ist dafür, dass der Aufruf davor von: Error& = CallMethod(IHTMLDocument2&,9,@Addr(IHTMLElement&))
Eine Error& Nummer <> 0 zurückt gibt und IHTMLElement&, gleich 0 ist.
Könnte dieses Problem des Übersetzen sein ? KompilierenMarkierenSeparieren $H D:PrivatProfanXProfan9INCLUDEWindows.ph
---------------Umwandlung String > globally unique identifier
Proc StringToGUID
Parameters GUID$,GUID&
Declare Temp$
Temp$ = @Space$(80)
~MultiByteToWideChar(1,1,@Addr(GUID$),-1,@Addr(Temp$),80)
@External("ole32","CLSIDFromString",@Addr(Temp$),GUID&)
EndProc
-----------------------------------------------------------------------
--------------------------Methode eines COM-Interfaces aufrufen
Proc CallMethod
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))
EndProc
-----------------------------------------------------------------------
----------WideChar (UniCode) zu MultiByte (Ansi) [nur OLE!]
Proc OLE_WideToMulti
Parameters Text&
Declare Text$,Size&,Text#
Size& = @External("oleaut32","SysStringLen",Text&)
Dim Text#,Size&
Clear Text#
~WideCharToMultiByte(0,0,Text&,-1,Text#,Size&,0,0)
@External("oleaut32","SysFreeString",Text&)
Text$ = @String$(Text#,0)
Dispose Text#
Return Text$
EndProc
-----------------------------------------------------------------------
------------------------------EnumChildProc---------------------------
Proc EnumChildProc
Parameters wnd&
Declare Name#
Dim Name#,255
~GetClassName(wnd&,Name#,255)
Case @String$(Name#,0)="Internet Explorer_Server" : IEServerWnd& = wnd&
Dispose Name#
Return 1
EndProc
---------------------------------------------------------------------------------
--------------------------RunningIE_GetText-----------------------
Proc RunningIE_GetText
Parameters IEHwnd&
Declare Error&,IID#,Msg&,Result&,oleacc&,IHTMLDocument2&,IHTMLElement&,Text&,Text$,Url&,Url$
Dim IID#,16
Declare IEServerWnd&
~EnumChildWindows(IEHwnd&,@ProcAddr(EnumChildProc,2),0)
@ProcAddr(EnumChildProc,-2)--ProcAddr freigeben
Print "IEServerwnd&",IEServerWnd&
Print
Msg& = ~RegisterWindowMessage("WM_HTML_GETOBJECT")
Print "msg",Msg&
Print
Error& = ~SendMessageTimeout(IEServerWnd&,Msg&,0,0,~SMTO_ABORTIFHUNG,1000,@Addr(Result&))
Print "Error SendMessageTimeout",Error&
Print "Result SendMessageTimeout",Result&
@External("ole32","CoInitialize",0)
oleacc& = @UseDLL("oleacc.dll")
Print "oleacc",oleacc&
Print
StringToGUID("{332c4425-26cb-11d0-b483-00c04fd90119}",IID#)--IID_IHTMLDocument2
Error& = @External("oleacc","ObjectFromLresult",Result&,IID#,0,@Addr(IHTMLDocument2&))
Print "Error ObjectFromLresult",Error&
Print "IHTMLDocument2",IHTMLDocument2&
FreeDLL oleacc&
Error& = CallMethod(IHTMLDocument2&,9,@Addr(IHTMLElement&))--IHTMLDocument2::get_body
Print "Error IHTMLDocument2::get_body",Error&
Print "IHTMLElement",IHTMLElement&
Print
----------------------------------------------Quelltext ermitteln
Error& = CallMethod(IHTMLElement&,62,@Addr(Text&))--IHTMLElement::get_outerHTML
Print "Error IHTMLElement::get_outerHTML",Error&
Print "Result get_outerHTML",Text&
Print
Text$ = OLE_WideToMulti(Text&)
-------------------------------------------------------URL ermitteln
Error& = CallMethod(IHTMLDocument2&,40,@Addr(Url&))--IHTMLElement::get_URL
Print "Error IHTMLElement::get_URL",Error&
Print "Result get_URL",URL&
Print
Url$ = OLE_WideToMulti(Url&)
Print "URL = ";Url$
Dispose IID#
@External("ole32","CoUninitialize")
Return Text$
EndProc---------------------------------------------------------------------------------
Window 0,0-800,600
Declare Fenster&
Declare Edit&
Declare Quell$
Declare IEServerWnd&
Fenster& = ~FindWindow("IEFrame",0)--Hier könnte man auch andere Möglichkeiten nehmen,
IfNot Fenster&---------------------z.B. Suche nach Fenstertitel.
Print "Bitte IE starten!!"------Benötigt wird das gewünschte Hauptfenster des IE!
WaitInput
End
EndIf
Quell$ = RunningIE_GetText(Fenster&)
If @Len(Quell$)
Edit& = @Create("multiedit",%hwnd,"",300,20,450,500)----Text anzeigen
SetText Edit&,Quell$
EndIf
WaitKey
End
|
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 17.05.2006 ▲ |
|
|
|
|
| |
|
- Seite 2 - |
|
Michael Wodrich | [quote:c61d21d565] [quote:c61d21d565] Warum also nicht
Set(P2CPP:...,1) [/quote:c61d21d565] 2. XProfan würde eine solche Anweisung mit Unbekannter Schalter: P2PP... quittieren... [/quote:c61d21d565] Nein, iF meinte den neuen Befehl von XProfan10: KompilierenMarkierenSeparieren Nur mal so zum Verständnis.
Schöne Grüße Michael Wodrich
Wobei mir gerade auffällt, das XPSE die neuen Befehle ja alle noch beigebracht werden müssen. Eine gute Gelegenheit für den Präprozessor-Schalter... |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 24.05.2006 ▲ |
|
|
|
|
| [quote:25d48ad347]Wobei mir gerade auffällt, das XPSE die neuen Befehle ja alle noch beigebracht werden müssen. Eine gute Gelegenheit für den Präprozessor-Schalter...[/quote:25d48ad347] Einige 10er habe ich dem XPSE schon beigebracht - ich bemühe mich auch das der Rest nicht so lange auf sich warten lässt. |
|
|
| |
|
|
|
| @Sebastian: Ich meine nur das Kommentare auch solche sein bleiben sollten. Ich glaub man könnte irre werden wenn man nun auch darauf achten sollte was die Comments beinhalten. Ne ne, Rems mit Bedeutung - das find ich garnicht gut!
Ich glaube eine andere Lösung muß her, und das nicht deshalb weil ich dem XPSE beibringen müsste die Comments zu parsen. |
|
|
| |
|
|
|
Sebastian König | [quote:4dc4baa0c2]gibt es eine Möglichkeit die CPP Source manuell so zu ändern wie es später per Schalter sein wird. Da es ja doch so ein paar Probleme gibt (DLLs müssen per UseDLL geladen werden, urlmon.dll funktioniert mit manchen Links nicht mehr, Hotkeys gehen nicht) würde ich dies gerne mal versuchen.[/quote:4dc4baa0c2] ja - klar Ist aber etwas mühsam: Alle External und Call zwischen den Schaltern müssten in External_ST bzw. Call_ST geändert werden... |
|
|
| |
|
|
|
Michael Wodrich | Und wie wäre es dann hiermit?
$DEFINE Name: setzt eine Bedingung $UNDEF Name: setzt eine Bedingung zurück
Das ist doch sowieso ausschließlich Futter für die Präcompiler. Hier kann Sebastian dann den entsprechenden Namen vorgeben, der verwendet werden darf, z.B.:
$DEFINE p2cpp_irgendeinschalter
Damit braucht man dann auch nichts neues zu erfinden - XProfan 10 hat es ja an Bord.
Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 24.05.2006 ▲ |
|
|
|
|
Sebastian König | [quote:d6877f32d4]Das Set(...,x) war schon gut - nur sollte es halt vom Präprozessor abgearbeitet werden.
Wenn XPSE jetzt so einen erweiterbaren Befehl bekäme, dann könnten auch alle von Profan nicht verstandenen XPSE-Befehle da hinein.
$Set(XPSE,cx) $Set(P2CPP,external_on) $Set(P2CPP,call_on) ...[/quote:d6877f32d4] Solange das ganze in einem Kommentar steht und somit Profan selbst nicht stört ist es ja ok - wobei ich die Syntax schon fast zu kompliziert finde... ;)
[quote:d6877f32d4]$DEFINE Name: setzt eine Bedingung $UNDEF Name: setzt eine Bedingung zurück
Das ist doch sowieso ausschließlich Futter für die Präcompiler. Hier kann Sebastian dann den entsprechenden Namen vorgeben, der verwendet werden darf, z.B.:
$DEFINE p2cpp_irgendeinschalter[/quote:d6877f32d4] Eigentlich eine schöne Idee - aber leider auch nicht abwärtskompatibel zu älteren Profan-Versionen |
|
|
| |
|
|
|
Sebastian König | [quote:d01220718e]@Sebastian: Ich meine nur das Kommentare auch solche sein bleiben sollten. Ich glaub man könnte irre werden wenn man nun auch darauf achten sollte was die Comments beinhalten. Ne ne, Rems mit Bedeutung - das find ich garnicht gut![/quote:d01220718e] Das sehe ich wirklich anders - und es gibt mit dem #!/bin/sh auch ein recht bekanntes Beispiel für eine Kommentar-Zeile mit Bedeutung!
Ich finde auch, man sollte das ganze nicht überbewerten: Es geht hier wirklich um eine sehr spezielle Situtation, nämlich um die Beeinflussung der Übersetzung von External(), Call() für ganz bestimmte Teile des Codes - womöglich wird das außer Georg in diesem Fall nichtmal jemand benötigen... In so gut wie allen Fällen ist die ganz normale Übersetzung dieser Funktionen ja völlig in Ordnung!
Wenn man dies bedenkt, ist das mit den Kommentaren wirklich die schönste Möglichkeit, die mir so einfällt... |
|
|
| |
|
|
|
Michael Wodrich | Und wenn man bei diesen Spezialkommentaren bestimmt, daß davor kein Befehl stehen darf - also nach beliebigen Whitespaces folgt das Kommentarzeichen mit dem Spezialbefehl - dann läßt sich das auch entsprechend herausfiltern (Kommentare gehen ja bis zum Zeilenende). Es ist dann ja immer auf einer Zeile für sich.
Ich sehe das auch als einzige Möglichkeit für die Abwärtskompatibilität - und die hat sich P2CPP ja auf die Fahne geschrieben.
Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 24.05.2006 ▲ |
|
|
|
|
Georg Hovenbitzer | [quote:fec088bf63]ja - klar Ist aber etwas mühsam: Alle External und Call zwischen den Schaltern müssten in External_ST bzw. Call_ST geändert werden...[/quote:fec088bf63] Hallo Sebastian,
wenn ich es richtig verstanden habe, muss ich doch nur die Aufrufe die den Fehler verursachen mit .._ST versehen und keine define setzen. Wenn dies stimmt sind es nicht so viele |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 24.05.2006 ▲ |
|
|
|
|
Sebastian König | Hallo Georg,
[quote:e363eebe1e]wenn ich es richtig verstanden habe, muss ich doch nur die Aufrufe die den Fehler verursachen mit .._ST versehen und keine define setzen. Wenn dies stimmt sind es nicht so viele [/quote:e363eebe1e] ja, aber damit der Thread-Kontext immer stimmt, solltest Du sicherheitshalber alle Aufrufe in der Prozeur Runningie_gettext anpassen.
MfG
Sebastian |
|
|
| |
|
|
| |
|
- Seite 3 - |
|
|
Georg Hovenbitzer | Hallo Sebastian,
es hat geklappt Alle Externals und Calls die benötigt wurden geänder und nun läuft alles ohne Fehler |
|
|
| Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 25.05.2006 ▲ |
|
|
|
|
| Da kann ich nur sagen Respekt Sebastian!
Was für ein Akt! |
|
|
| |
|
|