Skip to main content

Hi everybody

I made a simple .NET control that incapsulate a WebView2 browser from Microsoft.

Those are the steps I did:

  1. Build the library as .NET dll file
  2. Tested the library using it in a WindowsFrom project: it works (events are fired and handled)
  3. Used NetDefGen utility to create the COBOL definition for the .NET library
  4. Made a simple COBOL program that uses the control
  5. Copied all the needed dll in the same directory the acuthin.exe is
  6. Created the NetEvents.ini file in the same directory
  7. Throw Thin-Client a run the COBOL program

The control itself seems to work:

  1. The control is rendered in the window
  2. I can set any public property of the .NET control and it works
  3. I can inquire any public property of the .NET control and I have it

There is only a thing that doesn't work: COBOL program doesn't handle any event.

Using the debug, I see the code never pass through the event procedure of the .NET control.

What can I do?

The Thin-Client runtime is 10.2.1 and hosted in a SLES server. The client is a Windows 10 Pro updated to latest version.

COBOL SOURCE (included the code generated by NetDefGen)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. netbrowser.
 
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           DECIMAL-POINT  IS COMMA
           CRT STATUS     IS KEY-STATUS
           EVENT STATUS   IS EVENT-STATUS
           SCREEN CONTROL IS SCREEN-CONTROL
 

      *  ACUCOBOL-GT Version 10200.01000.cc.0 .NET Copy Book - Generated On 28/09/21 21:47:09
      *  Managed assembly, generated by 64-bit NetDefGen.exe
      >>IMP(ACU-CBLFLAGS=-Sl)

           OBJECT @ASSEMBLY
           NAME    "@MicrofocusUI"
           VERSION "1.0.0.0"
           CULTURE "neutral"
           STRONG  "null"


      * FULLY-QUALIFIED-NAME MicrofocusUI.NetBrowser, MicrofocusUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

      * MicrofocusUI.NetBrowser
           NAMESPACE "MicrofocusUI"
           CLASS     "NetBrowser"
           MODULE    "MicrofocusUI.dll"

           CONSTRUCTOR, 0, @CONSTRUCTOR1

      * [Class: NetBrowser] Boolean NavigateTo(System.String)
           METHOD, 0, "@NavigateTo"
               "BSTR" @url, TYPE 8
           RETURNING "boolean", TYPE 11

      * [Class: NetBrowser] Void Dispose()
           METHOD, 0, "@Dispose"

      * [Class: NetBrowser] FireEvent ()
           EVENT, -1680989424, @NetBrowser_FireEvent

           EVENT,   466252086, @NetBrowser_WebMessageReceived


      */=============================================================
      * Definitions for Object
      * (System.Object)
      *==============================================================

           .
 
 
      *--------------------------------------------------------------
       WORKING-STORAGE SECTION.
      *--------------------------------------------------------------
       77    FILLER          PIC X.
             88 W88-FINE     VALUE "S" FALSE "N".
       77    MAIN-WIN        HANDLE OF WINDOW.
       77    W-MSG-EVENT     PIC X(50).
       77    W-EVENT-SENDER  HANDLE OF OBJECT.
       77    W-EVENT-MESSAGE PIC X(50).
 
       77    SMALL-FONT      HANDLE OF FONT.
       77    KEY-STATUS      PIC 9(4).
       01 SCREEN-CONTROL.
           05 ACCEPT-CONTROL          PIC 9.
           05 CONTROL-VALUE           PIC 999.
           05 CONTROL-HANDLE          USAGE HANDLE.
           05 CONTROL-ID              PIC X(2) COMP-X.

       01  EVENT-STATUS
           IS SPECIAL-NAMES EVENT STATUS.
           03  EVENT-TYPE                      PIC X(4) COMP-X.
           03  EVENT-WINDOW-HANDLE             HANDLE OF WINDOW.
           03  EVENT-CONTROL-HANDLE            HANDLE.
           03  EVENT-CONTROL-ID                PIC XX COMP-X.
           03  EVENT-DATA-1                    SIGNED-SHORT.
           03  EVENT-DATA-2                    SIGNED-LONG.
           03  EVENT-ACTION                    PIC X COMP-X.


       78  MSG-NET-EVENT                       VALUE 16437.

 
      *--------------------------------------------------------------
       SCREEN SECTION.
      *--------------------------------------------------------------
       01 SCS-PAG01-D.
          03 LABEL VALUE "Evento:"
             FONT SMALL-FONT
             TRANSPARENT
             LINE 2 COL 4.
 
       01 SCS-PAG01-A.
          03 SC-01-W-MSG-EVENT
             ENTRY-FIELD USING W-MSG-EVENT
             LINES 0,8 CELL
             FONT SMALL-FONT
             LINE 2 COL 15
             3-d LOW
             SIZE 45 CELL
             MAX-TEXT = 50.
          03 SC-01-OPEN-BROWSER push-button
             "Carica web"
             SELF-ACT
             EXCEPTION-VALUE = 610
             FONT SMALL-FONT FLAT
             LINE 2 COL 65
             SIZE 15 CELLS LINES 1 CELLS.
          03 SC-01-EXIT push-button
             "Esci"
             SELF-ACT
             EXCEPTION-VALUE = 620
             FONT SMALL-FONT FLAT
             LINE 2 COL 83
             SIZE 15 CELLS LINES 1 CELLS.
          03 SC-01-NET-BROWSER, "@MicrofocusUI"
             LINE 3,5 COL 2 SIZE 108 CELLS LINES 37 CELLS
             NAMESPACE IS "MicrofocusUI",
             CLASS-NAME IS "NetBrowser",
             CONSTRUCTOR IS CONSTRUCTOR1()
             EVENT PROCEDURE IS BROWSER-EVENT.
 
      *--------------------------------------------------------------
       PROCEDURE DIVISION
      *--------------------------------------------------------------
       INIZIO.
           PERFORM APRI-FINESTRA 
           PERFORM GESTISCI-FINESTRA
      *--- dispose per rilasciare risorse (dovrebbe fermare il timer)          
           MODIFY SC-01-NET-BROWSER "Dispose"()
           DESTROY SC-01-NET-BROWSER 
           DESTROY ALL CONTROLS
      *--- chiusura finestra
           CLOSE WINDOW MAIN-WIN
           .
       FINE.
           GOBACK.

       APRI-FINESTRA.
           DISPLAY INDEPENDENT WINDOW TITLE-BAR
                   TITLE "TEST .NET"
                   SCREEN LINE 10 SCREEN POS 10
                   LINES 40 SIZE 110
                   COLOR 65793
                   FONT SMALL-FONT
                   CONTROL FONT SMALL-FONT
                   CELL SIZE = ENTRY-FIELD FONT SEPARATE
                   SYSTEM MENU
                   HANDLE MAIN-WIN

           DISPLAY SCS-PAG01-D SCS-PAG01-A
           .
       EX-APRI-FINESTRA.
           EXIT.

       GESTISCI-FINESTRA.
            SET W88-FINE TO FALSE
            PERFORM WITH TEST AFTER UNTIL W88-FINE
               ACCEPT SCS-PAG01-A
                  ON EXCEPTION
                     PERFORM CONTROLLA-STATUS
               END-ACCEPT
            END-PERFORM.
           .
       EX-GESTISCI-FINESTRA.
           EXIT.

       CONTROLLA-STATUS.
           EVALUATE KEY-STATUS
              WHEN 610 PERFORM NAVIGA
              WHEN 620 SET W88-FINE TO TRUE
           END-EVALUATE.
       EX-CONTROLLA-STATUS.
           EXIT.
 
       NAVIGA.
            MODIFY SC-01-NET-BROWSER
               "NavigateTo"("http://www.google.com")
            .
       EX-NAVIGA.
            EXIT.
 
 
       BROWSER-EVENT.
            IF EVENT-TYPE = MSG-NET-EVENT
               EVALUATE EVENT-DATA-2
                  WHEN @NetBrowser_WebMessageReceived
                     CALL "C$GETNETEVENTDATA" USING
                          @NetBrowser_WebMessageReceived
                          W-EVENT-SENDER
                          W-EVENT-MESSAGE
                     END-CALL
                     IF W-EVENT-MESSAGE NOT = SPACES
                        MOVE W-EVENT-MESSAGE TO W-MSG-EVENT
                        MODIFY SC-01-W-MSG-EVENT VALUE W-MSG-EVENT
                     END-IF
                  WHEN @NetBrowser_FireEvent
                     DISPLAY MESSAGE BOX "EvEnTo .NeT"
               END-EVALUATE
            END-IF
            .
       EX-BROWSER-EVENT.
            EXIT.
 

