Hi Eric,

It worked!!!

I was supposed to do it this afternoon but it kept nagging me so I did
it during my lunch break and it worked as you said. I guess the reason
my test failing is this part:
> create a window (the one you already did, but make sure it works)

Thanks ... and as soon as I'm done with my migration for my day job ...
I'll work on my J-Wiki samples. :D

Thanks again.

r/alex

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Eric Iverson
Sent: Thursday, August 14, 2008 8:02 AM
To: Programming forum
Subject: Re: [Jprogramming] J602a Crash after .NET App Quit

I just ran a few tests and it seems you need a form with an ijx window
to
avoid the crash. It does not need to be shown.

Add the code:
   jObject.Do("11!:0'pc abc;cc e editijx;'");

after the Quit() call in Form1_Load_1
This doesn't make any sense, but appears to be a workaround.
On Wed, Aug 13, 2008 at 6:28 PM, Eric Iverson
<[EMAIL PROTECTED]>wrote:

>  The most likely thing loading profile does that avoids the crash is
to
> create an ijx window which is then shown. I suspect that this problem
is
> related to the one discovered earlier by Devon where 11!:0'pc foo' was
an
> adequate workaround.
>
> I suggest trying experiments without loading profile and
creating/showing
> windows in slightly different ways to get a workaround. For example:
>
> create a window (the one you already did, but make sure it works)
> create and show a window
> create two windows
> create and show two windows
> create a window with an ijx control
>  create a window with an ijx control and show it
>
> These tests may lead you to a kludge workaround.
>
> I will probably be work on the root of this problem in a week or so
and
> will report back what I find.
>   On Wed, Aug 13, 2008 at 2:31 PM, Oleg Kobchenko
<[EMAIL PROTECTED]>wrote:
>
>> Since it was established that loading profile DOES NOT
>> crash J, it should be possible, by elimination, to narrow
>> it down to the code that actually prevents crashing.
>> With two benefits: allow to ship with only limited
>> code; may shed light on nature of the problem.
>>
>>
>>
>> > From: Alex Rufon <[EMAIL PROTECTED]>
>> >
>> > Hi.
>> >
>> > I was wondering if anybody got some headway with this problem of
mine.
>> >
>> > I would appreciate any insight on the problem.
>> >
>> > r/alex
>> >
>> > NOTE:
>> > This is me saying "bump".
>> >
>> >
>> > -----Original Message-----
>> > From: [EMAIL PROTECTED]
>> > [mailto:[EMAIL PROTECTED] On Behalf Of Alex Rufon
>> > Sent: Thursday, August 07, 2008 5:14 PM
>> > To: Programming forum
>> > Subject: RE: [Jprogramming] J602a Crash after .NET App Quit
>> >
>> > Hello.
>> >
>> > It took some time for me to test since I had to attend a few brain
>> > numbing meetings today.
>> >
>> > Ok. Here is what I got. I followed Oleg's advice and added the
following
>> > code to the form:
>> >         ///
>> >         /// Clean up any resources being used.
>> >         ///
>> >         /// true if managed resources should be
>> > disposed; otherwise, false.
>>  >         protected override void Dispose(bool disposing)
>> >         {
>> >             if (disposing && (components != null))
>> >             {
>> >                 components.Dispose();
>> >             }
>> >
>> >             if (jObject != null)
>> >             {
>> >                 Marshal.FinalReleaseComObject(jObject);
>> >                 jObject = null;
>> >             }
>> >
>> >             base.Dispose(disposing);
>> >         }
>> >
>> > As what he said, J crashes when this code is executed:
>> > Marshal.FinalReleaseComObject(jObject);
>> >
>> > Then I tried out Devon's suggestion and modified the form load to
this:
>> >         private void Form1_Load(object sender, EventArgs e)
>> >         {
>> >             jObject = new JEXEServerLib.JEXEServerClass();
>> >             jObject.Quit();
>> >             jObject.Log(1);
>> >
>> >             jObject.Do("11!:0 'pc dummyForm'");
>> >             jObject.Do("[res=: 'The answer is 42'");
>> >             object objTest;
>> >             jObject.GetB("res", out objTest);
>> >             string jScript = (string)objTest;
>> >             MessageBox.Show(jScript);
>> >
>> >         }
>> >
>> > Even with the code above, J still crashes. Am I doing this right?
>> >
>> > So I then tried a different approach which is to load the profile:
>> >         private void Form1_Load(object sender, EventArgs e)
>> >         {
>> >             jObject = new JEXEServerLib.JEXEServerClass();
>> >             jObject.Quit();
>> >             jObject.Log(1);
>> >
>> >             jObject.Do("BINPATH_z_=: 1!:46 ''");
>> >             jObject.Do("ARGV_z_=: ,<'oleclient'");
>> >             jObject.Do("0!:0
>>  >             jObject.Show(1);
>> >             object objTest;
>> >             jObject.GetB("BINPATH", out objTest);
>> >             string jScript = (string)objTest;
>> >             MessageBox.Show(jScript);
>> >         }
>> >
>> > This one DOES NOT crash but defeats the purpose of only
distributing
>> > J.EXE and J.DLL with the IJS script since it requires a full
install of
>> > J.
>> >
>> > I would appreciate any help or suggestions.
>> >
>> > Thanks.
>> >
>> > r/alex
>> >
>> > -----Original Message-----
>> > From: [EMAIL PROTECTED]
>> > [mailto:[EMAIL PROTECTED] On Behalf Of Oleg
Kobchenko
>> > Sent: Thursday, August 07, 2008 1:55 AM
>> > To: Programming forum
>> > Subject: Re: [Jprogramming] J602a Crash after .NET App Quit
>> >
>> > >From what I can see, in the end you do
>> >
>> > >             jObject = null;
>> >
>> > which causes object destruction on the GC thread,
>> > but it was created on the main thread. This may be disastrous.
>> >
>> > To avoid this, you need to release COM object explicitly
>> > (google it):
>> >
>> >         #region IDisposable Members
>> >
>> >         public void Dispose() {
>> >             if (_comobj != null) {
>> >                 Marshal.FinalReleaseComObject(_comobj);
>> >                 GC.SuppressFinalize(_comobj);
>> >                 _comobj = null;
>> >             } else {
>> >                 // MyTrace.Write("Disposing uninitialized
object.");
>> >             }
>> >         }
>> >
>> > (Also, shouldn't it be FormClosed event?)
>> >
>> > However, this does not fix the error, only to track it easily.
>> > It allows to place the breakpoint and see that the crash
>> > happens in release:
>> >
>> >     Marshal.FinalReleaseComObject(_comobj);
>> >
>> > Switching back to j601 does not reproduce the error.
>> >
>> > wd 'pc f;...pshow...' does not help.
>> >
>> > Crash details:
>> >
>> > Unhandled exception at 0x7c915375 (ntdll.dll) in j.exe: 0xC0000005:
>> > Access violation reading location 0x00e3000c.
>> >
>> > >    ntdll.dll!bsearch()  + 0x1a2 bytes
>> >      [Frames below may be incorrect and/or missing, no symbols
loaded
>> > for ntdll.dll]
>> >      ntdll.dll!bsearch()  + 0x157 bytes
>> >      ntdll.dll!bsearch()  + 0xba bytes
>> >      ntdll.dll!RtlFindActivationContextSectionString()  + 0x80
bytes
>> >      ntdll.dll!RtlDosApplyFileIsolationRedirection_Ustr()  + 0x34e
bytes
>> >
>> >      ntdll.dll!RtlDosApplyFileIsolationRedirection_Ustr()  + 0x20f
bytes
>> >
>> >      ntdll.dll!LdrGetDllHandleEx()  + 0xa7 bytes
>> >      ntdll.dll!LdrGetDllHandle()  + 0x18 bytes
>> >      kernel32.dll!GetModuleHandleW()  + 0x57 bytes
>> >      kernel32.dll!GetModuleHandleW()  + 0x16e bytes
>> >      kernel32.dll!GetModuleHandleW()  + 0x1f bytes
>> >      kernel32.dll!GetModuleHandleA()  + 0x1f bytes
>> >      j.exe!00453a98()
>> >      j.exe!00453abc()
>> >      j.exe!00453ce1()
>> >      j.exe!00453d06()
>> >      j.exe!00418073()
>> >      j.exe!004189fc()
>> >      j.exe!00430f54()
>> >      ole32.dll!DcomChannelSetHResult()  + 0x190 bytes
>> >      ole32.dll!77600b36()
>> >      ole32.dll!77600b43()
>> >      j.exe!0042d0a4()
>> >      j.exe!0042f5b7()
>> >      j.exe!0043f767()
>> >      j.exe!0042a882()
>> >      j.exe!00435a6a()
>> >      j.exe!0042f644()
>> >      user32.dll!GetDC()  + 0x6d bytes
>> >      user32.dll!GetDC()  + 0x14f bytes
>> >      user32.dll!GetWindowLongW()  + 0x127 bytes
>> >      user32.dll!DispatchMessageW()  + 0xf bytes
>> >      j.exe!00418230()
>> >      j.exe!00417c54()
>> >      j.exe!0046756e()
>> >      j.exe!0045143d()
>> >      kernel32.dll!RegisterWaitForInputIdle()  + 0x49 bytes
>> >
>> >
>> > > From: Alex Rufon
>> > >
>>  > > I'm currently in the process of migrating to J602a (again) and I
hit
>> a
>> > > brick wall. J would crash right after the calling .NET
application
>> > > exits.
>> > >
>> > > First off, I'm using the following softwares:
>> > > 1. Vista Ultimate
>> > > 2. C# on Visual Studio .NET 2005 Professional Edition
>> > >
>> > > Since I know that not everyone has my version of Visual Studio
.NET, I
>> > > replicated the problem using the FREE Visual Studio .NET 2008
Express
>> > > Edition. You can download a copy from here:
>> > > http://www.microsoft.com/express/default.aspx
>> > >
>> > > So follow these steps to replicate the crash:
>> > > 1. Run Microsoft Visual C# 2008 Express Edition
>> > > 2. Create a new Windows Application project. The automatically
created
>> > > project should have a form named form1
>> > > 3. Add a reference to J602\bin\j.exe
>> > > 4. Add a button to form1
>> > > 5. Add the following code into form1:
>> > >
>> > > using System;
>> > > using System.Collections.Generic;
>> > > using System.ComponentModel;
>> > > using System.Data;
>> > > using System.Drawing;
>> > > using System.Linq;
>> > > using System.Text;
>> > > using System.Windows.Forms;
>> > >
>> > > namespace WindowsFormsApplication1
>> > > {
>> > >     public partial class Form1 : Form
>> > >     {
>> > >         private JEXEServerLib.JEXEServerClass jObject;
>> > >         public Form1()
>> > >         {
>> > >             InitializeComponent();
>> > >         }
>> > >
>> > >         private void Form1_Load(object sender, EventArgs e)
>> > >         {
>> > >             jObject = new JEXEServerLib.JEXEServerClass();
>> > >             jObject.Quit();
>> > >         }
>> > >
>> > >         private void button1_Click(object sender, EventArgs e)
>> > >         {
>> > >             jObject.Do("[res=: i. 1024 1024");
>> > >         }
>> > >
>> > >         private void Form1_FormClosing(object sender,
>> > > FormClosingEventArgs e)
>> > >         {
>> > >             jObject = null;
>> > >         }
>> > >     }
>> > >
>> > > }
>> > >
>> > > As you can see from the code above. This project will do nothing
but
>> > > create an instance of J when it loads. A button that would just
make a
>> > > 1024x1024 matrix inside the J instance and then set the jObject
>> > variable
>> > > to nothing when it closes.
>> > >
>> > > The problem is that after this application closes, J will crash
>> > > spectacularly. :)
>> > >
>> > > I have tested this in VB.NET <http://vb.net/> and C# in both
Visual
>> Studio .NET 2005
>> > > Professional and 2008 Express edition.
>> > >
>> > > I am hoping that I am just missing a step somewhere. Like maybe I
need
>> > > to call a "release" manually? Any insight would be helpful.
>> > >
>> > > Thanks.
>> > >
>> > > r/alex
>> > >
----------------------------------------------------------------------
>> > > For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >
>> >
>> >
>> >
>> >
----------------------------------------------------------------------
>> > For information about J forums see
http://www.jsoftware.com/forums.htm
>> >
----------------------------------------------------------------------
>> > For information about J forums see
http://www.jsoftware.com/forums.htm
>> >
----------------------------------------------------------------------
>> > For information about J forums see
http://www.jsoftware.com/forums.htm
>>
>>
>>
>>
>>
----------------------------------------------------------------------
>> For information about J forums see
http://www.jsoftware.com/forums.htm
>>
>
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to