-
Re: VB6 WebView2-Binding (Edge-Chromium)
Found two problems, help to have a look.
webview2 loading objects is slow, can you do an asynchronous version, as long as you set the URL, the background will automatically create, create an event after completion. And then go to the website
HTML Code:
Set Webview1 = New_c.WebView2
Webview1.BindTo(UserControl.hWnd)
Code:
Set Webview1 = New_c.WebView2
webview1.NewWebViewAnsy(picture1.hwnd,URL AS STRING)
SUB NewWebViewAnsy(ParentHwnd as long,Url1) IN CreateThread or ansy
Webview1.BindTo(UserControl.hWnd)
raiseevent WebviewLoadOK()
Webview1.Navigate URL1
end sub
Url without http added will Navigate and crash Webview1.Navigate "baidu.com
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
xiaoyao
webview2 loading objects is slow, can you do an asynchronous version
Async mode is already built-in, via the SecondsToWaitForCompletion-parameter.
(in the Constructor/Bind and also in the Navigate-Methods).
There is also an Event, which signalizes a successful binding (the InitComplete-Event).
Here is an example, how to work asynchronously (with constructor-binding and navigation):
Code:
Option Explicit
Private WithEvents WV As cWebView2
Private Sub Form_Load()
Set WV = New_c.WebView2(hWnd, 0) '<- setting the "TimeToWait" to 0, will do this bind-call asynchronously
Debug.Print "now exiting Form_Load (relying on WV_InitComplete)"
End Sub
Private Sub Form_Resize()
If Not WV Is Nothing Then WV.SyncSizeToHostWindow
End Sub
Private Sub WV_InitComplete()
Debug.Print "InitComplete"
WV.Navigate "https://google.com", 0 '<- same 0-TimeToWait for an async Nav-method-call
End Sub
Quote:
Originally Posted by
xiaoyao
Url without http added will Navigate and crash Webview1.Navigate "baidu.com
It does not "crash" - instead what it does, is raising an Error 5 (wrong argument).
And a wrong argument means (in this case), that the URL-Param requires a "protocol-prefix"
(like "http://" or "https://")
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
WV_InitComplete()
This is a good way.
If at the beginning of the binding object, directly set the URL to complete the asynchronous do not have to pay attention to, so better.
The radio parameters are done automatically as if it were a multi-threaded delegate, and then notify me.I mainly use it to load 10 webview controls at the same time in one second, and each control opens the URL according to the array, so I just need to send out the task and he will finish it in the background.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
It would be better if 64-bit rc6.dll can be developed. Only some functions can be realized. Can you support the function of creating websocket server, so that I can directly open Google browser and use the plug-in ws://127.0.0.1 Connect to the RC6 point dll. I don't know if webview2 object supports edge and Google plug-in. If not, I will load a js URL or local script. Pytho operates Google and edge driver, and they provide more functions and are more convenient. So if you use this, there is still a lot of code to be implemented in js.
rc6.DLL,Is it possible to remove sqlite3.dll if you are not using a database?
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
saturnian
To test, I wrote a multi-tab browser, which begins to work well.
François
Have you ever developed a custom control to wrap webview2?
So you can use it like webbrowser. I have encountered many puzzling problems, such as the size has not changed and I can't display the web page.Is there any way to operate in an Excel vba,vbs file? It will automatically open an edge browser window or a simple form display page. You don't need to bind to a handle. And if you click on a web page, it will pop up a new tab or page. Can you also read its contents with code?
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
tmighty2
If I have added code using "AddScriptToExecuteOnDocumentCreated", how would I clear that again?
... .. .
Dear Olaf,
I also need a way to remove the script added via "AddScriptToExecuteOnDocumentCreated". Thanks a lot for your answers in connection with this but I did not find them helping me in my case. So, I tried my very best (for the past 3 days or so, whenever I could get time) to find a way out (some sort of hack at least) to tackle this issue but I am unable to, so far. So, I am stuck.
Today, though, when browsing the net in connection with the above issue, I came across this page - https://learn.microsoft.com/en-gb/mi...ocumentcreated ( RemoveScriptToExecuteOnDocumentCreated ). Reading what this function does, it seems like this is what I require. But then, you are the expert. May be the aforesaid function does NOT exactly do what I require. If so, kindly bear with me and kindly let me know the same. On the other hand, if at all the aforesaid function indeed does what I require, then I request you to kindly include it in RC6 WV, if at all possible. It will simplify my tasks like anything. I would be much grateful to you for the same.
I take this opportunity to once again thank you in tons for all your contributions and support.
Kind Regards.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
saturnian
In addition, my current project is almost finished. In a few months, I will start to develop a scripting language and IDE similar to VB6 (of course, the development time is also calculated in years). If you could provide some good seeds (prototypes or suggestions), maybe I can develop a decent scripting language and IDE, and this IDE may be applied to your VB6-compatible compiler.
(From dm)
I don't know how it goes now. Where can I download the preview version?
-
Re: VB6 WebView2-Binding (Edge-Chromium)
- then instantiate New_c regfree within your App (via a declared DirectCOM.dll GetInstance or GetInstanceEx-call)
- and then initiate the Binding by a Class-instance, derived via New_c.WebView
1,rc6.dll
2,sqlite3.dll
3,webview2load.dll
4,DirectCOM.dll
5,abc.exe >> bind to vb6 picture1.hwnd
This requires so many files that I don't mind the file size.
DirectCOM.dll,In fact, the output API can be implemented directly in rc6.dll. The ActiveX DLL object can also output the stdcall API,
If SQLite 3.dll can specify the path, it would be better to modify the file name. Register rc6.dll without sqlite3.dll, I just load it when I need it, that's fine.
An interface can be added,Display a web page window directly without writing any code.
like this in vb6
Code:
Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate "http://www.baidu.com"
ie.visible=true
quick open url on excel vba,or vbscript:
Code:
Public Declare Function DirectCom_Create Lib "rc7.dll" Alias "GETINSTANCE" (FName As String, className As String) As Object
Public Declare Function NewWindow Lib "rc7.dll" (byval url As String) As Object
dim web2 as object
set web2=DirectCom_Create("rc7.dll","cwebview2")
web2.NewWindow("http://www.baidu.com")
web2.visible=true
or
Code:
dim web2 as object
set web2=NewWindow("http://www.baidu.com")
web2.visible=true
like new version of rc7.dll
rc7.vpb add text to end:
[VBCompiler]
LinkSwitches=-EXPORT:NewWindow -Export:GetInstance -Export:AutoSetup -Export:CheckSetup -Export:Add -EXPORT:ShowForm1
Code:
Dim Web1 As CwebView2
Public Function NewWindow(Url As String) As CwebView2
Set Web1 = New CwebView2
Web1.Navigate Url
Set NewWindow = Web1
End Function
Public Function GetInstance(FName As String, className As String) As Object
'**** code
End Function
Public Function AutoSetup() As Boolean
'download Url = "https://go.microsoft.com/fwlink/p/?LinkId=2124703"
'download Url to Edge_Webview2RunTime.exe
'ShellWait(App.Path & "\Edge_Webview2RunTime.exe /silent /install"
End Function
Public Function CheckSetup() As Boolean
'
End Function
-
Re: VB6 WebView2-Binding (Edge-Chromium)
We are trying to create an adblocker.
Here is what my collegue would like to ask:
Is it possible to use AddWebResourceRequestedFilter method?
I can't write to form, it says I am not authorized.
Can you give an example about using AddWebResourceRequestedFilter method, if possible?
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Want to turn rc6.dll Cwebview2 objects into a portable browser, without any ads and other menus
You can call the
Code:
rundll32.exe rc6.dll,WebViewOpenurl,https://www.163.com
with the vbs
Methods like this. This displays the form interface in the dll and loads a web page
Features that can be achieved, automatically maximize the form, or hide the top navigation bar of the form. Pure web pages can also be mobile.
Set the form size, remember the form size, the next time open or the same location.
Main purpose, quickly open some web pages, or form the top way to load web page applications. Like a mobile web-page calculator.
Or are shown as the front end of the PYTHON. PYTHON The back-end uses the websocket service to receive the data, enter the web page order, and deposit PY in the database.
You can directly use VBS and EXCEL VBA to load web pages to obtain objects, control webview2 objects, send JS commands, and collect web page content.
Code:
SET WEB=createobject("rc6.cwebview2")
web.WindowOpen("https://www.baidu.com")
web.visiable=true
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
xiaoyao
Want to turn rc6.dll Cwebview2 objects into a portable browser...
Why use "rundll.exe", when you can compile a small executable with VB6 - and make it load the New_c in a regfree manner -
via the already outlined methods, as e.g. here: https://www.vbforums.com/showthread....ectCOM-amp-RC6
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
The problem is that we are missing the WebResourceRequested event.
Event WebResourceResponseReceived(ReqURI As String, ReqMethod As String, RespStatus As Long, RespReasonPhrase As String, RespHeaders As cCollection) is already too late, I think.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
tmighty2
The problem is that we are missing the WebResourceRequested event.
Event WebResourceResponseReceived(...) ...is already too late, I think.
WebResourceResponseReceived is triggered from e.g.:
WV.NavigateWithWebResourceRequest
You're right in, that the proper Event which corresponds with: WV.AddWebResourceRequestedFilter -
is the WebResourceRequested which is now included (in just uploaded RC6-version 6.0.13)...
I've also added the new NavigationStarting-Event (which is another one, which allows cancelling requests - on "whole documents").
Here's how to use the new WebResourceRequested-Event (which will only be triggered, once a Filter was added):
Code:
Option Explicit
Private WithEvents WV As cWebView2
Private Sub Form_Load()
Visible = True
Set WV = New_c.WebView2(hWnd)
WV.AddWebResourceRequestedFilter "*googlelogo*" 'define an URI-filter with wildcards
WV.Navigate "https://google.com"
End Sub
Private Sub Form_Resize()
If Not WV Is Nothing Then WV.SyncSizeToHostWindow
End Sub
'requires RC6 >= 6.0.13
Private Sub WV_WebResourceRequested(ByVal URI As String, ByVal FilterType As RC6.eWebView2ResourceFilter, Permit As RC6.eWebView2PermissionState)
Debug.Print FilterType, FilterType = Filter_IMAGE, URI
Permit = PERMISSION_STATE_DENY
End Sub
So, the above will report (in the Event), all "sub-requests" which in their URI contain the "wildcarded" string-snippet
(in case of the example, the filter-string was "*googlelogo*").
Within the Event you can then take a closer look at the URI which contained that filter-snippet -
and then decide (depending on resourcetype and "whole URI-string", whether you want to "403 cancel" it, or not).
HTH
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Dear Olaf,
In post no. 342, you have written as follows:
// The chromium-engine (which MS-Edge-WebView2 is using under the covers) -
is already working "multi-process-based" underneath - a short view into the Taskmanager would show you that... //
Thanks for the above info and I could indeed see the MS-Edge-WebView2 process(es) in TaskManager. I have a few questions related to it. As far I searched through this thread, I could not find these questions asked. Hence, asking.
----------
Suppose I have an app (A.exe) showing a web page in its 1st screen (say 'X') using WV.
When I open A.exe, some "Microsoft Edge WebView2" processes are shown running in the Processes list. If I close A at once, all the aforesaid "Microsoft Edge WebView2" processes disappear from the Processes list.
Instead of the above scenario, after opening 'A', if I click a link in 'X' (which link has target="_blank" and it is for a web page 'Y' ) so that 'Y' web page opens in a new window (say 'N'). Now, when I close 'A', 'N' window showing 'Y' web page still remains on the screen. Upon checking the Processes list, there remains in it a primary "Microsoft Edge WebView2" process with some child processes inside it. Is this the normal behaviour? If so, what exactly is happening? I presume 'N' showing 'Y' is running now as a separate process in a separate "Microsoft Edge WebView2" runtime process (say 'M'). Am I right?
Well, in any case, based on the abovementioned still-running 'N' window, I have the following sub-questions:
1. What is the best way to automatically close such 'N' windows (one or many) when I close my main application 'A'? Is there a possibility to have a property in WV by which I say that whenever I close 'A', all 'N' windows opened by 'A' shall be closed automatically? Or, is there already present a simple method in WV by which during Unload of 'A', I can close all 'N's easily?
2. What if I don't close such 'N' windows and open my application 'A' again? I presume there will be no relationship between the already-opened 'N' windows and 'A'. Am I right in this presumption? If so, if I allow users to open many such 'N' windows in many different sessions of 'A', then each one of those 'N' windows will be running under the abovementioned 'M' process (of "Microsoft Edge WebView2") and user can opt to close each of those 'N' windows himself, whenever he wishes to, later. Right? In other words, there will not be any problems at all in 'A' being opened/closed several times when many already opened 'N' windows are existing. Right? Kindly let me know.
----------
I take this opportunity to thank you once again, heartily, from the bottom of my heart, for all that you do to help us out.
Kind regards.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
I INSTALL this,MS-DownloadLink
https://go.microsoft.com/fwlink/p/?LinkId=2124703
Error in FindFirstFile: ErrNum: 3, The system cannot find the specified path
OK = Web1.BindTo(Web1pic.hWnd) <> 0
==========
I specify the old version and it works:
OK = Web1.BindTo(Web1pic.hWnd, , App.Path & "\SystemFile\web110.0.1587.63.x86")
Quote:
Originally Posted by
Schmidt
There seems to be a problem with the installation of the WebView-Runtime...
The BindTo-call is looking for the WebView-Runtime-BaseFolder via the following Path-Expression:
(for your Immediate-Window):
?New_c.FSO.GetSpecialFolder(CSIDL_PROGRAM_FILESX86) & "\Microsoft\EdgeWebView\Application"
Olaf
i search in hrer:C:\Users\***\AppData\Local\Microsoft\EdgeWebView
not C:\Program Files (x86)\
Code:
HKEY_CURRENT_USER\Software\Microsoft\EdgeUpdate
path=C:\Users\xiaoyao\AppData\Local\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe
how to get newwindow by webview2 control?
and how to do that new webvie2 like runjs,openurl(**)
if have 3 new window ,how to do?
-
Re: VB6 WebView2-Binding (Edge-Chromium)
last time ,i found someone say check reg path from :HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}\
cant find location in this regpath
It is possible that the Webview sdk is not installed with administrator permission. Therefore, there is no data in HKEY_LOCAL_MACHINE. Only HKEY_CURRENT_USER is saved
HKEY_CURRENT_USER\Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}
edgesdk=""
CreateCoreWebView2EnvironmentWithOptions(StrPtr(edgesdk), StrPtr(userdata)
A direct API call with an empty path will automatically detect where the system is installed.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
As for detection, whether a given target-system already contains this runtime,
you can simply check the output of the GetMostRecentInstallPath-method:
This function failed to get the WEBVIEW SDK installation path
Set Web1 = New_c.WebView2
Web1.GetMostRecentInstallPath
RC6.DLL 2023-5-29 version still has this problem
Code:
Dim OK As Boolean
Set Web1 = New_c.WebView2
Dim WebViewSDK As String
WebViewSDK = GetEdgeWebViewPath
If WebViewSDK <> "" Then
OK = Web1.BindTo(Me.hWnd, , WebViewSDK) <> 0
End If
Function GetEdgeWebViewPath() As String
On Error Resume Next
Dim WshShell As Object, WebView2_Version As String
Dim RegPath As String, location As String
Set WshShell = CreateObject("Wscript.Shell")
RegPath = "HKEY_CURRENT_USER\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}\"
location = WshShell.RegRead(RegPath & "location")
If location = "" Then
RegPath = Replace(RegPath, "\WOW6432Node", "")
location = WshShell.RegRead(RegPath & "location")
End If
If location <> "" Then GetEdgeWebViewPath = location & "\" & WshShell.RegRead(RegPath & "PV")
End Function
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
Schmidt
In my understanding, Selenium was written as a generic Test-Tool which can "work against multiple Browser-engines".
The WebView2 is just an encapsulation of a single Browser-engine (chromium) -
minus the additional "generic Automation- and Test-interfaces".
So, if you currently use Selenium for your own testing-purposes with success,
why change it to something "less capable" and "less generic".
Just my $0.02...
Olaf
I used to do this with IE, and there was a program that would automatically start IE and add some command line arguments.
So I used VB6 to write a program, replace IE path, and then use the WEBBROWSER to load the web page, the command line needs to open the URL.
chrome.exe works the same way. chromedriver.exe will send a WebSocket-related URL, and then through developer tools and other principles, you can use the driver proxy to open the URL, click the button.
I went over everyone's responses and questions several times today. And tested it.
If everyone can solve the problem, then do a test code is convenient. Then indicate which forum the question is placed in.
I heard that Google Chromium kernel source code related projects have a total of about 20G, the final compilation of DLL and related files may only be several hundred M.
Just because of the amount of documentation, the development tools, are important assets, learning paths.
I've always been studying very seriously, but sometimes the focus is different.
FOR EXAMPLE, I WANT RC6 .DLL TO RUN INDEPENDENTLY, SO THAT A WEB PAGE CAN BE DISPLAYED BY CALLING A STANDARD DLL API AND A WEBVIEW OBJECT CAN BE OBTAINED.
It's like VB6 calling WebView2Loader.dll, which is a VC++ COM object, but also outputs the 4 API exports of the standard DLL.
With this, there is a complete source code and webview2.tlb, which can be added in VB6.
So if RC6 .DLL can expose webview objects, then many users can extend some of the functionality that RC6 lacks.
If you only need an API to directly display a form loading web page by yourself, you will not cause multithreaded calls to some callbacks in the VB.NET and crash.
Of course, some features are added that are really convenient, but they also take a lot of time and technical difficulty to do.
After 25 years, Twinbasic implemented almost all vba.**, vb6.**, app.* objects and methods. Implements 64-bit compilation to generate EXE.
The next thing VB6 needs is a relatively large project, such as RC6 .DLL some extended functions or test methods. IF YOU CAN DO A GITHUB PROJECT.
You can directly upload, modify, and the main administrator is responsible for synthesis.
If there is also a package manager NuGet. PIP.EXE ,NPM
Everyone can directly check and install cZipArchive.cls, iSubclass_Mini.cls, stdPicEx.cls
VB6 is in decline now, maybe our generation of old programmers can last for 10-30 years.
It would be convenient to have a powerful online source management and questioning tool.
In any case, many of my requests are still unreasonable, and very few people are used. I'm really sorry
In fact, I also posted a lot of code bases on the forum, maybe some people feel that the code is too simple, and they are not qualified to be called "code bank",
But there are parts that I also spent a lot of time summarizing and testing.
We are all amateurs, selflessly contributing everyone's experience and technology to the convenience of others. Nor can you ask others to do too much.
After all, only commercial companies like TwinBasic can achieve a large number of technological updates, but they cannot achieve the correct and reasonable requirements to meet and complete the development.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
How to drag a web page and move the entire form?
I want to make a pure web page without a form border and put it inside the WEBVIEW
Then move the web page and the whole interface moves with it, either by typing shortcuts or virtual minimize and maximize buttons in the web page.
Do not know how to achieve
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Dear Olaf,
A possible issue in the latest release (29th May 2023) of RC6.dll
I don't know whether the issue is because of a mistake at my end OR the following is indeed an issue in the latest release of RC6.dll
The issue is:
--
When I use WV.Navigate to navigate to some external^^ site (not all, but some), the WV.DocumentTitle and WV.DocumentURL are not getting set.
Example sites:
https://sureshramaswamy.org
https://dandapani.org
(^^) as opposed to local html files in my own system.
--
1. When WV.DocumentTitle and WV.DocumentURL are not set for a particular site, if they are accessed (say, made to be printed via the statement Debug.Print "a-" & WV.DocumentTitle & "-a", "b-" & WV.DocumentURL & "-b", it takes quite a few seconds for the blank strings to be printed.
2. If I navigate to 'https://google.com', the "WV_DocumentComplete" event itself does not occur (apart from the title and url not getting set). Strangely, this is the case with the previous RC6.dll also. No issues with URLs like "google.de", "google.in", etc.
3. I found one or two other anomalies also while visiting some external sites (with the latest RC6.dll) but I felt they will get resolved automatically if the above issues are taken care itself. So, not mentioning about them, as of now.
As of now, in my app (checked with your own WebView2 Demo project also), I have started using the previous RC6.dll itself and absolutely no issues with WV.DocumentTitle and WV.DocumentURL except for the solitary site "https://google.com"
In case, the issues I have reported above are because of some mistake I am committing at my end only, then kindly let me know what to do to rectify the same.
I take this opportunity to thank you in tons, once again, Olaf, for your contributions to the world society.
Kind Regards.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
softv
A possible issue in the latest release (29th May 2023) of RC6.dll
.
As of now, in my app (checked with your own WebView2 Demo project also), I have started using the previous RC6.dll itself and absolutely no issues with WV.DocumentTitle and WV.DocumentURL except for the solitary site "https://google.com"
In case, the issues I have reported above are because of some mistake...
No, can reproduce this here with your site-links.
Background:
In an attempt to circumvent the "suppression of added COM-Objects" (which "google.com" achieves, when it is loading) -
I've changed the handling of the COM-Host-storage in 6.0.13 ...
though without success as it seems...
Have now restored the former vb_Host-behaviour in new version 6.0.14 (to what it was in 6.0.12).
It's uploaded now (have not updated the page-labels to 6.0.14 though).
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
Schmidt
... .. . In an attempt to circumvent the "suppression of added COM-Objects" (which "google.com" achieves, when it is loading) -
I've changed the handling of the COM-Host-storage in 6.0.13 ...
though without success as it seems...
Have now restored the former vb_Host-behaviour in new version 6.0.14 (to what it was in 6.0.12). ... .. .
Olaf
Thanks a ton, Olaf, for your mighty quick response. Yes, all back to normal now.
Navigating to "google.com" alone does not populate the DocumentURL and DocumentTitle. But, from your reply I infer that it will be so for "google.com" alone. Am I right?
Note:
Using the latest RC6 (6.0.14), WV.Navigate "https://google.com" does trigger the 'WV_DocumentComplete' event but WV.DocumentURL and WV.DocumentTitle do not get populated. They are blank/empty.
Kind Regards.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
softv
Using the latest RC6 (6.0.14), WV.Navigate "https://google.com" does trigger the 'WV_DocumentComplete' event but WV.DocumentURL and WV.DocumentTitle do not get populated. They are blank/empty.
Yes, whilst "google.de" works, "google.in" works, etc. -
the scripts Google loads (and runs), when loading from "google.com",
are somehow crippling the COM-Object-Callback-mechanism of MS.
And in turn, everything my wrapper offers communication-wise (.jsRun, .jsProp, etc.) is also crippled.
(though only, when google.com was the navigation-target).
As said, have started to find a way to circumvent this in 6.0.13,
but as you found out - this affected other functionality with "formerly normal behaving URLs" (hence the back-paddling in 6.0.14).
Think I'd like to wait a few months at this point,... perhaps MS comes up with a fix for that themselves -
(or Google changes their offending script) ...if not, I'll restart my own attempts after that again...
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
i have a full test:WebView2Demo.vbp,
i install MicrosoftEdgeWebview2Setup.exe for only user1,not for all user.
change to windows user2(local user):
RC6_ 2022-0731
---------------------------
Runtime error '430':
Class does not support automation or expected interfaces
---------------------------
RC6_ 2023-0529
---------------------------
Err: 53, Error in FindFirstFile: ErrNum: 3, the system cannot find the specified path.
Couldn't initialize WebView Binding
this will check HKEY_CURRENT_USER ,HKEY_LOCAL_MACHINE,WOW6432Node,x64
Code:
Function GetEdgeWebViewPath() As String
On Error Resume Next
Dim WshShell As Object, WebView2_Version As String
Dim RegPath As String, location As String
Set WshShell = CreateObject("Wscript.Shell") 'HKEY_CURRENT_USER , HKEY_LOCAL_MACHINE
RegPath = "HKEY_CURRENT_USER\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}\"
location = WshShell.RegRead(RegPath & "location")
If location = "" Then
RegPath = Replace(RegPath, "\WOW6432Node", "")
location = WshShell.RegRead(RegPath & "location")
If location = "" Then
RegPath = "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}\"
location = WshShell.RegRead(RegPath & "location")
If location = "" Then
RegPath = Replace(RegPath, "\WOW6432Node", "")
location = WshShell.RegRead(RegPath & "location")
End If
End If
End If
If location <> "" Then GetEdgeWebViewPath = location & "\" & WshShell.RegRead(RegPath & "PV")
End Function
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
xiaoyao
i have a full test:WebView2Demo.vbp,
i install MicrosoftEdgeWebview2Setup.exe for only user1, not for all user.
change to windows user2(local user):
... no WebView2-instancing possible via RC6...
What's your question exactly?
And why do you expect user2 to be able to create a WebView2-instance,
when you did not ensure an installation of the WebView2-runtime for that specific user2?
(or alternatively for all users of the machine)
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Confirm that the EDGE Evergreen SDK was installed with non-administrator privileges last time, and only the installation data is found in the registry HKEY_CURRENT_USER (64-bit subkey).
The path is: C:\Users\xiaoyao\AppData\Local\Microsoft\EdgeWebView\Application\114.0.1823.37
EDGE information cannot be found in registry subkeys such as HKEY_LOCAL_MACHINE and 32-bit
I switched to another Windows local administrator account and need to obtain directory permissions to access the previous user's directory: C:\Users\xiaoyao\AppData
Then VB6 called WebView2Loader.dll loaded webview2 successfully, using fixed versions (old version) 109.0.1518.78.x86 and 110.0.1587.63.x86, tested that 3 versions of EdgeWebView SDK displayed web pages correctly.
However, RC6 .dll specifying these 3 SDK directories to load webview2 failed.
couldn't initialize WebView-Binding
Install the Microsoft EdgeWebview2Setup .exe in administrator mode
The path to the automatic installation is: C:\Program Files (x86)\Microsoft\EdgeWebView\Application
---------------------------
The installation directory of EdgeWebView can also be found in the registry where the installer is uninstalled
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft EdgeWebView
InstallLocation=C:\Users\xiaoyao\AppData\Local\Microsoft\EdgeWebView\Application
Version=114.0.1823.37
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft EdgeWebView
InstallLocation=C:\Program Files (x86)\Microsoft\EdgeWebView\Application
Version=114.0.1823.41
-
Re: VB6 WebView2-Binding (Edge-Chromium)
The default double-click installation is non-administrator permissions, the path is: C:\Users\%user%\AppData\Local\Microsoft\EdgeWebView\Application\
Right-click to install with administrator privileges, the path is: C:\Program Files (x86)\Microsoft\EdgeWebView\Application
So you cannot directly specify the directory C:\Program Files (x86)\.
You can try it this way:
edgesdk="" or 2 other fixed (legacy) runtimes are fine
If CreateCoreWebView2EnvironmentWithOptions(StrPtr(edgesdk), StrPtr(userdata), 0&
After the user loads successfully, you can write down the current SDK installation directory. If the software user installs the software with non-administrator privileges and switches to another user to log in,
Use the code to crack the permissions, or let the user click on the authorization to access the directory, so that there is no need to install it again.
-----------------------------------
If each user needs to install the SDK separately, it will occupy 600-800MB of hard disk space, and 2 users is 1.5GB of space
Because we can't guarantee that the user will definitely install with administrator privileges, or it may just be a non-administrator account (the company implements permission control for users)
If his account has administrator privileges, but does not have the right mouse button to click administrator privileges, the installation will not take effect.
You can write your own installation script "runas" to force the installation of the runtime
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
xiaoyao
Use the code to crack the permissions, or let the user click on the authorization to access the directory...
I'd suggest to other readers here, to not "crack any permissions"...
The only things that needs to be done is, to run the WebView2-evergreen-installer properly "as Admin".
(after downloading it from the MS-WebSite).
Quote:
Originally Posted by
xiaoyao
If each user needs to install the SDK separately, it will occupy 600-800MB of hard disk space...
And that large size is the reason, why it makes so much sense, to choose the "for all Users" option -
on the given machine (once the installer was started "in Admin-mode").
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Loading two WebVIEWs is slow, why?
Code:
Web1 InitComplete UsedTime:111.3823ms
Web2 InitComplete UsedTime:8124.4131ms
WEB1 NavigationCompleted Used:16458.6068ms
WEB2 NavigationCompleted Used:16462.0363ms
Code:
Option Explicit
Dim WithEvents Webview1 As RC6.cWebView2
Dim WithEvents Webview2 As RC6.cWebView2
Dim AA(10) As Currency, BB(10) As Currency, U1 As Currency, U2 As Currency
Dim Web1 As RC6.cWebView2
Private Sub Webview1_InitComplete()
QueryPerformanceCounter AA(2)
U1 = (AA(2) - AA(1)) / MsCount
Debug.Print "Web1 InitComplete UsedTime:" & U1 & "ms"
'Webview1.SyncSizeToHostWindow
Webview1.Navigate "https://www.baidu.com?id=1"
End Sub
Private Sub Webview2_InitComplete()
QueryPerformanceCounter BB(2)
U2 = (BB(2) - BB(1)) / MsCount
Debug.Print "Web2 InitComplete UsedTime:" & U2 & "ms"
'Webview2.SyncSizeToHostWindow
Webview2.Navigate "https://www.baidu.com?id=2"
End Sub
Private Sub Webview1_NavigationCompleted(ByVal IsSuccess As Boolean, ByVal WebErrorStatus As Long)
QueryPerformanceCounter AA(3)
U1 = (AA(3) - AA(1)) / MsCount
Debug.Print "WEB1 NavigationCompleted Used:" & U1 & "ms"
End Sub
Private Sub Webview2_NavigationCompleted(ByVal IsSuccess As Boolean, ByVal WebErrorStatus As Long)
QueryPerformanceCounter BB(3)
U2 = (BB(3) - BB(1)) / MsCount
Debug.Print "WEB2 NavigationCompleted Used:" & U2 & "ms"
End Sub
Private Sub Form_Activate()
If Me.Tag = "" Then
Me.Tag = "a"
QueryPerformanceCounter AA(1)
QueryPerformanceCounter BB(1)
Webview1.BindTo Picture1.hWnd, 0&, WebviewSDKPath, "Z:\TEMP"
Webview2.BindTo Picture2.hWnd, 0&, WebviewSDKPath, "z:\temp2"
' Webview1.BindTo Picture1.hWnd, , WebviewSDKPath, "Z:\TEMP"
' Webview2.BindTo Picture2.hWnd, , WebviewSDKPath, "Z:\TEMP"
'Webview1.Navigate "https://www.baidu.com"
'Webview2.Navigate "https://www.baidu.com?id=2"
End If
End Sub
Private Sub Form_Load()
Set Webview1 = New_c.Webview2 'New cWebView2
Set Webview2 = New_c.Webview2 'New cWebView2
END SUB
IN my vb6 api webview2
two webview use same userdata path:
Code:
2023/6/8 16:39:04 class1:web1
2023/6/8 16:39:04 class1:Web2
2023/6/8 16:39:04 class2:web1
2023/6/8 16:39:04>web1-InitComplete,116.7922ms
2023/6/8 16:39:04 class2:Web2
2023/6/8 16:39:04>Web2-InitComplete, 147.2914 ms
2023/6/8 16:39:04>web1-Completed usedtime 422.0084 ms
2023/6/8 16:39:04>Web2-Completed usedtime 465.4944ms
two webview use 2 userdata path:
Code:
----------vb6 api load webview2:
2023/6/8 18:09:04 class1:web1
2023/6/8 18:09:04 class1:Web2
2023/6/8 18:09:05 class2:web1
2023/6/8 18:09:05>web1-InitComplete, 437.4444 ms
2023/6/8 18:09:05>web1-Navigate 0.0443 ms
2023/6/8 18:09:05 class2:Web2
2023/6/8 18:09:05>Web2-InitComplete, 503.0666ms
2023/6/8 18:09:05>Web2-Navigate used 0.0215 ms
2023/6/8 18:09:05>web1-Completed, 827.0572ms
2023/6/8 18:09:05>Web2-Completed, 891.6135 ms
2023/6/8 18:09:14 RC6-Webview2 Test Start
Web1 InitComplete UsedTime:101.1542ms
Web1 Navigate UsedTime:3.1012ms
Web2 InitComplete UsedTime:454.1865ms
Web2 Navigate UsedTime:1.5263ms
WEB1 NavigationCompleted Used:537.3491ms
WEB2 NavigationCompleted Used:888.683ms
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Webview1.Navigate "https://www.baidu.com?id=2",0
Webview2.Navigate "https://www.baidu.com?id=2",0
There is actually no need to wait here, if you want to wait, add a new function web.wait interface
Web1 InitComplete UsedTime:45.2891ms
Web2 InitComplete UsedTime:503.8269ms
WEB1 NavigationCompleted Used:586.6115ms
WEB2 NavigationCompleted Used:979.8215ms
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
xiaoyao
Loading two WebVIEWs is slow, why?
Because you never read (or understand), what was already explained to you in #362.
The default-settings of the RC6-WebView2-wrapper will ensure synchronous calls... (to make it a bit more beginner-friendly).
To change that to async-mode, one has to pass 0-WaitTimeouts into the second parameters of the Bind- and Navigate-methods.
Code:
Option Explicit
Private WithEvents WV1 As cWebView2, WithEvents WV2 As cWebView2
Private WithEvents PB1 As PictureBox, WithEvents PB2 As PictureBox
Private Sub Form_Load()
Set PB1 = Controls.Add("VB.PictureBox", "PB1"): PB1.Visible = True
Set PB2 = Controls.Add("VB.PictureBox", "PB2"): PB2.Visible = True
New_c.Timing True 'start high-res-timing
Set WV1 = New_c.WebView2(PB1.hWnd, 0)
Set WV2 = New_c.WebView2(PB2.hWnd, 0)
End Sub
Private Sub WV1_InitComplete()
Debug.Print "WV1_InitComplete", New_c.Timing
WV1.Navigate "https://sqlite.org/index.html", 0
End Sub
Private Sub WV2_InitComplete()
Debug.Print "WV2_InitComplete", New_c.Timing
WV2.Navigate "https://sqlite.org/index.html", 0
End Sub
Private Sub WV1_NavigationCompleted(ByVal IsSuccess As Boolean, ByVal WebErrorStatus As Long)
Debug.Print "WV1_NavigationCompleted", New_c.Timing
End Sub
Private Sub WV2_NavigationCompleted(ByVal IsSuccess As Boolean, ByVal WebErrorStatus As Long)
Debug.Print "WV2_NavigationCompleted", New_c.Timing
End Sub
Private Sub Form_Resize()
If Not PB1 Is Nothing Then PB1.Move 0, 0, ScaleWidth, ScaleHeight \ 2
If Not PB2 Is Nothing Then PB2.Move 0, ScaleHeight \ 2, ScaleWidth, ScaleHeight \ 2
If Not WV1 Is Nothing Then WV1.SyncSizeToHostWindow
If Not WV2 Is Nothing Then WV2.SyncSizeToHostWindow
End Sub
Timing-Results for the now async behaving 2 WV-instances (at the cost of using more Event-Handlers):
Code:
WV1_InitComplete 161.83msec
WV2_InitComplete 177.61msec
WV1_NavigationCompleted 270.31msec
WV2_NavigationCompleted 285.15msec
For the record:
Performance-comparisons between basic-methods of the WebView2 are pointless (across wrapper-implementations) -
in the end, it is the same MS-/Google-Chromium-libraries - which do all the heavy work under the covers.
And as always:
Please reduce your spamming of this thread -
you now have your very own WebView2-thread here in the CodeBank
(and I'd prefer when you do your "thinking out loud" over there).
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
dim str as string
str=jsProp("document.body.outerHTML")
when webivew is busy
or moretime
it's run slowly,no result back
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
SearchingDataOnly
The fourth question:
(4) I need to place multiple WebViews on my Form or WidgetForm. I bind a WebView to a cwWidget through "WV.BindTo(W.Root.hWnd, 10)".
The question is, when this cwWidget is removed, how to remove the bound WebView at the same time?
in vc++
webviewController->get_CoreWebView2(&webviewWindow) it's com object
set webviewController=nothing
set webviewWindow=nothing
so it will close edge browser in other process background
use control array:
Code:
Web1pic(0).Visible = False
LOAD Web1pic(1)
Web1pic(1).Visible = True
Web1.BindTo(Web1pic(1).hWnd)
remove webview and close edge borwser:
Private Function FrmSubclassProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal uIdSubclass As Form1, ByVal dwRefData As Long) As Long
Select Case uMsg
Case WM_COMMAND
Case WM_DESTROY
end sub
if bindto(hosthwnd),hosthwnd have a msg WM_DESTROY,it will auto close edge webbrowser.
if you bind 3 webview control(web1,web2,web3) only use one hostwnd( bind to same hwnd)
you want to only close web2,mabe need call by rc6.dll for make new Method. or set web2=nothing
Code:
Set Web1 = New_c.WebView2
Set Web2 = New_c.WebView2
Set Web3 = New_c.WebView2
Web1.BindTo(form2.hwnd)
Web2.BindTo(form2.hwnd)
Web3.BindTo(form2.hwnd)
movesize web1 to 0,0,400,400
move size web2 to 0,400,400,800
move size web3 to 0,800,400,1200
-
Re: VB6 WebView2-Binding (Edge-Chromium)
I spent a few hours re-learning the 10 pages that everyone responded to, and learned a lot of new things. I don't know if there are people like me?
I feel that the learning cost of webview2 is very high, and the difficulty is too great. It is more than 10 times more difficult than webBrowser, and the similar functions are less than 5%. Microsoft is really disappointing, and VB.NET has not continued the ease of learning of VB6.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
When starting my app, I want to test if objects and libraries are setup correctly.
To do that I have written some test functions like this:
Code:
Dim obj As Object
Set obj = CreateObject("LibraryRC6.cCairoContext")
If Not obj Is Nothing Then
' Library and class exist
MsgBox "Library and class exist!"
Else
' Library or class does not exist
MsgBox "Library or class does not exist!"
End If
However, that does not work, it throws the error "Active X can't create object".
What would be the correct name to create this object or to check if the library can be used?
I am not sure where to best post this question. If somebody tells me where to do that, I will try to move my post there.
Thank you!
ps: I don't want to use LoadLibrary as this does not check if the dll is registered correctly.
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Use error trapping
Code:
Option Explicit
Private Sub Form_Click()
Debug.Print LibraryInstalled
End Sub
' Air code
Private Function LibraryInstalled() As Boolean
Dim obj As Object
On Error Resume Next
Set obj = CreateObject("LibraryRC6.cCairoContext")
If Err.Number = 0 Then
If Not obj Is Nothing Then
' Library and class exist
LibraryInstalled = True
End If
Else
If Err.Number = 429 Then
' Library not installed
Else
' Show an error
MsgBox "Error: " & Err.Description & " (Number: " & Err.Number & ")"
End If
End If
End Function
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
tmighty2
ps: I don't want to use LoadLibrary as this does not check if the dll is registered correctly.
For the record, the correct "Library-Prefix" in a ProgID
(which usually follows the scheme: "Lib.Class")
...is "RC6.cSomeClass"
And the usual Class (which serves as a Main-Entry-Point), is "cConstructor".
So, a CreateObject-based test, should ideally be done via ProgID: "RC6.cConstructor"
That said, you can always work regfree with the RC6, when you:
- ship the recent bunch of RC6(Base)-Dlls, all in a SubFolder of your App(zip)
- and in addition - simply place a "helper-bas-module" in your App-Project.
I've mentioned jpbro's work (related to this regfree-approach) already here in this thread:
https://www.vbforums.com/showthread....=1#post5606658
HTH
Olaf
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Hopefully, this is something simple. Trying to simply set the Background Color of the webview2 page. There is a property for it, but I can't seem to find where it is in the cWebView2 class.
Thanks!
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Quote:
Originally Posted by
BooksRUs
Hopefully, this is something simple. Trying to simply set the Background Color of the webview2 page. There is a property for it, but I can't seem to find where it is in the cWebView2 class.
Thanks!
it's use by css or js
Supports WebDriver, so it also supports various scenarios such as crawlers and automated tests.
Is it necessary to set the proxy IP in the startup parameters or something, and then you can support WebDriver?
-
Re: VB6 WebView2-Binding (Edge-Chromium)
Supports WebDriver, so it also supports various scenarios such as crawlers and automated tests.
Is it necessary to set the proxy IP in the startup parameters or something, and then you can support WebDriver?
Automate and test WebView2 apps with Microsoft Edge WebDriver
https://learn.microsoft.com/en-ca/mi...w-to/webdriver
Step 4: Choosing whether Microsoft Edge WebDriver should launch your app or attach to it
Decide whether to configure Selenium to drive WebView2 by using the "launch" or "attach" approach.
The "launch" approach: In some scenarios, it's appropriate to let Microsoft Edge WebDriver handle launching your WebView2 app. Microsoft Edge WebDriver launches your WebView2 app and automatically attaches to the first available WebView2 instance that your app creates.
The "attach" approach: In other scenarios, it's appropriate to attach Microsoft Edge WebDriver to a running WebView2 instance. You launch your app outside of Microsoft Edge WebDriver, and then attach Microsoft Edge WebDriver to a running WebView2 instance. This "attach" approach is for a WebView2 app that's not compatible with the "launch" approach.
https://learn.microsoft.com/en-ca/mi...r-webview2-app
At this point, your app is running and its --remote-debugging-port command-line parameter has been set. Next, we'll attach Microsoft Edge WebDriver to the launched WebView2 app.