如题,怎么定义和使用

解决方案 »

  1.   

    那就定义一个CArray类型的动态数组,作为参数。
      

  2.   

    用std::vector做参数就行了啊。
    或者传两个参数,一个表示类数组的地址,另一个表示参数个数。
      

  3.   

    下面的代码实现了类似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论坛
     监视、收藏、历史、签名走马灯
      

  4.   

    如果参数不是class,
    可以使用"..."表示参数个数不定。建议使用数组(vector)吧。
    使用模板也是可以的,但估计对楼主有一定难度。
      

  5.   

    看看CString的代码:
    vc98\mfc\include\afx.h第539行,vc98\mfc\src\strex.cpp第432、697行
    CString::Format
    CString::FormatV
      

  6.   

    int function (char *format, ...)