如題
最近正在做Office添加、識別和洗掉水印的ATL COM組件,PPT和WORD都已經完成,但是EXCEL在打開檔案的時候COM回傳的HRESULT是0x800AC472。Open的引數除了檔案名之外,其他的引數都已經調成missingtype了,但是還是報錯。偶爾還會崩潰,但是try接不住例外。
打開EXCEL的代碼如下:
CComBSTR bstrFilePath(lpwszFilePath);
CComVariant varUpdateLinks(2);
CComVariant varTrue(VARIANT_TRUE);
CComVariant varFalse(VARIANT_FALSE);
CComVariant varMissingType((long)DISP_E_PARAMNOTFOUND);
varMissingType.vt = VT_ERROR;
LCID lcidSys = GetSystemDefaultLCID();
LCID lcidUsr = GetUserDefaultLCID();
m_spWorkbook.Release();
HRESULT hr = S_OK;
try
{
hr = m_spWorkbooks->Open(
bstrFilePath,
varMissingType, // 指定更新檔案中鏈接的方式。如果省略此引數,則提示用戶指定鏈接的更新方式。如果 Microsoft Excel 正在打開 WKS、WK1 或 WK3 格式的檔案并且 UpdateLinks 引數為 2,則 Microsoft Excel 根據與該檔案關聯的圖形生成圖表。如果此引數為 0,則不創建任何圖表。
varMissingType, // 如果為 True,則以只讀模式打開作業簿。
varMissingType, // 如果 Microsoft Excel 正在打開文本檔案,則由此引數指定分隔符。如果省略此引數,則使用當前的分隔符。
varMissingType, // 一個字串,包含打開受保護作業簿所需的密碼。如果省略此引數并且作業簿已設定密碼,則提示用戶輸入密碼。
varMissingType, // 一個字串,包含寫入受保護作業簿所需的密碼。如果省略此引數并且作業簿已設定密碼,則提示用戶輸入密碼。
varMissingType, // 如果為 True,則不讓 Microsoft Excel 顯示只讀的建議訊息(如果該作業簿以“建議只讀”選項保存)。
varMissingType, // 如果該檔案為文本檔案,則此引數用于指示該檔案來源于何種作業系統(以便正確映射代碼頁和回車/換行符 (CR/LF))。
varMissingType, // 如果該檔案為文本檔案并且 Format 引數為 6,則此引數是一個字串,指定用作分隔符的字符。
varMissingType, // 如果檔案為 Microsoft Excel 4.0 加載宏,則此引數為 True 時可打開該加載宏以使其在視窗中可見。如果此引數為 False 或被省略,則以隱藏方式打開加載宏,并且無法設為可見。
varMissingType, // 當檔案不能以可讀寫模式打開時,如果此引數為 True,則可將該檔案添加到檔案通知串列。Microsoft Excel 將以只讀模式打開該檔案并輪詢檔案通知串列,并在檔案可用時向用戶發出通知。如果此引數為 False 或被省略,則不請求任何通知,并且不能打開任何不可用的檔案。
varMissingType, // 打開檔案時試用的第一個檔案轉換器的索引。首先試用的是指定的檔案轉換器;如果該轉換器不能識別此檔案,則試用所有其他轉換器。
varMissingType, // 如果為 True,則將該作業簿添加到最近使用的檔案串列中。默認值為 False。
varMissingType, // 如果為 True,則以 Microsoft Excel(包括控制面板設定)的語言保存檔案。如果為 False(默認值),則以 Visual Basic for Applications (VBA) (Visual Basic for Applications (VBA):Microsoft Visual Basic 的宏語言版本,用于撰寫基于 Microsoft Windows 的應用程式,內置于多個 Microsoft 程式中。) 的語言保存檔案,其中 Visual Basic for Applications (VBA) 通常為美國英語版本
varMissingType, // 如果未指定任何值,則默認行為通常為普通加載
lcidUsr, // 不知道這個引數有啥用,但是別人說可以設定為0
&m_spWorkbook
);
}
catch (_com_error &e)
{
return OFFICEWATERMARK_ERROR_INIT_COM_EXCEPTION;
}
catch (...)
{
return OFFICEWATERMARK_RETURN_FAILED;
}
if (FAILED(hr) || m_spWorkbook == NULL)
{
return OFFICEWATERMARK_ERROR_FILE_OPEN;
}
還望高人指點
uj5u.com熱心網友回復:
看了一下別人用MFC工程生成DLL的代碼,Workbooks.Open的引數和我的引數也沒啥區別啊。
然后查了excel的VBA開發檔案里面Workbooks.Open的方法介紹,里面的引數描述,所有的引數都是可選的。

在將引數除了檔案名,其余都調成MissingType之后還是無法打開Excel檔案,懷疑是和環境有關。但是我本地安裝的Excel是可以雙擊運行并且編輯檔案的。
不知道是不是我創建Application時引數沒用對,創建Excel Application的代碼如下:
HRESULT hr = m_spApp.CoCreateInstance(OLESTR("Excel.Application"), NULL, CLSCTX_SERVER);回傳的HRESULT是成功的。
uj5u.com熱心網友回復:
找到原因了EXCEL打開檔案HRESULT回傳0x800AC472是因為我用的excel沒有認證,所以軟體打開的時候會彈出一個激活向導視窗。
這個時候如果繼續操作Excel Application的話,會回傳這個0x800AC472錯誤。
所以騷年們,還是乖乖用正版吧
uj5u.com熱心網友回復:
或者……// 關閉激活視窗回呼
BOOL CALLBACK CloseWindowCallback(HWND hwnd, LPARAM lParam)
{
WCHAR wszTitle[512];
LPCWSTR lpwszAuthWinName = (LPCWSTR)lParam;
GetWindowText(hwnd, wszTitle, sizeof(wszTitle));
if (!_wcsicmp(wszTitle , lpwszAuthWinName))
{
::SendMessage(hwnd, WM_CLOSE, 0, 0);
return FALSE;
}
return TRUE;
}
int main()
{
WCHAR lpwszAuthWinName[] = L"Microsoft Office 激活向導";
return !EnumWindows(CloseWindowCallback, (LPARAM)lpwszAuthWinName);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/22043.html
上一篇:hyper無法啟動求助
下一篇:win10家庭版問題