.NET control code (so you can see how I raised the events)

using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Windows.Forms;
using System.Windows.Threading;

namespace MicrofocusUI
{


    public delegate void EventFired();


    public partial class NetBrowser: UserControl, IDisposable
    {
        public NetBrowser()
        {
            InitializeComponent();
            SetTimer();
        }



        private System.Timers.Timer timer { get; set; }

        private void SetTimer()
        {
            timer = new System.Timers.Timer(10000);
            timer.Elapsed += Timer_Elapsed;
            timer.AutoReset = true;
            timer.Enabled = true;
            timer.Start();
        }

        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            // None of the events is handled by COBOL
            
            // Event with parameter
            var txt = $"Timer: {DateTime.Now.ToLongTimeString()}";
            WebMessageReceived?.Invoke(this, message);
            
            // Event without parameter
            FireEvent?.Invoke();
        }

        public event EventFired FireEvent;

        public event EventHandler<string> WebMessageReceived;


        public bool NavigateTo(string url)
        {
           // Navigate to URL (it works)
        }


        public new void Dispose()
        {
            StopTimer();
            Dispose(true);
        }
        
        

        private void StopTimer()
        {
            timer.Enabled = false;
            timer.Elapsed -= Timer_Elapsed;
            timer.Stop();
            timer.Dispose();
        }

        
    }
}


