我使用VB6创建了一个ActiveX dll,并使用打包和部署向导打包它,这导致了一个cab文件和一个演示HTML页面.
此ActiveX dll包含一个返回字符串并且不接受任何参数的simgle方法.
我遇到的麻烦是,当我调用该方法时,我总是得到一个"对象不支持此属性或方法"错误.但它不支持我打电话的方法.
我想要实现的是用户访问一个网页,其中包含一些java或vb脚本,它调用我的ActiveX中的方法并获取返回的字符串值.DLL旨在被称为客户端.
我的测试网页如下:
<html>
<head>
<title>SaveClipboardImage.CAB</title>
<object id="Class1" classid="CLSID:" codebase="SaveClipboardImage.CAB#version=1,0,0,0"></object>
<script type="text/javascript">
function displaymessage()
{
try
{
var filename;
filename = Class1.SaveClipboardToImage();
alert(filename);
}
catch(e)
{
alert(e.message);
}
}
</script>
</head>
<body>
<input type="BUTTON" onclick="displaymessage()" value="preview" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我显然做错了什么,但我不知道是什么.我是否必须在VB6项目中为类做一些特殊的事情,以便我可以访问该方法?我是否错误地调用了DLL?
谢谢你的帮助.
我正在尝试编写WSH登录脚本.整个公司的管理员需要能够自定义脚本的执行,并为特定位置和用户执行其他脚本.为了使他们的工作更轻松,我想提供一个管理员可以在他们的脚本中访问的API.如果我使用JScript编写API,是否可以初始化我通过VBScript定义的对象?例如,请考虑以下代码:
<!-- The WSF logon script file -->
<package>
<job>
<script language="JScript">
// A demonstration function
function OverNineThousand() {
return 9001;
}
// A demonstration "class"
function WorkstationClass() {
var os = "Windows XP";
this.getOperatingSystem = function() {
return os;
}
}
</script>
<script language="VBScript">
Dim bigNumber, workstation
'// This assignment works properly.
bigNumber = OverNineThousand()
'// This assignment causes an error. Am I doing it wrong?
Set workstation = New WorkstationClass()
'// Execution never gets this far
WScript.Echo workstation.getOperatingSystem() …Run Code Online (Sandbox Code Playgroud) 我正在维基百科检查Java语言历史,这一段引起了我的注意:
当前版本,Java SE 6(2006年12月11日) - Codename Mustang - 与数据库管理器捆绑在一起,便于使用脚本语言(目前使用Mozilla的Rhino引擎的JavaScript)和JVM,并支持Visual Basic语言
在这种情况下,"Visual Basic语言支持"究竟是什么?
谢谢,
dariopy.
在VBScript中,一些内置对象使用未命名的属性.一些例子:
Set Dict = Server.CreateObject("Scripting.Dictionary")
Set RS = GetEmloyeesRecordSet()
Dict("Beer") = "Tasty" ' Same as Dict.Item("Beer") = "Tasty"
Dict("Crude Oil") = "Gross" ' Same as Dict.Item("Crude Oil") = "Gross"
Response.Write "The First Employee Is: " & RS("Name") ' Same as RS.Fields("Name")
Run Code Online (Sandbox Code Playgroud)
如何在我自己的类中使用相同的语法?
UPDATE
这是一个如何执行此操作的独立示例,它是Scripting.Dictionary的简单包装器.注意使用"Let"来允许d("key")="value"语法.当然,Thom会提供答案.
<%
Class DictWrapper
Private Dict
Private Sub Class_Initialize()
Set Dict = Server.CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
Set Dict = Nothing
End Sub
Public Property Get Count
Count = Dict.Count
End Property
Public Default Property Get …Run Code Online (Sandbox Code Playgroud) 我正在更新一段旧代码,它使用VBScript在IE中拉出一个窗口.出于某种原因,它喜欢在IE背后开放.谷歌给了我以下几行在VBScript中设置窗口焦点:
set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate("calculator")
Run Code Online (Sandbox Code Playgroud)
但是,当我在IE中运行它时,我收到错误"Object required:'WScript'."
有没有办法在IE中,或其他方式来做到这一点?我已经打开并操作Word文档没有任何问题.
编辑:为了澄清,我在浏览器(IE)中的<script type ="text/vbscript">标签中运行它,并且在我甚至调用AppActivate之前,代码在第一行崩溃.
更新:我的安全设置非常低; 所有ActiveX设置都处于启用状态(这是一个Intranet服务).我测试了这个问题的代码,计算器没有问题.事实上,我让AppActivate使用JavaScript,但它不能与VBScript一起使用.
使用JavaScript:
<script type="text/javascript">
function calcToFrontJ(){
wshShell = new ActiveXObject("WScript.Shell");
wshShell.AppActivate("Calculator");
}
</script>
Run Code Online (Sandbox Code Playgroud)
不工作VBScript:
<script type="text/vbscript">
Public Function calcToFrontV()
'Set WScript = CreateObject("WScript.Shell") 'breaks with or without this line
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.AppActivate("Calculator")
End Function
</script>
Run Code Online (Sandbox Code Playgroud)
我想我总是可以重构JavaScript,但我真的很想知道这个VBScript发生了什么.
最终答案:
<script type="text/vbscript">
Public Function calcToFrontV()
'must not use WScript when running within IE
Set WshShell = CreateObject("WScript.Shell")
WshShell.AppActivate("Calculator")
End Function
</script>
Run Code Online (Sandbox Code Playgroud) 给出以下XML.
<?xml version="1.0" encoding="UTF-8"?>
<xmldata>
<Products>
<ProductCode>M406789</ProductCode>
<ProductID>858</ProductID>
<ProductName>M406789 Ignition Box</ProductName>
<ProductDescriptionShort><img alt="" src="/v/vspfiles/assets/images/alliance_small.jpg" align="right" />Ignition Box</ProductDescriptionShort>
<ListPrice>134.2200</ListPrice>
<ProductPrice>80.5300</ProductPrice>
<SalePrice>59.9500</SalePrice>
</Products>
</xmldata>
Run Code Online (Sandbox Code Playgroud)
这是脚本的相关部分.
Set xNewDoc = xData.responseXML 'ResponseXml returns DOMDocument object
Set ProductCode = xNewDoc.SelectSingleNode("//ProductCode")
Set ListPrice = xNewDoc.SelectSingleNode("//ListPrice")
x=Len(ListPrice.Text)
newlp = Left(ListPrice.Text,x-2)
Set ProductPrice = xNewDoc.SelectSingleNode("//ProductPrice")
x=Len(ProductPrice.Text)
newpp = Left(ProductPrice.Text,x-2)
Set SalePrice = xNewDoc.SelectSingleNode("//SalePrice")
x=Len(SalePrice.Text)
newsp = Left(SalePrice.Text,x-2)
Set ProductName = xNewDoc.SelectSingleNode("//ProductName")
Run Code Online (Sandbox Code Playgroud)
如果缺少上面加载的xml和节点(假设为"SalePrice"),则脚本将失败.如何测试以查看节点是否存在以使其不会失败.我过去在Stack上看过这个东西,但似乎无法找到它.
精简版:
如何只保存xls的可见单元格作为csv?
更长版本:
我有一个大的.xls文件,其中包含一些分布在许多工作表上的数据,我希望这些数据可用于一些旧的UNIX perl脚本.我有一些代码会监视文件进行修改,重新生成csv文件并将它们FTP到我需要的地方.问题是维护电子表格的人不想删除旧数据,他们只是将其隐藏在视图中以供后者参考.我保存到csv的方法(正如你在大多数用例中所预期的那样)最终得到所有隐藏数据并且可以并排显示,无法知道最初隐藏的是什么.我已经在网上和这里进行了一些搜索,并且无法找到以编程方式执行此操作的任何方式(我能够遵循).下面是我正在使用的一些代码.如果它可以作为答案的起点,那么我会更容易理解.
在此先感谢,你们总是非常乐于助人.
下面是我发现的一些VBScript,它完成了工作但包含了所有数据(不仅仅是可见数据).
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open("S:\NetowrkFolder\SpreadSheet.xls")
Dim oSheet
If oBook.Sheets.count = 1 Then
oBook.SaveAs "D:\output.csv", 6
else
i=1
aname=split("D:\output.csv",".",-1,1)
For Each oSheet In oBook.WorkSheets
fname = aname(0) & "_sheet" & Cstr(i)
oSheet.SaveAs fname, 6
i=i+1
Next
End If
oBook.Close True
oExcel.Quit
WScript.Quit
Run Code Online (Sandbox Code Playgroud)
我实际上在AutoIt下面做的这个项目是我用来完成同样事情的AutoIt代码.不幸的是,它仍然包含所有隐藏的数据.
Local $oExcel = ObjCreate("Excel.Application")
Local $oBook = $oExcel.Workbooks.Open("Y:\NetworkLocation\File.xls")
Local $oWorkSheets = $oBook.WorkSheets
Local $i = 1
For $oSheet In $oWorkSheets …Run Code Online (Sandbox Code Playgroud) 我希望我可以使用现代化工具(或类似工具)来确定浏览器是否能够运行vbscript。看起来好像不行。
IE11最近修改了用户代理,删除了MSIE并替换为“ Trident”。这样做是为了使IE看起来更像其他符合html规范的浏览器。
我有许多旧网站,要求浏览器支持vbscript。我正在寻找一种确定如何确定浏览器是否支持vbscript的方法。这些站点中的许多站点都使用经典的asp,这使其变得更加困难。
有想法吗?ty现在,我正在考虑使用JavaScript评估用户代理,如果它包含msie,那么我们可以假定它确实支持vbscript。
我正在更新一些脚本,这些脚本需要将焦点切换到一个应用程序,发送一些击键,然后再将焦点返回到另一个应用程序。
Option Explicit
dim objShell
set objShell = WScript.CreateObject("WScript.Shell")
objShell.AppActivate "AnApplication"
WScript.Sleep 1000
objShell.SendKeys("%{I}")
...
objShell.SendKeys("{END}")
WScript.Sleep 1000
objShell.AppActivate "AnotherApplication"
Set objShell = Nothing
Run Code Online (Sandbox Code Playgroud)
我研究了对这些脚本的一些改进,而我希望做的一件事就是删除Sleep语句以加快脚本的执行速度。在研究此问题时,我发现建议您AppActivate在继续之前检查返回值,以有效地使脚本等到应用程序获得焦点并可以发送击键之前。
我尝试更新脚本来执行此操作-
Option Explicit
dim objShell
set objShell = WScript.CreateObject("WScript.Shell")
While Not objShell.AppActivate "AnApplication"
Sleep 300
Wend
objShell.SendKeys("%{I}")
...
objShell.SendKeys("{END}")
While Not objShell.AppActivate "AnotherApplication"
Sleep 300
Wend
Run Code Online (Sandbox Code Playgroud)
但是,击键似乎仅在将焦点返回给AnotherApplication之后发送。
有没有一种方法可以确保在发送按键时AnApplication能够获得焦点,而无需使用Sleep?
我想将文本文件的完整路径传递给其中一个函数.我使用以下命令将我的脚本和文本文件放在同一位置,我找到了我的脚本所在的文件夹路径
p = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
Run Code Online (Sandbox Code Playgroud)
p 来了 C:\test
我的文件名是 xyz.txt
我想将参数传递给函数as C:\test\xyz.txt
我该如何组合路径和文件名
我尝试下面的代码
path = p & "xyz.txt"
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我如何加入路径和文件名.