怎么定义动态参数 如题,怎么定义和使用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那就定义一个CArray类型的动态数组,作为参数。 用std::vector做参数就行了啊。或者传两个参数,一个表示类数组的地址,另一个表示参数个数。 下面的代码实现了类似printf的动态参数调用。摘自CSDN助手源码(http://blog.csdn.net/seasol/archive/2006/06/03/771376.aspx)HRESULT CCuteTools::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) { // Begin variable-argument list... va_list er; va_start(er, cArgs); HRESULT hr=AutoWrap(autoType,pvResult,pDisp,ptName,cArgs,er); // End variable-argument section... va_end(er); return hr;}//HRESULT CCuteTools::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs,va_list& er) { // if(!pDisp) { return E_FAIL; } // Variables used... DISPPARAMS dp = { NULL, NULL, 0, 0 }; DISPID dispidNamed = DISPID_PROPERTYPUT; DISPID dispID; HRESULT hr; if(ptName==NULL) { dispID=0; } else { // Get DISPID for name passed... hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID); if(FAILED(hr)) { return hr; } } // Allocate memory for arguments... VARIANT *pArgs = new VARIANT[cArgs+1]; // Extract arguments... for(int i=0; i<cArgs; i++) { pArgs[i] = va_arg(er, VARIANT); } // Build DISPPARAMS dp.cArgs = cArgs; dp.rgvarg = pArgs; // Handle special-case for property-puts! if(autoType & DISPATCH_PROPERTYPUT) { dp.cNamedArgs = 1; dp.rgdispidNamedArgs = &dispidNamed; } // Make the call! CComVariant vResult; hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, &vResult, NULL, NULL); if(FAILED(hr)) { delete [] pArgs; return hr; } if(pvResult!=NULL) { vResult.Detach(pvResult); } delete [] pArgs; return hr;}================================== CSDN助手 全面支持CSDN论坛 监视、收藏、历史、签名走马灯 如果参数不是class,可以使用"..."表示参数个数不定。建议使用数组(vector)吧。使用模板也是可以的,但估计对楼主有一定难度。 看看CString的代码:vc98\mfc\include\afx.h第539行,vc98\mfc\src\strex.cpp第432、697行CString::FormatCString::FormatV int function (char *format, ...) jmail 读取126邮件乱码问题,急急急急急!!! ADO MoveNext()出错问题 listbox控件lbn_SELCHANG_事件? 扩展DLL传递结构体的问题请教 编译程序时遇到了问题?大家帮忙解决下. 急!怎样在vc程序中设置amcap里的Hue、Saturation等属性值 请各位帮忙帮我把下面两个函数封装成动态库,万分感谢!! 一个简单的网页传递参数机制,经理说可以这样做,我却总是实现不了,哪位帮个忙看一下 CListCtrl与CImageList的问题 求求你们了 如何总是在当前活动窗口的标题栏上显示“系统名称” 急需参图像分割的一些算法资料
或者传两个参数,一个表示类数组的地址,另一个表示参数个数。
摘自CSDN助手源码(http://blog.csdn.net/seasol/archive/2006/06/03/771376.aspx)HRESULT CCuteTools::AutoWrap(int autoType, VARIANT *pvResult,
IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
{
// Begin variable-argument list...
va_list er;
va_start(er, cArgs); HRESULT hr=AutoWrap(autoType,pvResult,pDisp,ptName,cArgs,er);
// End variable-argument section...
va_end(er);
return hr;
}//
HRESULT CCuteTools::AutoWrap(int autoType, VARIANT *pvResult,
IDispatch *pDisp,
LPOLESTR ptName, int cArgs,va_list& er)
{
//
if(!pDisp) {
return E_FAIL;
} // Variables used...
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr; if(ptName==NULL)
{
dispID=0;
}
else
{
// Get DISPID for name passed...
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT,
&dispID);
if(FAILED(hr)) {
return hr;
}
} // Allocate memory for arguments...
VARIANT *pArgs = new VARIANT[cArgs+1]; // Extract arguments...
for(int i=0; i<cArgs; i++) {
pArgs[i] = va_arg(er, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call!
CComVariant vResult;
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType,
&dp, &vResult, NULL, NULL);
if(FAILED(hr)) {
delete [] pArgs;
return hr;
}
if(pvResult!=NULL)
{
vResult.Detach(pvResult);
}
delete [] pArgs;
return hr;
}==================================
CSDN助手 全面支持CSDN论坛
监视、收藏、历史、签名走马灯
可以使用"..."表示参数个数不定。建议使用数组(vector)吧。
使用模板也是可以的,但估计对楼主有一定难度。
vc98\mfc\include\afx.h第539行,vc98\mfc\src\strex.cpp第432、697行
CString::Format
CString::FormatV