C ++ Foro | | | | Georg Hovenbitzer | ¡Hola Sebastian,
Yo veces otra vez una größeres Problema. Der geniale folgende Code stammt vom Pascal, soetwas podría Yo no ausdenken. Er ermittelt el Quellcode de una geöffneten IE Ventana, como z.B. www.google.de. Zum Test Por favor, no große Página nehmen, como el Zuweisung para Editar Feld en el Beispielt todavía por SetText va.
Im Interpreter y como Profano Exe se ejecuta él super, übersezt kommt siempre una Schutzverletzung. El Línea el el Fehler verursacht Es el: Error& = CallMethod(IHTMLElement&,62,@Addr(Text&))
Der Grund es dafür, dass el Aufruf davor de: Error& = CallMethod(IHTMLDocument2&,9,@Addr(IHTMLElement&))
Un Error& Nummer <> 0 zurückt son y IHTMLElement&, igual 0 es.
Könnte dieses Problema des Übersetzen ser ? KompilierenMarcaSeparación $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
'./../../funktionsreferenzen/XProfan/waitkey/'>WaitKey
End
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 17.05.2006 ▲ |
| |
| | Sebastian König | ¡Hola Georg,
danke para el Referencia - el problema tritt auch en me en - desafortunadamente podría Yo el Ursache todavía no determinar ...
Como Usted ya geschrieben hast, schlägt el Aufruf
Error& = CallMethod(IHTMLDocument2&,9,@Addr(IHTMLElement&))
fehl, sodass IHTMLElement& no gültigen Schnittstellenzeiger enthält y Intento, una Método así aufzurufen, para Abstruz führt.
Nur ¿qué es exactamente schiefläuft, me está todavía una Rätsel... Das CallMethod incluso es sí Aún con el fin, lo se sólo una Fehler-Cdoe zurückgegeben... Yo voluntad veces versuchen, dessen Bedeutung herauszufinden y melde mich otra vez, si yo algo neues weiß...
MfG
Sebastian |
| | | | |
| | Sebastian König | ¡Hola Georg,
Der Code es para RPC_E_CANTCALLOUT_ININPUTSYNCCALL. El Descripción dafür lautet:
Ein ausgehender Aufruf kann no ausgeführt voluntad, como el Anwendung una Eingabe-synchronisierten Aufruf weiterleitet.
Sehr komisch...
Como me sonst nichts einfiel, Tuve irgendwie el MultiThread-Konzept en el Verdacht (el Gedanke kam me, porque como sí angeblich algo gleichzeitig stattfindet ...
Jedenfalls Yo entonces folgendes probiert: Call() y Externo() voluntad en el traducir Programmen sí grundsätzlich en el Kontext des Haupt-Hilos ausgeführt, porque uno sí nie wissen kann, si irgendwie Ventana oder Controls erstellt/bearbeitet voluntad... Lo son sin embargo una Möglichkeit, dies a ändern: Wenn Yo, el Code primero sólo übersetze, also make.bat no automáticamente starte, y el erzeugte [Projektname].cpp-Expediente (Achtung: no el PrfMain.cpp) después de el ganzen #include-Anweisungen el beiden Zeilen
#define Externo External_ST #define Call Call_ST
einfüge, funktioniert lo en una vez...
¿Puede Usted el bestätigen?
MfG
Sebastian
P.S.: Das todo scheint una bekannter Windows-Bug a ser... Gut posible, dass lo genau en el [...] beschriebene Problema es. Der Abschnitt Symptoms beschreibt nämlich genau el aktuelle Problema |
| | | | |
| | Georg Hovenbitzer | ¡Hola Sebastian,
deine Solución funktioniert con el Demo muy bien
Yo voluntad ellos en el laufe des Tages en el Programa testen en a sehen si hay Schwierigkeiten auftreten.
Melde mich entonces hier. |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 18.05.2006 ▲ |
| |
| | Sebastian König | ¡Hola Georg,
desafortunadamente es muy wahrscheinlich, dass el pauschale Umstellen en el *_ST-Versionen en Deinem Programa a Problemen führt . In el Regel es sí como ya erwähnt incluso notwendig, dass API-Función en el Kontext des Haupt-Hilos ausgeführt voluntad, como hay el todo Fensterverwaltung stattfindet...
Yo habe inzwischen auch veces el bajo el Link (siehe PS en mi Posting oben) gegebenen Vorschlag Use PostMessage instead of a inter-process/inter-thread SendMessage. ausprobiert - auch así es el Fehler Fijo.
Das blöde es sólo: El Alternative kommt eigentlich no en Cuestión. Ursprünglich Tuve para Externo() y Call() tatsächlich PostThreadMessage() benutzt, a irgendwann (Yo glaube lo war aún en el Beta-Phase antes Veröffentlichung de Profano2Cpp) auffiel, dass lo así en Extremsituationen (muy viele Aufrufe en muy corto Tiempo) a Problemen kommen podría . Mit el Umstieg en SendMessage() war entonces alles Haga clic en Aceptar y obendrein todavía el Performance algo mejor, como De hecho, el Umweg en Nachrichtenschleife entfiel ...
So, ahora después de el ganzen Erklären, qué no va, veces una Vorschlag a Solución des Problems :
Dass lo en el Demo con el _ST()-Características auch con usted funktioniert, es sí schonmal super! Mi Concepto wäre ahora, Profano2Cpp así a erweitern, dass con uno speziellen Anweisung en el Profano-Code automáticamente para una cierto Abschnitt en el _ST-Varianten umgeschaltet voluntad kann. Damit se XProfan incluso no encima unbekannte Befehle beschwert, würden se spezielle Kommentare anbieten. In Deinem Code podría lo entonces en etwa así aussehen: KompilierenMarcaSeparación Was hältst Usted de el Vorschlag?
MfG
Sebastian |
| | | | |
| | Georg Hovenbitzer | ¡Hola Sebastian,
Yo kann dich beruhigen
Mein Programa se ejecuta nun sin Fehler, lo gab Aunque un pocos seltsame Effekte como z.B. dass Yo todos DLL con UseDLL Laden musste, qué sin Übersetzen no nötig war. Anderseits mach el Programa auch no viel, lo ließt el Ver código fuente el Página de y sucht hay después de Links, speichert Bilder y Texto Archivos. Für el Zukunft wäre deine angedacht Solución muy vom Vorteil, como ellos muy ligeramente en el Profano Code einzubauen es y uno se dadurch auch no el Möglichkeit nimmt deine Plugins a benutzen (como Todavía no herausgefunden habe Yo con el ResHacker Versions Informationen en un Expediente bekomme). |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 19.05.2006 ▲ |
| |
| | Sebastian König | ¡Hola Georg,
si incluso así ya funktioniert, es el natürlich sólo bastante super!
El vorgeschlagen Kommentar-Schalter voluntad Yo entonces en el nächste Versión einbauen - para größtmögliche Flexibilität incluso getrennte Schalter para Call() y Externo(), el aber en uno einzigen Línea gesetzt voluntad puede, z.B.
P2CPP: <USE_EXTERNAL_ST,USE_CALL_ST>
MfG
Sebastian |
| | | | |
| | Georg Hovenbitzer | ¡Hola Sebastian,
Yo mich algo a früh gefreut
Yo habe dir veces una Codebeispiel geschrieben el desafortunadamente después de el manuellen Einfügen de: #define Externo External_ST #define Call Call_ST no funktioniert. Das Problema liegt daran, dass &UwParam no Valor mehr erhält KompilierenMarcaSeparaciónDef RegisterHotKey(4) !"USER32.DLL","RegisterHotKey"
Def UnregisterHotKey(2) !"USER32.DLL","UnregisterHotKey"
Declare Edit&
Window 100,100-400,400
Edit& = @Create("Edit",%hWnd,"",100,100,150,20)
UserMessages $312
RegisterHotKey(%hWnd,11111,3,80) Strg + Alt + P
WhileNot %Key = 2
WaitInput
SetText Edit&,""
DrawText 20,30,@Space$(30)
DrawText 20,20,"&UwParam = " + @Str$(&UwParam)
If ((&UwParam = 11111) And (%GetFocus = Edit&))
SetText Edit&,"TREFFER !"
EndIf
EndWhile
UnRegisterHotKey(%hWnd,11111)
UserMessages 0
End
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 23.05.2006 ▲ |
| |
| | | Mir viel como auch todavía lo que uno!
P2CPP: <USE_EXTERNAL_ST,USE_CALL_ST>
Ist denkbar schlecht como Indikator - Rems debería siempre wegoptimierbar ser.
XProfan incluso ha ya solch tollen Befehl SET
¿Por qué also no KompilierenMarcaSeparación Yo glaub el wäre eleganter. |
| | | | |
| | Sebastian König | Hola si,
[quote:26d3b84306]XProfan incluso ha ya solch tollen Befehl SET
¿Por qué also no
Conjunto(P2CPP:...,1)
Yo glaub el wäre eleganter. [/quote:26d3b84306] el va desafortunadamente de 2 Gründen no:
1. El Information muss ya para Zeitpunkt el Übersetzung disponible posición - en Conjunto() es el por desgracia, no así, porque uno en efecto una Stringvariable benutzen podría... (dehalb ließ se para Ejemplo el @Conjunto(ESCAPE, n%) de XProfan 9 no correcto umsetzen ).
2. XProfan sería una solche Anweisung con Unbekannter Schalter: P2PP... quittieren...
Oh, gerade fällt me todavía una:
3. Abwärtskompatibilität! Ältere Profano²-Versionen kennen gar kein Conjunto()...
¿Puede Usted el XPSE no simplemente beibringen, en cierto Kommentaren una bischen Zurückhaltung a üben?
MfG
Sebastian |
| | | | |
| | | [quote:a8como9240c6=Sebastian König]Hola si,
[quote:a8como9240c6]XProfan incluso ha ya solch tollen Befehl SET
¿Por qué also no
Conjunto(P2CPP:...,1)
Yo glaub el wäre eleganter. [/quote:a8como9240c6] el va desafortunadamente de 2 Gründen no...
...¿Puede Usted el XPSE no simplemente beibringen, en cierto Kommentaren una bischen Zurückhaltung a üben?
[/quote:a8como9240c6] Ohhhh mein Gott.
Ok, o ne- Concepto: p2cppcompiler$=blub |
| | | | |
| | Sebastian König | [quote:f983247403]Ohhhh mein Gott.
Ok, o ne- Concepto: p2cppcompiler$=blub [/quote:f983247403] Yo weiß ahora no tan completamente, lo que quiere decir...
El Solución con esta Kommentar-Befehlen gefällt me eigentlich auch bastante bien, porque ellos muy flexibel es (uno podría incluso para einzelne Aufrufe el Comportamiento ändern), el XProfan-Interpreter o. Compiler überhaupt no stört y gar no unnötigen Overhead producido... |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 4 subscriber: |