Bugs y vermeintliche | | | | - Página 1 - |
| Dieter Zornow | Yo denke es todavía una Problema en XProfan 11, habe gerade auch nochmals el OCX - Beispiele de Uwe Pascal N. getestet. Bajo XProfan 10 se ejecuta alles todavía einwandfrei. Bajo XProfan 11 RC 8 sólo Se bloquea cada Ejemplo.
Gruss
Dieter |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 29.06.2008 ▲ |
| |
| | | | | - Página 1 - |
| | Nutzt Delphi como Heaps [...] ? |
| | | | |
| | RGH | ... y ya que aussieht, laufen en mi Rechner a Casa (XP Pro SP3) el Beispiele de Uwe Pascal werder bajo XProfan 10 todavía bajo XProfan 11. Lo kommt siempre el Meldung CallMethod - Unbekannter Name. (Sí, Yo el ComCtl32.ocx registriert ....) In el Firma (XP Pro SP2 ha lo geklappt.)
Dann muß Yo mich wohl doch otro Temas zuwenden ...
Saludo 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 | 30.06.2008 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | ¡Hola Personas!
Zunächst veces: Yo habe en el Moment weder XP SP3 todavía XProfan 11 disponible, por lo tanto kann ego no incluso testen.
Aber: El de Roland reklamierten Variables haben en dieser Versión el OCX-Routinen direkt nichts con el ActiveX-Características a tun: KompilierenMarcaSeparación
proc ocxCreate----------------------------------ocxCreate-------------------------------
parameters ProgID$,Wnd&,xa%,ya%,xb%,yb%,ObjAddr&,CtrlAddr&
declare Control&,IUnknown&,Object&
Control&=control(AtlAxWin,ProgID$,$50000000,xa%,ya%,xb%,yb%,Wnd&,0,0,0)
~AtlAxGetControl(Control&,addr(IUnknown&))
Object&=QueryInterface(IUnknown&,~IID_IDispatch)
CallMethod(IUnknown&,~Release)
long ObjAddr&,0=Object&
long CtrlAddr&,0=Control&
endproc---------------------------------------------------------------------------------
declare Object&,Control&
ocxCreate(MSCAL.Calendar.7,%hwnd,10,100,350,250,addr(Object&),addr(Control&)
El beiden Pointer kommen en el Proc como ObjAddr& y CtrlAddr& a, Object& y Control& voluntad lokal otra vez deklariert y al Ende el Proc voluntad el - como Parámetro übergebenen - Pointer con LONG gefüllt.
Das Problema podría also auch en el direkten Übergabe de addr(Variable&) como Parámetro para una Procedimiento mentira oder en el lokalen Deklaration uno global ya vorhandenen Variable...
PS: Im Ejemplo se Versión 1 el OCX-Routinen verwendet. Como sieht lo porque con Versión 2 de?
SeeYou Pascal |
| | | | |
| | | | - Página 2 - |
| | RGH | ¡Hola,
Yo me el Sache gestern Abend una vez más genauer angeschaut. Es auch weiterhin así, dass una variable während ihrer Gültigkeit Ihre Adresse no ändert. Von por lo tanto also una Entwarnung!
Das Problema liegt en Pascals Crear-Rutina, o. el Übergabe el Variables de dieser zurück: KompilierenMarcaSeparación
Proc ocxCreate----------------------------------ocxCreate-------------------------------
parameters ProgID$,Wnd&,xa%,ya%,xb%,yb%,ObjAddr&,CtrlAddr&
declare Control&,IUnknown&,Object&
Control&=control(AtlAxWin,ProgID$,$50000000,xa%,ya%,xb%,yb%,Wnd&,0,0,0)
~AtlAxGetControl(Control&,addr(IUnknown&))
Object&=QueryInterface(IUnknown&,~IID_IDispatch)
CallMethod(IUnknown&,~Release)
long ObjAddr&,0=Object&
long CtrlAddr&,0=Control&
endproc--------------------------------------------------------------------------------span>
Über PARAMETERS voluntad el beiden Adressen en el lokalen Variables ObjAddr& y CtrlAddr& gespeichert. Deren Adressen voluntad aber con Verlassen el Procedimiento ungültig. In XProfan 11 haben Object& y Control& valor 0 ... qué entonces unweigerlich para Crash führt. Möchte uno mehrere Werte de uno Procedimiento zurückerhalten wempfiehlt se siempre el Weg una struktur oder encima una Objeto, como - como en nahezu allen Idiomas - Estructuras y Objetos por Adresse transferencia voluntad. So sieht el angepaßte Crear-Procedimiento de: KompilierenMarcaSeparación
proc ocxCreate----------------------------------ocxCreate-------------------------------
parámetros ProgID$,Wnd&,xa%,ya%,xb%,yb%,Uebergabe#
declarar IUnknown&
Uebergabe#.Control&=control(AtlAxWin,ProgID$,$50000000,xa%,ya%,xb%,yb%,Wnd&,0,0,0)
~AtlAxGetControl(Uebergabe#.Control&,Addr(IUnknown&))
Uebergabe#.Object&=QueryInterface(IUnknown&,~IID_IDispatch)
CallMethod(IUnknown&,~Release)
ENDPROC---------------------------------------------------------------------------------
Auch el Procedimiento QueryInterface() muß entsprechend angepaßt voluntad (Aufruf de CallMethod()): KompilierenMarcaSeparación
proc QueryInterface-------------------------------------------------------------
parámetros IFace1&,IID$
declarar IFace2#,Error&
dim IFace2#,4
StringToGUID(IID$,IID#)
Error&=CallMethod(IFace1&,0,IID#,IFace2#)
caso Error&<0:ErrorMessage(Error&,QueryInterface)
CallMethod(IFace1&,~Release)
volver long(IFace2#, 0)
ENDPROC-----------------------------------------------------------------------
Und así nun el Beispielprogramm: KompilierenMarcaSeparaciónwindow 100,10-500,500
usermessages 16
$H Windows.ph
$H OCX.ph
$I OCX.inc
Nur a Demo. Normalerweise sería uno el Übergabestruktur en OCX.ph definieren
Struct SUebergabe = Object&, Control&
declarar U#
dim U#, SUebergabe
declarar ATL&,Var#,Disp#,IID#
ocxInit()
ocxCreate(MSCAL.Calendar.7,%hwnd,10,100,350,250,U#)
ocxMethod(U#.Object&,Today)
numwidth 3
mientras que 1
locate 0,0
imprimir Tag ,ocxGet(U#.Object&,Day)
imprimir Monat ,ocxGet(U#.Object&,Month)
imprimir Jahr ,ocxGet(U#.Object&,Year)
waitinput
caso %umessage=16:romper
endwhile
ocxMethod(U#.Object&,AboutBox)
destroywindow(U#.Control&)
ocxDeInit()
Saludo 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 | 01.07.2008 ▲ |
| |
| | RGH | Noch kurz a Erklärung para Insider:
In Xrofan 11 voluntad tatsächlich con Verlassen uno Procedimiento el Adressen el lokalen Variables otra vez ungültig y entsprechende Speicher se otra vez frei gegeben.
Bis einschließlich XProfan 10 wurde el Speicher para todos möglichen Variables sí beim Start disponible gestellt.* Beim Verlassen el Procedimiento wurde zwar el Zeiger en el letzte Variable zurückgesetzt, así dass en el lokalen Variables el Procedimiento no mehr zugegriffen voluntad podría y Speicher para el Deklaration neuer Variables otra vez disponible stand, pero la Speicher wurde no freigegeben. Und así largo dieser no por neue Declares genutzt wurde, blieben el alten Werte hay posición.
Saludo Roland
* En Cuerdas, Arrays y Bereichen allerdings sólo el Zeiger en el Speicher ... aber el wäre ahora una más Thema ... |
| | | 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 | 01.07.2008 ▲ |
| |
| | Sebastian König | RGH
Über PARAMETERS voluntad el beiden Adressen en el lokalen Variables ObjAddr& y CtrlAddr& gespeichert. Deren Adressen voluntad aber con Verlassen el Procedimiento ungültig. In XProfan 11 haben Object& y Control& valor 0 ... qué entonces unweigerlich para Crash führt.
Das Argument verstehe Yo irgendwie no... en el Parametern ObjAddr& y CtrlAddr& voluntad doch el Adressen de globalen Variables transferencia (siehe Pascals Code oben). Was genau es entonces el problema en uno Zuweisung el Form long ObjAddr&,0=Object&? Worauf genau ObjAddr& nun zeigt, macht de Sicht el Procedimiento sí no hay diferencia y dass Object& nun una lokale Variable es, dürfte auch ningún papel spielen.
So Yo el Descripción verstehe, es el todo doch äquivalent a una solchen Ejemplo: KompilierenMarcaSeparación |
| |
| | RGH | Sí, rOlf, Yo vermute Usted hast bastante: Mi Erklärung war algo a kurz gegriffen. Tatsache es, dass el entsprechend veränderten y de me geposteten Quellcodes auch bajo XProfan 11 einwandfrei trabajo. (Zumindest hier al Arbeitsplatz-PC. Zuhause en mi Rechner klappt gar nichts con ActiveX - weder en XProfan 10 todavía 11. Yo muß veces überprüfen, si mi ComCtl32.ocx el richtige es.)
Möglicherweise hängt el problema auch así zusammen, dass lokale Variables a ActiveX-Características gegeben voluntad, el auch después de el Verlassen el Procedimiento todavía aktiv son y así plötzlich en no mehr gültige Adressen zugreifen. Yo voluntad en Gelegenheit weiterforschen. Wichtig es hier, dass wir una solución a el problema haben y Uwe Pascals Quellcodes auch para XProfan11-Nutzer offen posición.
Saludo 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 | 01.07.2008 ▲ |
| |
| | Frank Abbing | Si el Problema sólo lokale Variables betrifft y no el Globalen, kann Yo así durchaus leben. Dass lokale Variables en erneutem Aufruf uno Prozedure gelöscht voluntad, es sí durchaus gängige Praxis. So bin Yo auch de Ensamblador de gewohnt. |
| | | | |
| | Uwe ''Pascal'' Niemeier | ¡Hola Personas!
Möglicherweise hängt el problema auch así zusammen, dass lokale Variables a ActiveX-Características gegeben voluntad, el auch después de el Verlassen el Procedimiento todavía aktiv son y así plötzlich en no mehr gültige Adressen zugreifen.
Das podría aber sólo en IUnknown& zutreffen, qué aber anscheinend no Fall es. El Werte para/de Control& y Object& (lokal) voluntad direkt zugewiesen ; lo voluntad no Pointer verwendet. Folglich kann auch kein späterer Zugriff darauf tener lugar. Wegen QueryInterface() muß Yo veces schauen...
Wichtig es hier, dass wir una solución a el problema haben y Uwe Pascals Quellcodes auch para XProfan11-Nutzer offen posición.
Mir ging lo en efecto por lo tanto, el Routinen möglichst weit abwärtskompatibel a halten, por lo tanto Yo en OOP verzichtet. Pero ya para OCX-Package Versión 3 vorgemerkt. Wäre aber trotzdem bien, dieses Problema a dahin geklärt a haben. El Übergabe de Pointern, en Variables a füllen debería sí - trotz OOP - durchaus no ungewöhnlich ser.
PS: El Schwierigkeiten con SP3 voluntad Yo demnächst vornehmen.
SeeYou Pascal |
| | | | |
| | RGH | ¡Hola Pascal,
el Übergabe de Pointern, en Variables a füllen, es - como Rolf en efecto ya festgestellt ha - no el eigentliche Problema. Das Problema vermute Yo eben en el Zona, wo Adressen lokaler Variables a Características transferencia voluntad, el auch después de Beendigung el aufrufenden Procedimiento (y el Ungültigwerden eben dieser Adressen) todavía weiterlaufen. Hierzu zählen offensichtlich ActiveX-Objetos. Auf Anhieb kann Yo en Deinem Code zwar no derartigen Aufrufe con Adressen lokaler Variables erkennen, aber ActiveX ha como möglicherweise Eigenheiten, el me todavía no geläufig son. Desde que en la actualidad en mi Entwicklungsrechner el Beispiele no a veces XProfan 10 para Laufen bekomme, muß Yo una weitere Analyse en el Tiempo después de el Release de XProfan 11 mover. (Como voluntad Yo mi Rechner una neues Motherboard con besserem Prozessor gönnen. Vor el Release gilt bastante streng: Never Change A Running Sistema.) Und debería Yo wirklich entonces determinar, dass Yo en XProfan qué tun kann, spricht sí nichts gegen una kostenloses Actualización sobre una XProfan 11.0a oder gar 11.1.
Wenn lo no wirklichen ShowStopper mehr son, se XProfan 11 demnächst festgeklopft y endlich a JDS geliefert. Yo bin eh ya (teils por berufliche y private Auslastung, teils por Maßlosigkeit beim Einbau neuer Features) etwa 2 Monate hinter mi ursprünglichen Zeitplan.
Saludo 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 | 02.07.2008 ▲ |
| |
| | RGH | ¡Hola Pascal, Yo no dejar puede y mi Frühstückspause al Arbeitsplatzrechner geopfert:
Der oben gepostete Code scheint no 100%ig stabil a ser. Wenn Yo el Declarar en el Procedimiento CallMethod en más que drei Variables erweitere, bricht el Programa con uno Fehlermerldung de. Sehr befremdlich, el! Also Yo algo más experimerntiert.
Lo xcheint tatsächlich con el QueryInterface zusammenzuhängen. Yo habe veces geschaut, Yo en XProfan beim HTML-Ventana anders mache: Desde que sí sólo el Control zurückgebe, mache Yo jedesmal una neues QueryInterface, a Objektadresse a ermitteln (y natürlich después de Gebrauch des Objektes una Releasen). Das Yo veces en Deinem OCX.INC umgesetzt. Zunächst una ocxCreateC() (el C es para Control): KompilierenMarcaSeparación
proc ocxCreateC ----------------------------------ocxCreate-------------------------------
parameters ProgID$,Wnd&,xa%,ya%,xb%,yb%
return control(AtlAxWin,ProgID$,$50000000,xa%,ya%,xb%,yb%,Wnd&,0,0,0)
endproc --------------------------------------------------------------------------------- Dann el Proceduren ocxGet, ocxPut y ocxMethod como ocGetC, ocxPutC y ocxMethodC kopiert y entsprechend erweitert. Als Ejemplo hier ocxGetC(): KompilierenMarcaSeparación
proc ocxGetC-------------------------------------ocxGet----------------------------------
parámetros Control&,Name$
declarar Object&,IUnknown&
declarar DispID&,v&,v$
~AtlAxGetControl(Control&,addr(IUnknown&))
Object&=QueryInterface(IUnknown&,~IID_IDispatch)
clear Var#,Disp#,IID#
Name$=MultiToWideEx(Name$)
v&=addr(Name$)--GetIDsOfNames braucht Pointer en Pointer
CallMethod(Object&,5,IID#,addr(v&),1,0,addr(DispID&))--GetIDsOfNames
CallMethod(Object&,6,DispID&,IID#,0,~DISPATCH_PROPERTYGET,Disp#,Var#,0,0)--Invoke
if Var#.vt%=~VT_BSTR------OLE-String
v$=WideToMultiEx(Var#.Val&)
más----------------------numerischer Valor
v$=str$(Var#.Val&)
endif
~VariantClear(Var#)
CallMethod(IUnknown&,~Release)
volver v$
ENDPROC---------------------------------------------------------------------------------
ocxQueryInterface Yo así gelassen, como oben Nuevo (con IFace2#). Und ya klappt alles (zumindest hier al Arbeitsplatz ;) )
Nur ne vage Theorie, oder mejor Hypothese: Vermutlich kann se el ActiveX-Objeto en el Speicher mover, qué pero en el statischen Speicherverwaltung en XProfan 10 en el Beispielprogrammen no vorkam, como como sí nirgendwo neuer Speicher angefordert wurde. Jetzt ermittle Yo encima QueryInterface el Objektadresse (Object&) jedesmal neu y el problema scheint Fijo.
Saludo 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 | 02.07.2008 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hola Roland!
Nur ne vage Theorie, oder mejor Hypothese: Vermutlich kann se el ActiveX-Objeto en el Speicher mover, qué pero en el statischen Speicherverwaltung en XProfan 10 en el Beispielprogrammen no vorkam, como como sí nirgendwo neuer Speicher angefordert wurde.
Klingt gewagt... En Desarrollo el OCX-Routinen Yo no Hinweise en así una Comportamiento gefunden. Aunque se en Programmiersprachen con ActiveX-Unterstützung sí así bastante alles como selbstverständlich vorausgesetzt (lo que el Umsetzung después de Sí lo profano; así schwer macht). Möglicherweise voluntad como el Pointer automáticamente nachgeführt más o menos.
Werde mich otra vez dahinterklemmen, si a el Tiempo es.
Wenn lo no wirklichen ShowStopper mehr son, se XProfan 11 demnächst festgeklopft y endlich a JDS geliefert.
Sombrero en cada Fall Priorität! Falls el a Oktober klappt, hol ego me persönlich en JDS de (Im Herbst zelten a el See es qué feines )
Und una Workaround haben wir sí nun auch
Gracias para el Mühe!
SeeYou Pascal |
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 6 subscriber: |