我使用"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) 我有一个客户提供的以下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) 如何通过命令提示符禁用和启用USB端口?还是使用批处理脚本?或在Windows 7中使用vb脚本?
在下面的命令的帮助下,我能够清除单元格的内容,但不能清除它们的背景颜色.如何清除和设置范围内单元格的背景颜色?
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)
可以一行完成吗?
谢谢
是否可以在没有AcroRd32.exe的情况下将pdf文档打印到vbscript内的默认打印机或命令行?
理想情况下,将pdf发送到打印机并且不需要其他程序会很好.
是否有第三方.exe程序可以在没有对话的情况下打印pdf而无需打开并且没有在Windows任务栏中显示?
.exe需要是独立的(因此不需要Windows安装过程).
我可以为.exe支付高达100美元,只要它可以在另一个应用程序内部分发.免费也很棒.
这让我很难过.
嗨嗨我必须写一个代码,如果用户点击进入输入框中的东西它应该继续进行.如果它没有输入任何值,它应该再次回到相同的问题.这已经我已经实现了,但我的问题是当用户点击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中实现的自定义容器类(没有COM对象)与For Each语句一起使用?如果是这样,我必须暴露什么方法?
我有以下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ügen为EinfuegenI断言VBScript-Script正在运行.
所以我的问题是,为什么foo.EinfügenVBScript 中的调用行为与VBA不同?这种行为的原因是什么?
对我来说,解决方法是我DISP_FUNCTION在调度图中附加第二个条目,该条目将分派Einfuegen给该函数Insert.在VBScript-Script中,我foo.Einfuegen仍然在VBA中调用foo.Einfügen.
我有一个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'.什么想法我做错了什么?