Page 1 of 2

Erro 9000:

Posted: Tue Jul 21, 2009 6:52 pm
by lailton.webmaster
Unrecoverable error 9000:

Destructors disabled! Destructor of class: 'ToleAuto' Can´t be executed.

why it ?

Re: Erro 9000:

Posted: Tue Jul 21, 2009 6:56 pm
by lailton.webmaster
And erro show only later close App.

thanks

Re: Erro 9000:

Posted: Wed Jul 22, 2009 4:55 am
by lailton.webmaster
I recompile now my project using fwh905 and xharbour 1.2.1 more continue show message
of erro when close app.

Someone can help ? thanks

Re: Erro 9000:

Posted: Wed Jul 22, 2009 6:47 am
by nageswaragunupudi
This was the problem in an earlier version of xharbour. I too experienced this.
You may use xharbour build provided with FWH or latest from xhabour site. This problem does not exist now.

Re: Erro 9000:

Posted: Wed Jul 22, 2009 8:00 am
by lailton.webmaster
ageswaragunupudi,

i´m using last version of xharbour more continue problem.

what you make to solve it ?

thanks

Re: Erro 9000:

Posted: Wed Jul 22, 2009 4:50 pm
by lailton.webmaster
Someone ?

Re: Erro 9000:

Posted: Wed Jul 22, 2009 6:14 pm
by Antonio Linares
Try to assign nil to it:

oOleAutoObject := nil

Re: Erro 9000:

Posted: Wed Jul 22, 2009 10:14 pm
by lailton.webmaster
Antonio,

Im using class CActiveX and have method Release
what´s i need change ?

METHOD Release() CLASS cActiveX
//-----------------------------------------------------------------------------------------------//
If ::hSink != NIL
OleDisconnectEvents( ::hSink )
::hSink:= NIL
EndIf
If ::hObj != NIL
OleFreeDispatch( ::hObj )
::hObj:= NIL
EndIf
::aEvent:= ::aBlock:= NIL
If ::hWnd != NIL
OleWEDestroy( ::hWnd )
::hWnd := NIL
EndIf

Return NIL

in end line i do it

#include "fivewin.ch"
function main()
public oAct, ownd
define window ownd
oAct:=cActiveX():New(ProgId) // progId referente ao meu activeX

activate window ownd
oAct:release()
Release ALL
SysRefresh()

return nil

more when close app continue message Erro.

Thanks

Re: Erro 9000:

Posted: Tue Sep 01, 2009 1:22 pm
by Davide
Antonio,
Antonio Linares wrote:oOleAutoObject := nil
I've received an Error.log from a Client with just the single line:
"Destructors disabled! Destructor of class: 'TOLEAUTO' can't be executed."
No function names, lines or other info in the Error.log

I'm using FWH 9.05 and xH 1.2.1 provided with it.
Where should I put the line you mentioned above in my prg ?

Thanks,
Davide

Re: Erro 9000:

Posted: Tue Sep 01, 2009 5:10 pm
by Antonio Linares
Davide,

Do it in your PRG where you no longer need your used OleAuto object

Re: Erro 9000:

Posted: Wed Sep 02, 2009 2:06 am
by Davide
Antonio,
Antonio Linares wrote:Do it in your PRG where you no longer need your used OleAuto object
I finally could replicate the problem here.

I have a window opened this way (not the main window):

Code: Select all

  DEFINE WINDOW oWnd TITLE cTitle

  oActiveX = TActiveX():New( oWnd, "Shell.Explorer" )
  
  oWnd:oClient := oActiveX // To fill the entire window surface

  oActiveX:Do( "Navigate2",cUrl,,,cPostData,cType)

  ACTIVATE WINDOW oWnd MAXIMIZED VALID (oActiveX:End() , .t.) 

// 02.09.09  oActiveX := nil   // Doesn't cure the problem
// 02.09.09  oActiveX:End()    // Cures the problem, but makes the browser disappear
The problem happens when the program receives a WM_CLOSE message from an external process.
If the window above is still opened, then the error.log file is created and the window doesn't close (the main program is hanged)

Adding oActiveX:=nil after the ACTIVATE doesn't cure the problem.
Adding oActiveX:End() DOES cure it (the window gets closed with the main program by the WM_CLOSE command and no error.log is generated) but this way the browser content disappears as soon as it shown, so I cannot End() the object that way.

Any idea ?

Thanks,
Davide

Re: Erro 9000:

Posted: Wed Sep 02, 2009 7:41 am
by Antonio Linares
Davide,

Please try this change in Class TActiveX:

Code: Select all

   METHOD Destroy() INLINE ActXEnd( ::hActiveX ), ::oOleAuto := nil, Super:Destroy()
 
alternatively try this:

oActiveX:oOleAuto := nil

Re: Erro 9000:

Posted: Thu Sep 03, 2009 1:14 am
by Davide
Antonio,

> METHOD Destroy() INLINE ActXEnd( ::hActiveX ), ::oOleAuto := nil, Super:Destroy()

this unfortunately doesn't work (looks like the program hangs before method Destroy() get fired).

> oActiveX:oOleAuto := nil

This DOES work, but ... (there's always a but) ... I also have a buttonbar on that window that performs some actions on the ActiveX object, and that line (obviously) breaks it.
Any other way to empty that object ONLY when the program receives a WM_CLOSE message ?

Thanks,
Davide

Re: Erro 9000:

Posted: Thu Sep 03, 2009 6:26 am
by Antonio Linares
Davide,

> Any other way to empty that object ONLY when the program receives a WM_CLOSE message ?

Call it from the VALID clause of the window. (WM_CLOSE)

Re: Erro 9000:

Posted: Thu Sep 03, 2009 11:45 am
by Davide
Antonio,
Antonio Linares wrote:Call it from the VALID clause of the window. (WM_CLOSE)
already tried. The program hangs before the VALID of that Window is evaluated (otherwise the oActiveX:End() in the VALID would already correctly work)

I've found a workaround by assigning the object to a local variable before := nil , then, in the toolbar icons I restore it in its place before performing the ACTIONS and, when finished, I assign nil again.

Still searching for a better solution in the class however (perhaps tOleAuto, not tActiveX).

Hi,
Davide