kbi*_*ang 4 vbscript mfc ole-automation
我有以下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.
命名约定.
与其兄弟VBA和VB6不同,它是VBScript中的语法错误.VBScript编译器需要表达式的单字节字符.
看一下:
您必须编写包含括号括起来的不受支持的字符的表达式.
set foo = CreateObject("Bar.ProgId")
foo.[Einfügen]() 'this will work
Run Code Online (Sandbox Code Playgroud)