Slik åpner eksisterende fil med COM / ATL (ingen MFC)

stemmer
2

Jeg har en eksisterende Windows C ++ program som linker til ATL. Jeg trenger å åpne en eksisterende Excel-fil og få tilgang til enkelte eiendommer. En av de tingene jeg trenger å gjøre er å finne ut om brukeren er for tiden ser på Excel-filen.

Vi kan anta at brukeren har Excel installert, men ikke sikker på hvilken versjon.

Hva er C ++ / COM-kode for å koble til en eksisterende Excel-fil? Hvordan finner jeg ut om filen er åpnet av en forekomst av Excel? Anta jeg vet filnavnet. Jeg googlet rundt i 15 minutter, men har ikke funnet ut hvordan du gjør dette uten MFC.

Publisert på 02/10/2008 klokken 11:21
kilden bruker
På andre språk...                            


1 svar

stemmer
3

Fin utfordring. Og fordi en utfordring ikke kan nektes jeg satt foran Visual Studio og her er en mulig løsning.

#include <windows.h>
#include <iostream>

using namespace std;

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" \
    rename("RGB", "MSORGB") \
    rename("DocumentProperties", "MSDocumentProperties")

using namespace Office;

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

using namespace VBIDE;

#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" \
    rename("DialogBox", "ExcelDialogBox" ) \
    rename("RGB", "ExcelRGB") \
    rename("CopyFile", "ExcelCopyFile") \
    rename("ReplaceText", "ExcelReplaceText")

void DumpCOMError(_com_error& e) {
    wcout << L"Error:" << endl;
    wcout << L"  Code = " << hex << e.Error() << endl;
    wcout << L"  Code meaning = " << e.ErrorMessage() << endl;
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    wcout << L"  Source = " << bstrSource << endl;
    wcout << L"  Description = " << bstrDescription << endl;
}

HRESULT IsXlsFileOpen(LPWSTR FileName, BOOL& file_open) {
    Excel::_ApplicationPtr pApplication;
    HRESULT hr = E_FAIL;
    if (FAILED(hr = pApplication.CreateInstance(L"Excel.Application"))) {
        file_open = FALSE;
        return hr;
    }

    _variant_t  varOption(static_cast<long>(DISP_E_PARAMNOTFOUND), VT_ERROR);
    Excel::_WorkbookPtr pBook;

    try {
        pBook = pApplication->Workbooks->Open(
                        FileName, 
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption,
                        varOption);

        file_open = pBook->ReadOnly == VARIANT_TRUE;
        pBook->Close(VARIANT_FALSE);

        hr = S_OK;
    } catch (_com_error& e) {
        file_open = FALSE;
        DumpCOMError(e);
        hr = e.Error();
    }

    pApplication->Quit();
    return hr;
}

int main(int argc, wchar_t* argv[])
{
    CoInitialize(NULL);
    {
        BOOL fileOpen;
        HRESULT hr = IsXlsFileOpen(L"f:\\temp\\treta.xls", fileOpen);
        if (SUCCEEDED(hr)) {
            cout << "File is " << (fileOpen ? "open" : "not open") << "." << endl;
        }
        cout << "IsXlsFileOpen returned: 0x" << hex << hr << endl;
    }
    CoUninitialize();

    return 0;
}

Noen fortjent studiepoeng er i orden:

http://www.vbaexpress.com/kb/getarticle.php?kb_id=625

http://www.codeproject.com/KB/wtl/WTLExcel.aspx

http://www.codeguru.com/forum/printthread.php?s=26acdf89a1a6b79b7aa6a52e11b8d832&threadid=61997

Svarte 02/10/2008 kl. 13:58
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more