Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用COM/ATL打开现有文件(无MFC) 我有一个连接到ATL的现有的Windows C++应用程序。我需要打开现有的Excel文件并访问一些属性。我需要做的一件事是确定用户当前是否正在查看Excel文件_C++_Excel_Com - Fatal编程技术网

如何使用COM/ATL打开现有文件(无MFC) 我有一个连接到ATL的现有的Windows C++应用程序。我需要打开现有的Excel文件并访问一些属性。我需要做的一件事是确定用户当前是否正在查看Excel文件

如何使用COM/ATL打开现有文件(无MFC) 我有一个连接到ATL的现有的Windows C++应用程序。我需要打开现有的Excel文件并访问一些属性。我需要做的一件事是确定用户当前是否正在查看Excel文件,c++,excel,com,C++,Excel,Com,我们可以假设用户安装了Excel,但不确定安装了哪个版本 什么是附加到现有Excel文件的C++/COM代码?如何确定文件当前是否由Excel实例打开?假设我知道文件名。我在谷歌上搜索了15分钟,但没有找到在没有MFC的情况下如何做到这一点。这是一个很好的挑战。由于无法拒绝挑战,我坐在VisualStudio前面,这里有一个可能的解决方案 #include <windows.h> #include <iostream> using namespace std; #im

我们可以假设用户安装了Excel,但不确定安装了哪个版本


<>什么是附加到现有Excel文件的C++/COM代码?如何确定文件当前是否由Excel实例打开?假设我知道文件名。我在谷歌上搜索了15分钟,但没有找到在没有MFC的情况下如何做到这一点。

这是一个很好的挑战。由于无法拒绝挑战,我坐在VisualStudio前面,这里有一个可能的解决方案

#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;
}
#包括
#包括
使用名称空间std;
#导入“C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL”\
重命名(“RGB”、“MSORGB”)\
重命名(“DocumentProperties”、“MSDocumentProperties”)
使用名称空间办公室;
#导入“C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB”
使用VBIDE名称空间;
#导入“C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE”\
重命名(“DialogBox”、“ExcelDialogBox”)\
重命名(“RGB”、“ExcelRGB”)\
重命名(“CopyFile”、“ExcelCopyFile”)\
重命名(“ReplaceText”、“ExcelReplaceText”)
无效转储错误(\u com\u错误&e){
wcout