一般来说是这个,myvariant.bstrVal你可以判断一下myvariant.vt == VT_BSTR 还是其他的值from msdn:
-------------------------------typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;typedef struct tagVARIANT  {
   VARTYPE vt;
   unsigned short wReserved1;
   unsigned short wReserved2;
   unsigned short wReserved3;
   union {
      Byte                    bVal;                 // VT_UI1.
      Short                   iVal;                 // VT_I2.
      long                    lVal;                 // VT_I4.
      float                   fltVal;               // VT_R4.
      double                  dblVal;               // VT_R8.
      VARIANT_BOOL            boolVal;              // VT_BOOL.
      SCODE                   scode;                // VT_ERROR.
      CY                      cyVal;                // VT_CY.
      DATE                    date;                 // VT_DATE.
      BSTR                    bstrVal;              // VT_BSTR.
      DECIMAL                 FAR* pdecVal          // VT_BYREF|VT_DECIMAL.
      IUnknown                FAR* punkVal;         // VT_UNKNOWN.
      IDispatch               FAR* pdispVal;        // VT_DISPATCH.
      SAFEARRAY               FAR* parray;          // VT_ARRAY|*.
      Byte                    FAR* pbVal;           // VT_BYREF|VT_UI1.
      short                   FAR* piVal;           // VT_BYREF|VT_I2.
      long                    FAR* plVal;           // VT_BYREF|VT_I4.
      float                   FAR* pfltVal;         // VT_BYREF|VT_R4.
      double                  FAR* pdblVal;         // VT_BYREF|VT_R8.
      VARIANT_BOOL            FAR* pboolVal;        // VT_BYREF|VT_BOOL.
      SCODE                   FAR* pscode;          // VT_BYREF|VT_ERROR.
      CY                      FAR* pcyVal;          // VT_BYREF|VT_CY.
      DATE                    FAR* pdate;           // VT_BYREF|VT_DATE.
      BSTR                    FAR* pbstrVal;        // VT_BYREF|VT_BSTR.
      IUnknown                FAR* FAR* ppunkVal;   // VT_BYREF|VT_UNKNOWN.
      IDispatch               FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH.
      SAFEARRAY               FAR* FAR* pparray;    // VT_ARRAY|*.
      VARIANT                 FAR* pvarVal;         // VT_BYREF|VT_VARIANT.
      void                    FAR* byref;           // Generic ByRef.
      char                    cVal;                 // VT_I1.
      unsigned short          uiVal;                // VT_UI2.
      unsigned long           ulVal;                // VT_UI4.
      int                     intVal;               // VT_INT.
      unsigned int            uintVal;              // VT_UINT.
      char FAR *              pcVal;                // VT_BYREF|VT_I1.
      unsigned short FAR *    puiVal;               // VT_BYREF|VT_UI2.
      unsigned long FAR *     pulVal;               // VT_BYREF|VT_UI4.
      int FAR *               pintVal;              // VT_BYREF|VT_INT.
      unsigned int FAR *      puintVal;             //VT_BYREF|VT_UINT.
   };
};

