代码直接用F5执行没问题,可用Ctrl+F5老出错:VariantCopy 出错, 返回E_INVALIDARG, 参数应该没问题百思不得其解

解决方案 »

  1.   

    可能不是同一个对象;
    F5是DEBUG状态,允许你查看一些变量,堆栈等;
    CTRL+F5是执行你的EXE文件,如果你的EXE文件是以前编译的,那么
    CTRL+F5 != F5
      

  2.   

    F5 调试
    Ctrl+F5 运行
    为什么出错,程序发来看看,让俺也见识见识
      

  3.   

    终于找到问题了。此问题困绕了我一天。在我的控件这端我用的是VARIANT类型,在接收器端我却用的是_variant_t类型(调试时改了没改回来, ATL的Bug导致),将接收器端也改为VARIANT类型就对了。此问题在F5下不会出错。欢迎讨论F5和Ctrl+F5的区别
      

  4.   

    F5可以在断点停留;是DEBUG
    F5+CTRL就不可以;是在执行。
      

  5.   

    执行时的当前目录是不一样的,F5是源代码所在目录,而Ctrl+F5是可执行文件exe的所在目录,或者为debug,或者为release。
      

  6.   

    大致代码是这样的,各位可以自已试试:
    控件端:
    idl:
    interface IPkin : IDispatch
    {
    [id(1), helpstring("method Fire")] HRESULT Fire();
    }; dispinterface _IPkinEvents
    {
    methods:
    [id(1), helpstring("method Data")] HRESULT Data(VARIANT  x,BOOL*  y);//
    };//方法Fire 就只触发Data事件
    STDMETHODIMP CPkin::Fire()
    {
    VARIANT  x;
    x.vt =VT_ARRAY|VT_UI1;
    x.parray=SafeArrayCreateVector(VT_UI1, 0, 100);
    BOOL   y=FALSE;
    // TODO: Add your implementation code here
    Fire_Data(x,(LONG*)&y);//
    return S_OK;
    }//封装类 ATL生成的代码有问题
    template <class T>
    class CProxy_IPkinEvents : public IConnectionPointImpl<T, &DIID__IPkinEvents, CComDynamicUnkArray>
    {
    //Warning this class may be recreated by the wizard.
    public:
    HRESULT Fire_Data(VARIANT x, LONG * y)//
    {
    .......... if (pDispatch != NULL)
    {
    VariantClear(&varResult);
    pvars[1] = x;
    pvars[0].vt = VT_BYREF|VT_I4;
    pvars[0].plVal=y;
    DISPPARAMS disp = { pvars, NULL, 2, 0 };
    pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
    }
    ...
    }
    //客户端 随便做一个基于对话框的程序,引入该控件
    //MFC的控件包装类
    class CPkin : public CWnd
    {
    ....
    }//接收器
    extern _ATL_FUNC_INFO OnDataInfo;
    class CEventHandler :
    public IDispEventImpl<
    0,
    CEventHandler,
    &DIID__IPkinEvents,
    &LIBID_ATLLLib,
    1,
    0>
    {
    public:
    //此处应该用VARIANT就不会有错了
        HRESULT __stdcall Data (_variant_t Data ,BOOL* bSucc)//;
    {
    int c=1;
    *bSucc=TRUE;
    return S_OK;
    }// BEGIN_SINK_MAP(CEventHandler)
    SINK_ENTRY_INFO(0, DIID__IPkinEvents, 1, Data, &OnDataInfo) //此处如用SINK_ENTRY_EX会出错,谁能告诉我为什么?
    END_SINK_MAP()}//响应对话框双击事件
    _ATL_FUNC_INFO OnDataInfo={CC_STDCALL, VT_EMPTY, 2, {VT_VARIANT,  VT_BYREF|VT_I4} };void CTESDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    LPUNKNOWN pUn=m_Pkin.GetControlUnknown(); //与控件建立连接
    pp.DispEventAdvise(pUn);
    //调用控件方法,进而触发Fire_Data
    m_Pkin.Fire();
    pp.DispEventUnadvise(pUn);
    CDialog::OnLButtonDblClk(nFlags, point);
    }试试,在我的机器上我用F5运行,连续双击很久都没报错,但在Ctrl+F5下不超过10次就出错了。
      

  7.   

    和Debug release无关。我都是在Debug下
      

  8.   

    可以参照GCC下编译的一些内容,就可以知道无论是F5 or Ctrl+F5 都是一些不同的命令而已。
      

  9.   

    应该不是_variant_t的问题,因为你_variant_t是直接从VARIANT继承过来的
      

  10.   

    在MS出版的VC开发环境的书中,对调试的原理和作用做了详细的介绍
      

  11.   

    F5 调试
    Ctrl+F5 运行
    up
      

  12.   

    to Earthdog(Earthdog),却实是它的问题,你可以看参照我上面贴的代码做个例子试试。