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