解决方案 »

  1.   

    一般来说是这个,myvariant.bstrVal你可以判断一下myvariant.vt == VT_BSTR 还是其他的值from msdn:
    -------------------------------typedef struct FARSTRUCT tagVARIANT VARIANT;
    typedef struct FARSTRUCT tagVARIANT VARIANTARG;typedef struct tagVARIANT  {
       VARTYPE vt;
       unsigned short wReserved1;
       unsigned short wReserved2;
       unsigned short wReserved3;
       union {
          Byte                    bVal;                 // VT_UI1.
          Short                   iVal;                 // VT_I2.
          long                    lVal;                 // VT_I4.
          float                   fltVal;               // VT_R4.
          double                  dblVal;               // VT_R8.
          VARIANT_BOOL            boolVal;              // VT_BOOL.
          SCODE                   scode;                // VT_ERROR.
          CY                      cyVal;                // VT_CY.
          DATE                    date;                 // VT_DATE.
          BSTR                    bstrVal;              // VT_BSTR.
          DECIMAL                 FAR* pdecVal          // VT_BYREF|VT_DECIMAL.
          IUnknown                FAR* punkVal;         // VT_UNKNOWN.
          IDispatch               FAR* pdispVal;        // VT_DISPATCH.
          SAFEARRAY               FAR* parray;          // VT_ARRAY|*.
          Byte                    FAR* pbVal;           // VT_BYREF|VT_UI1.
          short                   FAR* piVal;           // VT_BYREF|VT_I2.
          long                    FAR* plVal;           // VT_BYREF|VT_I4.
          float                   FAR* pfltVal;         // VT_BYREF|VT_R4.
          double                  FAR* pdblVal;         // VT_BYREF|VT_R8.
          VARIANT_BOOL            FAR* pboolVal;        // VT_BYREF|VT_BOOL.
          SCODE                   FAR* pscode;          // VT_BYREF|VT_ERROR.
          CY                      FAR* pcyVal;          // VT_BYREF|VT_CY.
          DATE                    FAR* pdate;           // VT_BYREF|VT_DATE.
          BSTR                    FAR* pbstrVal;        // VT_BYREF|VT_BSTR.
          IUnknown                FAR* FAR* ppunkVal;   // VT_BYREF|VT_UNKNOWN.
          IDispatch               FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH.
          SAFEARRAY               FAR* FAR* pparray;    // VT_ARRAY|*.
          VARIANT                 FAR* pvarVal;         // VT_BYREF|VT_VARIANT.
          void                    FAR* byref;           // Generic ByRef.
          char                    cVal;                 // VT_I1.
          unsigned short          uiVal;                // VT_UI2.
          unsigned long           ulVal;                // VT_UI4.
          int                     intVal;               // VT_INT.
          unsigned int            uintVal;              // VT_UINT.
          char FAR *              pcVal;                // VT_BYREF|VT_I1.
          unsigned short FAR *    puiVal;               // VT_BYREF|VT_UI2.
          unsigned long FAR *     pulVal;               // VT_BYREF|VT_UI4.
          int FAR *               pintVal;              // VT_BYREF|VT_INT.
          unsigned int FAR *      puintVal;             //VT_BYREF|VT_UINT.
       };
    };
      

  2.   

    一般来说是这个,myvariant.bstrVal你可以判断一下myvariant.vt == VT_BSTR 还是其他的值from msdn:
    -------------------------------typedef struct FARSTRUCT tagVARIANT VARIANT;
    typedef struct FARSTRUCT tagVARIANT VARIANTARG;typedef struct tagVARIANT  {
       VARTYPE vt;
       unsigned short wReserved1;
       unsigned short wReserved2;
       unsigned short wReserved3;
       union {
          Byte                    bVal;                 // VT_UI1.
          Short                   iVal;                 // VT_I2.
          long                    lVal;                 // VT_I4.
          float                   fltVal;               // VT_R4.
          double                  dblVal;               // VT_R8.
          VARIANT_BOOL            boolVal;              // VT_BOOL.
          SCODE                   scode;                // VT_ERROR.
          CY                      cyVal;                // VT_CY.
          DATE                    date;                 // VT_DATE.
          BSTR                    bstrVal;              // VT_BSTR.
          DECIMAL                 FAR* pdecVal          // VT_BYREF|VT_DECIMAL.
          IUnknown                FAR* punkVal;         // VT_UNKNOWN.
          IDispatch               FAR* pdispVal;        // VT_DISPATCH.
          SAFEARRAY               FAR* parray;          // VT_ARRAY|*.
          Byte                    FAR* pbVal;           // VT_BYREF|VT_UI1.
          short                   FAR* piVal;           // VT_BYREF|VT_I2.
          long                    FAR* plVal;           // VT_BYREF|VT_I4.
          float                   FAR* pfltVal;         // VT_BYREF|VT_R4.
          double                  FAR* pdblVal;         // VT_BYREF|VT_R8.
          VARIANT_BOOL            FAR* pboolVal;        // VT_BYREF|VT_BOOL.
          SCODE                   FAR* pscode;          // VT_BYREF|VT_ERROR.
          CY                      FAR* pcyVal;          // VT_BYREF|VT_CY.
          DATE                    FAR* pdate;           // VT_BYREF|VT_DATE.
          BSTR                    FAR* pbstrVal;        // VT_BYREF|VT_BSTR.
          IUnknown                FAR* FAR* ppunkVal;   // VT_BYREF|VT_UNKNOWN.
          IDispatch               FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH.
          SAFEARRAY               FAR* FAR* pparray;    // VT_ARRAY|*.
          VARIANT                 FAR* pvarVal;         // VT_BYREF|VT_VARIANT.
          void                    FAR* byref;           // Generic ByRef.
          char                    cVal;                 // VT_I1.
          unsigned short          uiVal;                // VT_UI2.
          unsigned long           ulVal;                // VT_UI4.
          int                     intVal;               // VT_INT.
          unsigned int            uintVal;              // VT_UINT.
          char FAR *              pcVal;                // VT_BYREF|VT_I1.
          unsigned short FAR *    puiVal;               // VT_BYREF|VT_UI2.
          unsigned long FAR *     pulVal;               // VT_BYREF|VT_UI4.
          int FAR *               pintVal;              // VT_BYREF|VT_INT.
          unsigned int FAR *      puintVal;             //VT_BYREF|VT_UINT.
       };
    };
      

  3.   

    看见了!
    对了,阿飞兄,我一直想查看这个VARIANT结构,就是找不到,你是怎么找到的呀?教教老弟了!呵呵
      

  4.   

    这个论坛是有问题,提交完一个回复都没有,我就再提交,最后告诉wo
    你不能连贴三次,ft
    msdn索引里面输入VARIANT (别按回车)往下看n行, 有一条叫“VARIANT and VARIANTARG”,双击水边选一个看都可以了
      

  5.   

    myvariant.vt == VT_BSTR
    这个判断不等呀,前者是9,后者是8
    我的EXCEL文件里这是一个字符串“you”啊!
    怎么回事呀?完整代码如下:
    void CAutoprojectDlg::OnRun() 
    {
      try
    {
    _Application app; // app is an _Application object.
    _Workbook book; // More object declarations.
    _Worksheet sheet;
    Workbooks books;
    Worksheets sheets;
    Range range; // Used for Microsoft Excel 97 components.
    LPDISPATCH lpDisp; // Often reused variable.
    COleVariant
    covTrue((short)TRUE),
    covFalse((short)FALSE),
    covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); if(!app.CreateDispatch("Excel.Application"))
    {
    AfxMessageBox("Couldn't CreateDispatch() for Excel");
    return;
    }
    app.SetVisible(TRUE);
    lpDisp = app.GetWorkbooks(); // Get an IDispatch pointer.
    ASSERT(lpDisp);
    books.AttachDispatch(lpDisp); // Attach the IDispatch pointer
    // to the books object.
    lpDisp = books.Open("E:\\test.xls", // test.xls is a workbook.
    covOptional, covOptional, covOptional, covOptional, covOptional,
    covOptional, covOptional, covOptional, covOptional, covOptional,
    covOptional, covOptional ); // Return Workbook's IDispatch pointer.
    book.AttachDispatch( lpDisp );
    lpDisp = book.GetSheets();
    ASSERT(lpDisp);
    sheets.AttachDispatch(lpDisp);
    // Get sheet #1 and attach the IDispatch pointer to your sheet
    // object.
    lpDisp = sheets.GetItem( COleVariant((short)(1)) ); 
    ASSERT(lpDisp);
    sheet.AttachDispatch(lpDisp); lpDisp = sheet.GetRange(COleVariant("B2"), COleVariant("B2"));
    range.AttachDispatch(lpDisp);

    VARIANT myvariant;
    CString str;
    bool is_str=false;
    myvariant=range.GetItem(COleVariant((long)(1)),COleVariant((long)(1)));
    if (myvariant.vt == VT_BSTR)
    is_str=true;
        str=myvariant.bstrVal;
    AfxMessageBox(str);// range.SetNumberFormat(COleVariant("@"));
    // range.SetItem(COleVariant((long)(1)),COleVariant((long)(1)),COleVariant(LPCTSTR("000666"))); 
    // Release dispatch pointers.
    range.ReleaseDispatch();
    sheet.ReleaseDispatch();
    // This is not really necessary because
    // the default second parameter of AttachDispatch releases
    // when the current scope is lost. } // End of processing. catch(COleException *e)
    {
    char buf[1024]; // For the Try...Catch error message.
    sprintf(buf, "COleException. SCODE: %08lx.", (long)e->m_sc);
    ::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);
    } catch(COleDispatchException *e)
    {
    char buf[1024]; // For the Try...Catch error message.
    sprintf(buf,
    "COleDispatchException. SCODE: %08lx, Description: \"%s\".",
    (long)e->m_wCode,(LPSTR)e->m_strDescription.GetBuffer(512));
    ::MessageBox(NULL, buf, "COleDispatchException",
    MB_SETFOREGROUND | MB_OK);
    } catch(...)
    {
    ::MessageBox(NULL, "General Exception caught.", "Catch-All",
    MB_SETFOREGROUND | MB_OK);
    } }
      

  6.   

    我以前做过该操作的冬冬我使用的方法是先判断该VARIANT内你要读取数据的类型
    然后根据类型来使用变量读取 这个绝对错不了
    判断一下吧 先
      

  7.   

    VariantChangeType(&s,&s,0,VT_BSTR)
    就全是BSTR的了
    不过你得判断是否为
    VT_EMPTY
    VT_NULL
      

  8.   

    myvariant=range.getValue();vt = 9 //VT_DISPATCH = 9, 你拿到的是一个item对象