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