#Events
#extend32-bitRuntime
#Interoperating
#Acuthin
#.net

Hi everybody

I made a simple .NET control that incapsulate a WebView2 browser from Microsoft.

Those are the steps I did:

  1. Build the library as .NET dll file
  2. Tested the library using it in a WindowsFrom project: it works (events are fired and handled)
  3. Used NetDefGen utility to create the COBOL definition for the .NET library
  4. Made a simple COBOL program that uses the control
  5. Copied all the needed dll in the same directory the acuthin.exe is
  6. Created the NetEvents.ini file in the same directory
  7. Throw Thin-Client a run the COBOL program

The control itself seems to work:

  1. The control is rendered in the window
  2. I can set any public property of the .NET control and it works
  3. I can inquire any public property of the .NET control and I have it

There is only a thing that doesn't work: COBOL program doesn't handle any event.

Using the debug, I see the code never pass through the event procedure of the .NET control.

What can I do?

The Thin-Client runtime is 10.2.1 and hosted in a SLES server. The client is a Windows 10 Pro updated to latest version.

COBOL SOURCE (included the code generated by NetDefGen)

       IDENTIFICATION DIVISION.
       PROGRAM-ID. netbrowser.
 
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       SPECIAL-NAMES.
           DECIMAL-POINT  IS COMMA
           CRT STATUS     IS KEY-STATUS
           EVENT STATUS   IS EVENT-STATUS
           SCREEN CONTROL IS SCREEN-CONTROL
 

      *  ACUCOBOL-GT Version 10200.01000.cc.0 .NET Copy Book - Generated On 28/09/21 21:47:09
      *  Managed assembly, generated by 64-bit NetDefGen.exe
      >>IMP(ACU-CBLFLAGS=-Sl)

           OBJECT @ASSEMBLY
           NAME    "@MicrofocusUI"
           VERSION "1.0.0.0"
           CULTURE "neutral"
           STRONG  "null"


      * FULLY-QUALIFIED-NAME MicrofocusUI.NetBrowser, MicrofocusUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

      * MicrofocusUI.NetBrowser
           NAMESPACE "MicrofocusUI"
           CLASS     "NetBrowser"
           MODULE    "MicrofocusUI.dll"

           CONSTRUCTOR, 0, @CONSTRUCTOR1

      * [Class: NetBrowser] Boolean NavigateTo(System.String)
           METHOD, 0, "@NavigateTo"
               "BSTR" @url, TYPE 8
           RETURNING "boolean", TYPE 11

      * [Class: NetBrowser] Void Dispose()
           METHOD, 0, "@Dispose"

      * [Class: NetBrowser] FireEvent ()
           EVENT, -1680989424, @NetBrowser_FireEvent

           EVENT,   466252086, @NetBrowser_WebMessageReceived


      */=============================================================
      * Definitions for Object
      * (System.Object)
      *==============================================================

           .
 
 
      *--------------------------------------------------------------
       WORKING-STORAGE SECTION.
      *--------------------------------------------------------------
       77    FILLER          PIC X.
             88 W88-FINE     VALUE "S" FALSE "N".
       77    MAIN-WIN        HANDLE OF WINDOW.
       77    W-MSG-EVENT     PIC X(50).
       77    W-EVENT-SENDER  HANDLE OF OBJECT.
       77    W-EVENT-MESSAGE PIC X(50).
 
       77    SMALL-FONT      HANDLE OF FONT.
       77    KEY-STATUS      PIC 9(4).
       01 SCREEN-CONTROL.
           05 ACCEPT-CONTROL          PIC 9.
           05 CONTROL-VALUE           PIC 999.
           05 CONTROL-HANDLE          USAGE HANDLE.
           05 CONTROL-ID              PIC X(2) COMP-X.

       01  EVENT-STATUS
           IS SPECIAL-NAMES EVENT STATUS.
           03  EVENT-TYPE                      PIC X(4) COMP-X.
           03  EVENT-WINDOW-HANDLE             HANDLE OF WINDOW.
           03  EVENT-CONTROL-HANDLE            HANDLE.
           03  EVENT-CONTROL-ID                PIC XX COMP-X.
           03  EVENT-DATA-1                    SIGNED-SHORT.
           03  EVENT-DATA-2                    SIGNED-LONG.
           03  EVENT-ACTION                    PIC X COMP-X.


       78  MSG-NET-EVENT                       VALUE 16437.

 
      *--------------------------------------------------------------
       SCREEN SECTION.
      *--------------------------------------------------------------
       01 SCS-PAG01-D.
          03 LABEL VALUE "Evento:"
             FONT SMALL-FONT
             TRANSPARENT
             LINE 2 COL 4.
 
       01 SCS-PAG01-A.
          03 SC-01-W-MSG-EVENT
             ENTRY-FIELD USING W-MSG-EVENT
             LINES 0,8 CELL
             FONT SMALL-FONT
             LINE 2 COL 15
             3-d LOW
             SIZE 45 CELL
             MAX-TEXT = 50.
          03 SC-01-OPEN-BROWSER push-button
             "Carica web"
             SELF-ACT
             EXCEPTION-VALUE = 610
             FONT SMALL-FONT FLAT
             LINE 2 COL 65
             SIZE 15 CELLS LINES 1 CELLS.
          03 SC-01-EXIT push-button
             "Esci"
             SELF-ACT
             EXCEPTION-VALUE = 620
             FONT SMALL-FONT FLAT
             LINE 2 COL 83
             SIZE 15 CELLS LINES 1 CELLS.
          03 SC-01-NET-BROWSER, "@MicrofocusUI"
             LINE 3,5 COL 2 SIZE 108 CELLS LINES 37 CELLS
             NAMESPACE IS "MicrofocusUI",
             CLASS-NAME IS "NetBrowser",
             CONSTRUCTOR IS CONSTRUCTOR1()
             EVENT PROCEDURE IS BROWSER-EVENT.
 
      *--------------------------------------------------------------
       PROCEDURE DIVISION
      *--------------------------------------------------------------
       INIZIO.
           PERFORM APRI-FINESTRA 
           PERFORM GESTISCI-FINESTRA
      *--- dispose per rilasciare risorse (dovrebbe fermare il timer)          
           MODIFY SC-01-NET-BROWSER "Dispose"()
           DESTROY SC-01-NET-BROWSER 
           DESTROY ALL CONTROLS
      *--- chiusura finestra
           CLOSE WINDOW MAIN-WIN
           .
       FINE.
           GOBACK.

       APRI-FINESTRA.
           DISPLAY INDEPENDENT WINDOW TITLE-BAR
                   TITLE "TEST .NET"
                   SCREEN LINE 10 SCREEN POS 10
                   LINES 40 SIZE 110
                   COLOR 65793
                   FONT SMALL-FONT
                   CONTROL FONT SMALL-FONT
                   CELL SIZE = ENTRY-FIELD FONT SEPARATE
                   SYSTEM MENU
                   HANDLE MAIN-WIN

           DISPLAY SCS-PAG01-D SCS-PAG01-A
           .
       EX-APRI-FINESTRA.
           EXIT.

       GESTISCI-FINESTRA.
            SET W88-FINE TO FALSE
            PERFORM WITH TEST AFTER UNTIL W88-FINE
               ACCEPT SCS-PAG01-A
                  ON EXCEPTION
                     PERFORM CONTROLLA-STATUS
               END-ACCEPT
            END-PERFORM.
           .
       EX-GESTISCI-FINESTRA.
           EXIT.

       CONTROLLA-STATUS.
           EVALUATE KEY-STATUS
              WHEN 610 PERFORM NAVIGA
              WHEN 620 SET W88-FINE TO TRUE
           END-EVALUATE.
       EX-CONTROLLA-STATUS.
           EXIT.
 
       NAVIGA.
            MODIFY SC-01-NET-BROWSER
               "NavigateTo"("http://www.google.com")
            .
       EX-NAVIGA.
            EXIT.
 
 
       BROWSER-EVENT.
            IF EVENT-TYPE = MSG-NET-EVENT
               EVALUATE EVENT-DATA-2
                  WHEN @NetBrowser_WebMessageReceived
                     CALL "C$GETNETEVENTDATA" USING
                          @NetBrowser_WebMessageReceived
                          W-EVENT-SENDER
                          W-EVENT-MESSAGE
                     END-CALL
                     IF W-EVENT-MESSAGE NOT = SPACES
                        MOVE W-EVENT-MESSAGE TO W-MSG-EVENT
                        MODIFY SC-01-W-MSG-EVENT VALUE W-MSG-EVENT
                     END-IF
                  WHEN @NetBrowser_FireEvent
                     DISPLAY MESSAGE BOX "EvEnTo .NeT"
               END-EVALUATE
            END-IF
            .
       EX-BROWSER-EVENT.
            EXIT.
 

