2016-09-15 47 views
0

我一直在为依赖于Web浏览器控件显示其信息的定制软件开发“IDE”。该软件使用外部文件“common.vbs”访问其网页中的常用功能。洒在整个应用程序中的各种网页的HTML标记:Vb.Net(Visual Basic),Web浏览器控件;使外部文件可用页面

<script LANGUAGE="VBScript" src="common.vbs"></script> 

在我的应用程序已经导入代码到资源字符串后,尝试下面的代码:

Dim sPath As String = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) 
    sPath = Path.Combine(sPath, "common.vbs") 
    Try 
     Dim fs As FileStream = File.Create(sPath) 
     Dim sData As String = My.Resources.common 
     Dim Info As Byte() = New UTF8Encoding(True).GetBytes(My.Resources.common) 
     fs.Write(Info, 0, Info.Length) 
     fs.Close() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 

的代码没有按” t错误。当我测试(用相同的函数)读取文件时,它的内容被返回;我知道该文件被写入,但是当任何页面的上述HTML标签加载,我从页面得到一个错误:

An error has occurred in the script on this page 
Line: 0 
Char: 0 
Error: Script error 
Code: 0 
URL: about:common.vbs 

我试图“包括”该文件只包含的功能如:

Function DoHelp 
    window.external.DoHelp "", "", -1, -1 
End Function 

Function SQLDate(d) 
    SQLDate = "'" & DatePart("yyyy", d) & "-" & DatePart("m", d) & "-" & DatePart("d", d) & "'" 
End Function 

Function MonitorJob(jobId) 
    on error resume next 
    window.external.UIControl.MonitorJob jobId, 0 
End Function 

在应用程序中,加载和使用文件中包含的任何函数都没有问题。该文件的实际内容来自应用程序,并没有在任何庄园编辑过。任何我的应用程序加载的文件都包含错误,包括简单的测试页。

有没有人有任何想法如何让Web浏览器控制从脚本的scr标签中识别文件,这不是从主机应用程序加载和提供的实际页面的一部分?编辑源应用程序中的所有页面实际上不是一种选择;可能是动态创建的,而且有很多。

我试图尽可能多地包含尽可能多的信息,但如果您需要更多信息,请随时提问!

谢谢,弗雷德

编辑/ UPDATE: 我试着写我需要“包括”到一个临时文件夹中的文件,编写调用HTML文件相同的文件夹,然后加载网页使用文件流进行控制。结果是一样的。我不得不说错,将所有“资源文件”写入临时文件夹,然后将生成的HTML页面写入相同的文件,最后将Navigate方法调用到该临时文件夹和文件,导致页面正确加载图像以及底层包含的VBS文件。

上次编辑/更新 我花了一段时间才得到所有零件正常工作。以下是解决问题的答案。

回答

0

问题的一部分是Web控件如何加载。由于没有使用基本位置,所以使用文档方法避免访问文件系统。为了访问文件系统中的项目,“源页面”需要位于文件系统中。问题的下一部分是将资源存入文件系统。以下是我使用的代码。重要说明:仅出于演示原因,Temp Path的代码位于此例程内。它实际上驻留在其他例程访问的例程中。

Sub UpdateFiles(sData) 
     'Write all the dependent files into the working folder. 
     Dim sLocalPath As String = Path.Combine(Path.GetTempPath, Guid.NewGuid.ToString) 
     Do While Directory.Exists(TempWorkingPath) Or File.Exists(TempWorkingPath) 
      sLocalPath = Path.Combine(Path.GetTempPath, Guid.NewGuid.ToString) 
     Loop 
     Directory.CreateDirectory(sLocalPath) 
     File.WriteAllBytes(Path.Combine(sLocalPath, "common.vbs"), System.Text.Encoding.UTF32.GetBytes(My.Resources.common)) 
     Dim aImageList() As String = Split(My.Resources.M3ImageList, vbCrLf) 
     Dim sImageList As String = Replace(Join(Split(My.Resources.M3ImageList, vbCrLf), ","), "-", "_") 
     Dim ResourceSet As Resources.ResourceSet = My.Resources.ResourceManager.GetResourceSet(Globalization.CultureInfo.CurrentCulture, True, True) 
     For Each Dict As DictionaryEntry In ResourceSet.OfType(Of Object)() 
      If TypeOf (Dict.Value) Is Drawing.Image Then 
       If InStr(sImageList, Dict.Key, vbTextCompare) > 0 Then 
        Dim ImageConverter As New ImageConverter 
        Dim aBytes() As Byte = ImageConverter.ConvertTo(Dict.Value, GetType(Byte())) 
        Dim sName As String = Replace(Dict.Key.ToString & ".gif", "_", "-") 
        File.WriteAllBytes(Path.Combine(sLocalPath, sName), aBytes) 
       End If 
      End If 
     Next 
     File.WriteAllText(Path.Combine(sLocalPath, "index.html"), sData) 
    End Sub 

我使用了一个单独的资源文件,列出了驱动此例程所需的所有文件。值得注意的一点是,当我导入所有的GIF时,-'s被转换为_,因此替换语句。我还使用了一个过滤器(Instr命令),以便只导出列表中的项目。

我花了很多时间在这个上,我希望别人会觉得它有用!

Fred