Scripts/JfromExcel

From J Wiki
Jump to navigation Jump to search

Notes

Someone asked recently about calling J from Excel on a 64 bit OS.

Here is a simple example using Windows 7 Pro 64, with Excel 2007. I had just installed Excel and J64-602 and ran jreg.bat to register the 64 bit JEXEServer and JDLLServer.

I created the following Macro: [{{#file: "ExcelJMac.txt"}} Download script: ExcelJMac.txt ]

    Sub Main()
        Dim jObject As New JDLLServerLib.JDLLServer
        Rem Dim jObject As New JEXEServerLib.JEXEServer
        Dim rObject As Variant
        Rem jObject = New JDLLServerLib.JDLLServer
        Rem jObject.Do ("11!:0'pc Session;cc e editijx;'")
        Rem jObject.Log (1)
        Rem jObject.Show (1)
        Rem Status = jObject.DoR("2| !/~i.4", rObject)
        Status = jObject.DoR(">(4 8 i.3!:0 <.2^33){'Got J64';'Got J32'", rObject)
        MsgBox ("J DoR ended with status" & Str(Status) & " and result" & vbCrLf & rObject)
        jObject.Quit
    End Sub

I enabled the JDLL reference:

ExcelRefs64.png Excel2010 j701.png

As you can see, the reference is to J64-602.

I ran the code and here is the result:

ExcelDoR.png

I tested on Windows 7_64 with Excel 2007_32 and Excel Beta 2010_64. These tests showed that Excel_32 will only use 32 bit J.DLL and Excel_64 will use 64 bit J.DLL. Both 32 bit J.DLL and 64 bit J.DLL can be registered at the same time.

I just tested with Excel 2010_32 and J701 Beta. I updated the registry using regsvr32 j.dll and added lines to display the J version. Here is the result:

Excel2010 j701.png

Footnotes

<<FootNote>> Fragmentary J.DLL debugging code: [{{#file: "ExcelJDBG.txt"}} Download script: ExcelJDBG.txt ]

   Sub Main()
        Dim jObject As New JDLLServerLib.JDLLServer
        Dim rObject As Variant

        Status = jObject.Do("ARGV_z_=:<'j.exe'")
        Status = jObject.Do("13!:0]1")
        Status = jObject.DoR("0!:0<'C:\Users\me\j602-user\projects\Grapics\exiftoolrt.ijs'", rObject)
        MsgBox ("load:" & Str(Status) & " and result" & vbCrLf & rObject)

        Call DBGJ(jObject)

        Status = jObject.DoR("cotagjpgsdir'd:\JPEG'", rObject)
        MsgBox ("Fn Call:" & Str(Status) & " and result" & vbCrLf & rObject)
        jObject.Quit

    End Sub

    Sub DBGJ(jO As JDLLServerLib.JDLLServer)
        Dim rObject As Variant

        While 1
            resp = InputBox("dbg", "J.DLL debugger")
            Select Case resp
            Case "err"
                Status = jO.DoR("13!:12''", rObject)
                MsgBox ("Error Msg:" & Str(Status) & " and result" & vbCrLf & rObject)
            Case "stack"
                Status = jO.DoR("13!:18''", rObject)
                MsgBox ("Stack:" & Str(Status) & " and result" & vbCrLf & rObject)
            Case "quit"
                Exit Sub
            Case Else
                Status = jO.DoR(resp, rObject)
                MsgBox ("J Immex" & Str(Status) & " and result" & vbCrLf & rObject)
            End Select
        Wend

    End Sub


Contributed by David Mitchell