.NET control code (so you can see how I raised the events)

using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Windows.Forms;
using System.Windows.Threading;

namespace MicrofocusUI
{


    public delegate void EventFired();


    public partial class NetBrowser: UserControl, IDisposable
    {
        public NetBrowser()
        {
            InitializeComponent();
            SetTimer();
        }



        private System.Timers.Timer timer { get; set; }

        private void SetTimer()
        {
            timer = new System.Timers.Timer(10000);
            timer.Elapsed += Timer_Elapsed;
            timer.AutoReset = true;
            timer.Enabled = true;
            timer.Start();
        }

        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            // None of the events is handled by COBOL
            
            // Event with parameter
            var txt = $"Timer: {DateTime.Now.ToLongTimeString()}";
            WebMessageReceived?.Invoke(this, message);
            
            // Event without parameter
            FireEvent?.Invoke();
        }

        public event EventFired FireEvent;

        public event EventHandler<string> WebMessageReceived;


        public bool NavigateTo(string url)
        {
           // Navigate to URL (it works)
        }


        public new void Dispose()
        {
            StopTimer();
            Dispose(true);
        }
        
        

        private void StopTimer()
        {
            timer.Enabled = false;
            timer.Elapsed -= Timer_Elapsed;
            timer.Stop();
            timer.Dispose();
        }

        
    }
}


