使用带有C ++的IActiveScript执行cscript

时间:2015-05-15 14:25:55

标签: c++ com wsh iactivescript

我正在尝试使用cscript IActiveScriptParseParseScriptText执行脚本但由于某种原因我收到错误:E_UNEXPECTED

article给了我很多帮助。我在我的代码中使用了getEngineGuid函数。

以下代码是我尝试过的。它打印:

-2147418113
-2147418113

含义activeScriptParse->ParseScriptText返回E_UNEXPECTED。那么我做错了什么?

#include <iostream>
#include <Windows.h>
#include <ObjBase.h>
#include <ActivScp.h>

using namespace std;

int main(int argc, char* argv[])
{
    CoInitialize(NULL);
    GUID guidBuffer;

    // Find the script engine to use for files that end with a .js extension.
    // This is implemented in the article I linked to.
    getEngineGuid(".js", &guidBuffer);

    IActiveScript *activeScript;
    CoCreateInstance(guidBuffer, 0, CLSCTX_ALL,
                     IID_IActiveScript,
                     (void **)&activeScript);
    IActiveScriptParse *activeScriptParse;
    activeScript->QueryInterface(IID_IActiveScriptParse,
                                 (void **)&activeScriptParse);
    activeScriptParse->InitNew();

    EXCEPINFO ei ={};
    VARIANT result;
    cout << E_UNEXPECTED << endl;
    cout << activeScriptParse->ParseScriptText(OLESTR("(new Date()).getTime()"), NULL,
                                               NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION,
                                               &result, &ei) << endl;
    activeScriptParse->Release();

    return 0;
}

非常感谢!

1 个答案:

答案 0 :(得分:2)

Igor Tandetnik的评论向我指出了正确的方向。

我使用的文章展示了如何SetScriptSite,但它是用c写的。这个问题:How to load & call a VBScript function from within C++有一个非常有用的答案。

正如答案所说,你应该做的是定义一个至少有IActiveScriptSiteIActiveScriptSiteWindow作为接口的类。