VC++中调用VBS程序

没有过多的理论, 但有些内容是必要的.

在 C++ 中执行一段 Script 的方法相当的多, 但你需要其返回值, 这可能需要使用 MS 提供的 MSScript.ocx (在 C++ 中引用该 ActiveX Object).

先来个例子, 假定一段 VBScript 的过程如下:
Private Function GetValue()
GetValue=5
End Function

你期望在 C++ 中执行此过程, 并将返回值 5 保存到 C++ 中定义的变量中.
这好办, 在 C++ 需要引用 MSScript.ocx, 以下是一个Win32 Console Application (控制台程式, 但这与本主题无关):

main.cpp

#include <windows.h>
#include <stdio.h>
#import "D:\WINDOWS\System32\msscript.ocx" raw_interfaces_only, raw_native_types, no_namespace, named_guids

int main()
{
_variant_t vReturn; // Script 的返回值, Script 是返回 Variant 的
short returnValue; // 从返回值提取有用的值, 因为例子返回 5, 所以用 short 保存
::CoInitialize(NULL);

::IScriptControlPtr p(__uuidof(ScriptControl));
p.AddRef();
p->put_Language(_bstr_t("VBScript")); // 必要, Script 为 VBScript, 当然还可以是 JScript 等
p->put_AllowUI(TRUE); // 可选, 若 VBScript 出现对话框, 并希望在响应之前, C++ 的窗口要等待, 则用 TRUE
p->AddCode(_bstr_t("Private Function GetValue()\nGetValue=5\nEnd Function"));
p->Eval(_bstr_t("GetValue"), &vReturn); // 执行过程, 另还有 Run 和 ExecuteStatement 方法, 但这是关联返回值的.
returnValue = vReturn.iVal; // 因为例子返回 5, 所以使用 _variant_t 的 iVal
p->Release();

printf("%d\n", returnValue);
system("pause");

return 0;
}

执行之后, GetValue 过程的返回值 5 就保存到了 returnValue 中.

----------------------------
关键是使用 MSScript.ocx

需要注意的是:
本例使用了 ::CoInitialize 来初始化 ocx 提供的内容, 但没有使用 ::CoUninitialize (因为这会导致出问题)
所以使用 AddRef 和 Release.

-----
-----
一点错误, 在上面出现, 现在指出:
p.AllowUI(TRUE); // 这个应是允许 Script 有 UI
而等待 C++ 窗口的属性应是 SiteHWnd
即 p->put_SiteHWnd(hwnd);
由于这个例子用 Console, 所以没有提供这个属性.

 

另外参考:http://support.microsoft.com/kb/184977/zh-cn

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3178532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值