Hi everybody
I made a simple .NET control that incapsulate a WebView2 browser from Microsoft.
Those are the steps I did:
- Build the library as .NET dll file
- Tested the library using it in a WindowsFrom project: it works (events are fired and handled)
- Used NetDefGen utility to create the COBOL definition for the .NET library
- Made a simple COBOL program that uses the control
- Copied all the needed dll in the same directory the acuthin.exe is
- Created the NetEvents.ini file in the same directory
- Throw Thin-Client a run the COBOL program
The control itself seems to work:
- The control is rendered in the window
- I can set any public property of the .NET control and it works
- 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