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
