标签: vbscript

将COM事件暴露给VBScript(ATL)

我使用"ATL简单对象"向导在C++中使用ATL构建了一个COM服务器DLL.我关注了微软的ATLDLLCOMServer示例.一切都很好,除了一件事:我没有在VBScript中收到COM事件.我确实收到了C#中的事件.我在VBScript中使用早期基于MFC的实现中的事件作为ActiveX控件.

我的控件定义如下:

class ATL_NO_VTABLE CSetACLCOMServer :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSetACLCOMServer, &CLSID_SetACLCOMServer>,
    public IConnectionPointContainerImpl<CSetACLCOMServer>,
    public CProxy_ISetACLCOMServerEvents<CSetACLCOMServer>,
    public IDispatchImpl<ISetACLCOMServer, &IID_ISetACLCOMServer, &LIBID_SetACLCOMLibrary, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IProvideClassInfo2Impl<&CLSID_SetACLCOMServer, &DIID__ISetACLCOMServerEvents, &LIBID_SetACLCOMLibrary>   /* Required for event support in VBS */
{
public:

BEGIN_COM_MAP(CSetACLCOMServer)
    COM_INTERFACE_ENTRY(ISetACLCOMServer)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
   COM_INTERFACE_ENTRY(IProvideClassInfo)
   COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()

BEGIN_CONNECTION_POINT_MAP(CSetACLCOMServer)
    CONNECTION_POINT_ENTRY(__uuidof(_ISetACLCOMServerEvents))
END_CONNECTION_POINT_MAP()

[...]
Run Code Online (Sandbox Code Playgroud)

在VBScript中我使用COM对象,如下所示:

set objSetACL = WScript.CreateObject("SetACL.SetACL", "SetACL_")

' Catch and print messages from the SetACL COM server which are passed (fired) as events.
' The name postfix …
Run Code Online (Sandbox Code Playgroud)

c++ com vbscript events atl

4
推荐指数
1
解决办法
2787
查看次数

VBScript迭代XML子节点并检索值

我有一个客户提供的以下XML,我需要从中提取以下项目:

  • <CustomerProductName>
  • <ProductName>
  • <ProductAssetName>

将每个<CustomerProducts>部分视为单独的订单.

我可以<CustomerProducts><CustomerProductName>没有问题的情况下提取并迭代,并迭代每个部分中的值.

但我无法看到我如何得到它下面的值.如果有人可以给我一些关于如何实现这一点的指示我会感激不尽,因为我已经尝试了一天多了.

基本代码在XML下面

<?xml version="1.0"?>
<Products_Root>
    <Products_IPN VendorID="11344" >
        <CustomerProducts CustomerProductName="Test" ProductCount="7">
            <Products ProductType="BOOK" ProductName="Donald" >
                <ProductComponents ProductAssetName="Donald.pdf" />
                <ProductSpecs SpecClass="MEASUREMENT" SpecType="MARGINS" SpecValue="PER FILE"/>
                <ProductSpecs SpecClass="OPERATION" SpecType="BIND" SpecValue="SADDLE"/>
            </Products>
            <Products ProductType="BOOK" ProductName="Duck">
                <ProductComponents ProductAssetName="Duck.pdf"/>
                <ProductSpecs SpecClass="MEASUREMENT" SpecType="MARGINS" SpecValue="PER FILE"/>
                </Products>
        </CustomerProducts>
        <CustomerProducts CustomerProductName="Test2" ProductCount="2">
            <Products ProductType="BOOK" ProductName="Micky">
                <ProductComponents ProductAssetName="Mouse.pdf" />
                <ProductComponents ProductAssetName="Mouse.pdf" />
                <ProductSpecs SpecClass="MEASUREMENT" SpecType="MARGINS" SpecValue="PER FILE"/>
            </Products>
            <CustomerProductSpecs SpecClass="OPERATION" SpecType="KITTING" SpecValue="SHRINKWRAP KIT"/>
        </CustomerProducts>
        <CustomerProducts CustomerProductName="Test3" ProductCount="6">
            <Products …
Run Code Online (Sandbox Code Playgroud)

xml vbscript

4
推荐指数
1
解决办法
4万
查看次数

如何通过命令提示符禁用和启用USB端口?

如何通过命令提示符禁用和启用USB端口?还是使用批处理脚本?或在Windows 7中使用vb脚本?

windows vbscript batch-file

4
推荐指数
1
解决办法
9万
查看次数

我无法清除和重置Cell的背景颜色

在下面的命令的帮助下,我能够清除单元格的内容,但不能清除它们的背景颜色.如何清除和设置范围内单元格的背景颜色?

ob9.Range(ob9.Cells(1,StartCol),ob9.Cells(1,maxcolumn)).ClearContents
Run Code Online (Sandbox Code Playgroud)

编辑

我试过以下:

CountFill = objExcel1.Application.WorksheetFunction.CountA(ob9.Rows(1))
CountBlnk = objExcel1.Application.WorksheetFunction.CountBlank(ob9.Rows(1))
TotalColumn= CountBlnk + CountFill

ob9.Range(ob9.Cells(1,CountFill + 1 ),ob9.Cells(1,TotalColumn)).Interior.ColorIndex(-4142) '= xlColorIndexNone
Run Code Online (Sandbox Code Playgroud)

可以一行完成吗?

谢谢

vbscript excel vba excel-vba

4
推荐指数
1
解决办法
3万
查看次数

从VBscript或命令行打印PDF而不使用acrobat.exe

是否可以在没有AcroRd32.exe的情况下将pdf文档打印到vbscript内的默认打印机或命令行?

理想情况下,将pdf发送到打印机并且不需要其他程序会很好.

  • 要么 -

是否有第三方.exe程序可以在没有对话的情况下打印pdf而无需打开并且没有在Windows任务栏中显示?

.exe需要是独立的(因此不需要Windows安装过程).

我可以为.exe支付高达100美元,只要它可以在另一个应用程序内部分发.免费也很棒.

这让我很难过.

windows printing pdf vbscript silent

4
推荐指数
1
解决办法
2万
查看次数

在VBScript中读取音乐文件长度

我只是想知道是否有办法通过VBScript将一个mp3文件的长度在几秒钟内变成一个变量.

vbscript

4
推荐指数
2
解决办法
2675
查看次数

如何识别输入框中的确定和取消按钮

嗨嗨我必须写一个代码,如果用户点击进入输入框中的东西它应该继续进行.如果它没有输入任何值,它应该再次回到相同的问题.这已经我已经实现了,但我的问题是当用户点击CANCEl时,它再次询问相同的问题,而它应该退出.我是VB Script的新手.Plz帮助我如何处理这些按钮?下面是我现有的代码

Do while x=0
strAnswer = InputBox("Please enter the file extension  *  For all files:", _
    "File Extension")
If strAnswer = "" Then
        MsgBox"You must enter an extension."

Else

        a=strAnswer
        Exit Do
    End If
Loop


intRow = 2
'strFileName = "T:\public\Madhumita\New.xls"
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
'objWorkbook.SaveAs(strFileName)
objExcel.Cells(1, 1).Value = "Folder"
objExcel.Cells(1, 2).Value = "File Name"
objStartFolder = "T:\public\Madhumita\Madhu"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
If a="*" …
Run Code Online (Sandbox Code Playgroud)

vbscript

4
推荐指数
1
解决办法
7024
查看次数

如何使我的自定义类与For Each兼容?

是否有可能使纯粹在VBScript中实现的自定义容器类(没有COM对象)与For Each语句一起使用?如果是这样,我必须暴露什么方法?

vbscript

4
推荐指数
1
解决办法
326
查看次数

VBScript:如何调用在Dispatch Map中用元音定义的函数

我有以下VBScript脚本,它创建一个Microsoft COM对象.

set foo = CreateObject("Bar.ProgId")
foo.Einfügen()
Run Code Online (Sandbox Code Playgroud)

该COM对象的实现位于动态链接库中Foo.dll,该库使用Microsoft Foundation Framework(MFC),尤其是Dispatch Maps的机制.

Dispatch Maps显示如下

BEGIN_DISPATCH_MAP(Foo, CCmdTarget)
[...]
DISP_FUNCTION(Foo, "Einfügen", Insert, VT_I2, VTS_NONE)
[...]
END_DISPATCH_MAP()
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.当我在VBA环境中创建这样的COM对象时,例如在Excel应用程序中,调用foo.Einfügen成功.除了在VBScript-Script中.

我认识到OLE自动化应用于VBA以及VBScript.但是当我运行VBScript-Script时,我收到了错误

错误:未知字符; 代码8000A0408;
来源:在Microsoft VBScript中编译失败

首先我认为VBScript-Script中的编码因为字符ü而错误,但我确认它是ANSI编码的.我还验证了我系统上的Windows代码页Windows-1252西方拉丁字符集.

如果我在Dispatch Map中更改EinfügenEinfuegenI断言VBScript-Script正在运行.

所以我的问题是,为什么foo.EinfügenVBScript 中的调用行为与VBA不同?这种行为的原因是什么?

对我来说,解决方法是我DISP_FUNCTION在调度图中附加第二个条目,该条目将分派Einfuegen给该函数Insert.在VBScript-Script中,我foo.Einfuegen仍然在VBA中调用foo.Einfügen.

vbscript mfc ole-automation

4
推荐指数
1
解决办法
203
查看次数

如何将PowerShell变量返回到VBScript

我有一个vbscript来调用PowerShell脚本,希望将PowerShell输出返回到HTA(HTML应用程序)GUI.现在我只想看看我是否可以将PowerShell输出返回到vbscript中的MsgBox.我没有太多运气.

VBScript代码:

Set shell = CreateObject("WScript.Shell")
return = shell.Run("powershell.exe -executionpolicy bypass -noprofile -file pathToScript\PowerShellToVBA.ps1", , true)
MsgBox return
Run Code Online (Sandbox Code Playgroud)

PowerShell代码:

Clear-Host
return 50
Run Code Online (Sandbox Code Playgroud)

我试图保持返回值非常简单,直到它工作.有了这个,我希望MsgBox返回'50',但它会返回'0'.什么想法我做错了什么?

vbscript powershell hta

4
推荐指数
1
解决办法
6683
查看次数

标签 统计

vbscript ×10

windows ×2

atl ×1

batch-file ×1

c++ ×1

com ×1

events ×1

excel ×1

excel-vba ×1

hta ×1

mfc ×1

ole-automation ×1

pdf ×1

powershell ×1

printing ×1

silent ×1

vba ×1

xml ×1