用ATL写了个COM组件,在组件中启动一个线程进行数据处理,在线程处理数据过程中,通过连接点通知VB写的调用程序计算的进度,在VB IDE中运行没问题,编译后运行就会崩溃。请问为什么会这样?
怎样解决这个问题呢?

解决方案 »

  1.   

    做了一个最简单的例子,还是出错
    DWORD WINAPI ThreadFun(LPVOID lpVoid);STDMETHODIMP CAdd::Add(long a, long b, long *pVal)
    {
    *pVal = a + b;
    CreateThread(NULL, 0, ThreadFun, this, 0, 0);
    return S_OK;
    }DWORD WINAPI ThreadFun(LPVOID lpVoid)
    {
        CAdd *pAdd = (CAdd*) lpVoid;
        for(int i=0 ; i<65535 ; i++)
        {
    pAdd->Fire_OnAdd(i, i*2);
    }
    return 0;
    }HRESULT Fire_OnAdd(LONG a, LONG b)
    {
    CComVariant varResult;
    T* pT = static_cast<T*>(this);
    int nConnectionIndex;
    CComVariant* pvars = new CComVariant[2];
    int nConnections = m_vec.GetSize();

    for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
    {
    pT->Lock();
    CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
    pT->Unlock();
    IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
    if (pDispatch != NULL)
    {
    VariantClear(&varResult);
    pvars[1] = a;
    pvars[0] = b;
    DISPPARAMS disp = { pvars, NULL, 2, 0 };
    pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
    }
    }
    delete[] pvars;
    return varResult.scode;

    }