#Events
#extend32-bitRuntime
#Interoperating
#Acuthin
#.net

Good morning, PiGi

Can you try copying the following libraries to the acuthin.exe folder:

-AcuToNet.dll
-Marshal.exe
-VarCallback.dll

And register them by following the Documentation at https://bit.ly/39NfAcG

These DLLs are usually provided within a Windows installation, alongside the runtime.

Since your server installation is a Linux porting, I suggest you to open a Case in the new https://portal.microfocus.com/

A Customer Care engineer will provide you with what's necessary to complete the installation.

Looking forward for your feedback.


Good morning, PiGi

Can you try copying the following libraries to the acuthin.exe folder:

-AcuToNet.dll
-Marshal.exe
-VarCallback.dll

And register them by following the Documentation at https://bit.ly/39NfAcG

These DLLs are usually provided within a Windows installation, alongside the runtime.

Since your server installation is a Linux porting, I suggest you to open a Case in the new https://portal.microfocus.com/

A Customer Care engineer will provide you with what's necessary to complete the installation.

Looking forward for your feedback.

Hi Claudio

I see that AcuToNet.dll and Marshal.exe are already in the acuthin.exe path.

I can't find the VarCallback.dll library. Where can I find it for make a copy in the same path?

About the registration, I don't find the regasm20/40 commands. Where are they?


Hi Claudio

I see that AcuToNet.dll and Marshal.exe are already in the acuthin.exe path.

I can't find the VarCallback.dll library. Where can I find it for make a copy in the same path?

About the registration, I don't find the regasm20/40 commands. Where are they?

The missing DLLs and the regasm20/40 tools are usually provided within a Windows installation, alongside the runtime.

Since your server installation is a Linux porting, I suggest you to open a Case in the new https://portal.microfocus.com/

A Customer Care engineer will provide you with what's necessary to complete the installation.

Looking forward for your feedback.