Funktionsdeklaration



  • Hallo

    habe gerade auf der folgenden Seite http://www.a-m-i.de/tips/office/officeautomation.php#cppexample_Excel etwas zum Zugriff auf Excel Dateien gefunden. Wollte die Funktionen jetzt einfach mal ausprobieren um zu schauen ob ich sie gebrauchen kann oder nicht.
    Leider scheitere ich bei folgender Funktion. Ich kann mit dem 2. Parameter nichts anfangen. Kann mir jemand sagen wofür der gut ist??

    void CExcelDatei::GetCellValue(const BSTR bsRange, BSTR * pbsInhalt)
    {
    // bsRange ist die Adresse der Zelle, also z.B. "A1"
    
      *pbsInhalt = NULL;
    
      // Unsinnige Parameter abfangen:
      if (SysStringLen(bsRange) <= 0) 
        return;
    
      // Sicherstellen, daß ein Workbook offen ist:
      _ASSERT(m_spIExcelApp != NULL);
      if (m_spIExcelApp == NULL)
        return;
    
      if (m_spWorkbook == NULL)
        return;
    
      CComDispatchDriver spDispWorkbook(m_spWorkbook);
      HRESULT hr;
      VARIANT vResult;
    
      hr = spDispWorkbook.GetPropertyByName(L"ActiveSheet", &vResult);
      _ASSERT(SUCCEEDED(hr));
    
      CComDispatchDriver spSheet(vResult.pdispVal);
    
      hr = spSheet.GetPropertyByName(L"Cells", &vResult);
      _ASSERT(SUCCEEDED(hr));
    
      CComDispatchDriver spCells(vResult.pdispVal);
      DISPID dwDispIDRange;
    
      {
        DISPPARAMS dispparms;
        VARIANT vArgs[1];
    
        hr = spCells.GetIDOfName(L"Range", &dwDispIDRange);
    
        memset(vArgs, 0, sizeof(VARIANT) * 1);
        vArgs[0].vt = VT_BSTR;
        vArgs[0].bstrVal = SysAllocString(bsRange);
    
        dispparms.cArgs = 1;
        dispparms.rgvarg = vArgs;
        dispparms.cNamedArgs = 0;
    
        hr = spCells->Invoke(dwDispIDRange, IID_NULL,
            LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
            &dispparms, &vResult, NULL, NULL);
        _ASSERT(SUCCEEDED(hr));
    
        if (FAILED(hr))
          return;
      }
    
      CComDispatchDriver spRange(vResult.pdispVal);
    
      hr = spRange.GetPropertyByName(L"Value", &vResult);
      _ASSERT(SUCCEEDED(hr));
    
      if (SUCCEEDED(hr))
      {
        if ((vResult.vt == VT_BSTR) && (SysStringLen(vResult.bstrVal) > 0))
          *pbsInhalt = SysAllocString(vResult.bstrVal);
      }
    }
    

    MfG
    Chris



  • Das ist im Prinzip der "Rückgabewert", also das was in der Zelle steht.

    Ich habs jetzt nur überflogen, aber das erscheint mir am logischsten. 🙂



  • In dem zweiten Parameter wird der Inhalt der Zelle als BSTR gespeichert.
    Umd die Funktion aufzufrufen gibst du einfach mal so was mit:

    BST bstrVal = NULL;
    
    //bsRange ist z.B. A1
    BSTR bsRange = CString("A1").AllocSysString();
    GetCellValue(bsRange, &bstrVal);
    
    //Verwendung des Inhalts
    
    //So nun noch Ressourcen frei geben
    SysFreeString(bsRange);
    SysFreeString(bstrVal);
    

    Ein BSTR wird für Strings auf COM-Ebene verwendet. Diese kannst du einfach beim Konstruktor eines CStrings mitgeben, damit du mit 'gewohnten' Strings arbeiten kannst. Analog kannst aber auch _bstr_t verwenden. Shcau mal in der MSDN.

    Gruß,
    Stalin


Anmelden zum Antworten