#include <stdio.h>
#import "C:\winnt\system32\msscript.ocx"  // msscript.ocx
using namespace MSScriptControl;int main(void)
{
HRESULT hr = CoInitialize(NULL); IScriptControlPtr pScriptControl(__uuidof(ScriptControl)); // Create a VARIANT array of VARIANTs which hold BSTRs
LPSAFEARRAY psa;
SAFEARRAYBOUND rgsabound[]  = { 3, 0 }; // 3 elements, 0-based
int i; psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
if (!psa)
{
return E_OUTOFMEMORY;
} VARIANT vFlavors[3];
for (i = 0; i < 3; i++)
{
VariantInit(&vFlavors[i]);
V_VT(&vFlavors[i]) = VT_BSTR;
} V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip")); long lZero = 0;
long lOne = 1;
long lTwo = 2; // Put Elements to the SafeArray:
hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
hr = SafeArrayPutElement(psa, &lOne,&vFlavors[1]);
hr = SafeArrayPutElement(psa, &lTwo,&vFlavors[2]); // Free Elements from the SafeArray:
for(i=0;i<3;i++)
{
SysFreeString(vFlavors[i].bstrVal);
} // Set up Script control properties
pScriptControl->Language = "JScript";
pScriptControl->AllowUI = TRUE;
pScriptControl->AddCode(
"function MyStringFunction(Argu1,Argu2,Argu3)\
{  return \"hi there\" ;}" );// string strResult = pScriptControl ->Eval("1+3+6*9"); //  Call MyStringFunction with the two args:
_variant_t outpar = pScriptControl->Run("MyStringFunction", &psa);
// Convert VARIANT to C string:
_bstr_t bstrReturn = (_bstr_t)outpar;
char *pResult = (char *)bstrReturn;
// Print the result out:
printf("func=%s\n",pResult); //  Clean up:
SafeArrayDestroy(psa); CoUninitialize(); return 0;
}
我编译运行,老是出现什么内存不可读的错误,谁知道怎么回事?
而我在vc中新建工程,编译没有错误而每次到IScriptControlPtr pScriptControl(__uuidof(ScriptControl));时就说是运行时错误,真是不明白怎么回事了?这个是微软msdn自带的例子呀。

解决方案 »

  1.   

    找找你硬盘上有没有“C:\winnt\system32\msscript.ocx”这个文件
      

  2.   

    做脚本控件啊. 我没多久前做过,不过是直接用 ActiveX Script 来做的
      

  3.   

    使用智能指针,应该用异常机制. 用try包含起来,看看返回的是什么错误
      

  4.   

    使用.CreateInstance()编译运行了一次又不行了.怎么回事?
      

  5.   

    出现这个异常:
    runtime error!
    abnormal program termination
    我才写了三句话
    #import "msscript.ocx" rename_namespace("MSScriptControl")
    using namespace MSScriptControl;方法中
    IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
    就上面这句一加上去就出错.
      

  6.   

    我的代码OK.
    MSScriptControl::IScriptControlPtr pScriptControl;//(__uuidof(MSScriptControl));
    pScriptControl.CreateInstance(__uuidof(MSScriptControl::ScriptControl));
    pScriptControl->Language = "JScript";
      

  7.   

    不知道怎么回事好像是IScriptControlPtr pScriptControl这个对象不能声明成全局变量.把IScriptControlPtr pScriptControl;
    pScriptControl.CreateInstance(__uuidof(ScriptControl));
    放到方法体内就没问题了,谁能解释一下为什么?
      

  8.   

    cl -IC:\Sun\AppServer\jdk\include -IC:\Sun\AppServer\jdk\include\win32 -LD WrapScriptControl.cpp -WrapScriptControl.dll
    再问一个问题就结贴,象这些 -IC:\Sun\AppServer\jdk\include 参数我该怎么直接设置到工程中去?
      

  9.   

    我测试程序就可以。
    我的定义方式:
    全局声明放在 应用类的头文件
    extern CSaveWordToDBApp theApp;
    extern MSScriptControl::IScriptControlPtr pScriptControl;//(__uuidof(MSScriptControl));定义放在应用类实现文件中位置和 theApp一样
    CSaveWordToDBApp theApp;
    MSScriptControl::IScriptControlPtr pScriptControl;//(__uuidof(MSScriptControl));
      

  10.   

    mousefj(冯杰)
    比如我定义了一个全局的变量,在一个类的生命周期中都可以使用它,我应该在哪初始化它呢?
    放到InitInstance()中没法正确加载,放在构造器中也不行,编译没有问题.
      

  11.   

    在调用 CoUninitialize();之前应该释放所有的COM接口,否则会产生问题.
    如果你定义的是全局变量,那么应该在CoUninitialize() 之前加上:g_ScriptControlPtr.Release();* 注意用"."运算来调用,而不是用"->".
      

  12.   

    不是定义成全局变量的问题。
    在InitInstance中创建,在人以一个位置都可以初始化,并且不用再次声明extern MSScriptControl::IScriptControlPtr pScriptControl;
    我建议再查查别的问题,我测试程序一点问题没有。
      

  13.   

    真是困难呀,查了半天也没有查到.我做了试验和楼上说的有点出入,就是你在声明之前调用初始化方法肯定不行,theapp声明在构造函数之后,我把声明放在那里,然后在构造函数里初始化,就提示错误,说没有定义的变量,这个c/c++和java不一样,java中的属性可以放到文件的屁股上去声明,构造器可以在声明之前。