VC6中F5(Go)和Ctrl+F5(Execute Program)有什么区别 代码直接用F5执行没问题,可用Ctrl+F5老出错:VariantCopy 出错, 返回E_INVALIDARG, 参数应该没问题百思不得其解 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可能不是同一个对象;F5是DEBUG状态,允许你查看一些变量,堆栈等;CTRL+F5是执行你的EXE文件,如果你的EXE文件是以前编译的,那么CTRL+F5 != F5 F5 调试Ctrl+F5 运行为什么出错,程序发来看看,让俺也见识见识 终于找到问题了。此问题困绕了我一天。在我的控件这端我用的是VARIANT类型,在接收器端我却用的是_variant_t类型(调试时改了没改回来, ATL的Bug导致),将接收器端也改为VARIANT类型就对了。此问题在F5下不会出错。欢迎讨论F5和Ctrl+F5的区别 F5可以在断点停留;是DEBUGF5+CTRL就不可以;是在执行。 执行时的当前目录是不一样的,F5是源代码所在目录,而Ctrl+F5是可执行文件exe的所在目录,或者为debug,或者为release。 大致代码是这样的,各位可以自已试试:控件端: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次就出错了。 和Debug release无关。我都是在Debug下 可以参照GCC下编译的一些内容,就可以知道无论是F5 or Ctrl+F5 都是一些不同的命令而已。 应该不是_variant_t的问题,因为你_variant_t是直接从VARIANT继承过来的 在MS出版的VC开发环境的书中,对调试的原理和作用做了详细的介绍 F5 调试Ctrl+F5 运行up to Earthdog(Earthdog),却实是它的问题,你可以看参照我上面贴的代码做个例子试试。 龚建伟老师编写的串口类CSerialPort问题--测试发现串口总是关闭不掉 [求例程] 用windows API实现自定义打印 CArchive操作文件产生的怪问题 寻找好的创意和合作伙伴,本人有技术、资源和项目启动资金 关于CSplitterWnd分割视图后的问题 模板中嵌套一个类该如何写头文件。 什么是”钩子“ CListCtrl控件能不能单独改变某一行的颜色? 形如 FFB46:4A 这样的地址是什么意思? 听说到灌水乐园来可以长可用分,是真的吗?? 對話框的id號怎麼不對呀??大家來看看 怎样更改程序的标题?
F5是DEBUG状态,允许你查看一些变量,堆栈等;
CTRL+F5是执行你的EXE文件,如果你的EXE文件是以前编译的,那么
CTRL+F5 != F5
Ctrl+F5 运行
为什么出错,程序发来看看,让俺也见识见识
F5+CTRL就不可以;是在执行。
控件端:
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次就出错了。
Ctrl+F5 运行
up