AccessibleObjectFromWindow返回一个E_FAIL代码

请检查以下代码,该代码应该连接到当前正在运行的Excel:

#include <windows.h> #include <oleacc.h> #import "C:\Program Files (x86)\Common Files\microsoft shared\OFFICE14\MSO.DLL" no_implementation rename("RGB", "ExclRGB") rename("DocumentProperties", "ExclDocumentProperties") rename("SearchPath", "ExclSearchPath") #import "C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA6\VBE6EXT.OLB" no_implementation #import "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" rename("DialogBox", "ExclDialogBox") rename("RGB", "ExclRGB") rename("CopyFile", "ExclCopyFile") rename("ReplaceText", "ExclReplaceText") BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM) { WCHAR szClassName[64]; if(GetClassNameW(hwnd, szClassName, 64)) { if(_wcsicmp(szClassName, L"EXCEL7") == 0) { //Get AccessibleObject Excel::Window* pWindow = NULL; HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow); if(hr == S_OK) { //Excel object is now in pWindow pointer, from this you can obtain the document or application Excel::_Application* pApp = NULL; pApp = pWindow->GetApplication(); pWindow->Release(); } return false; // Stops enumerating through children } } return true; } int main( int argc, CHAR* argv[]) { //The main window in Microsoft Excel has a class name of XLMAIN HWND excelWindow = FindWindow(L"XLMAIN", NULL); //Use the EnumChildWindows function to iterate through all child windows until we find _WwG EnumChildWindows(excelWindow, (WNDENUMPROC) EnumChildProc, (LPARAM)1); return 0; } 

事实是Excel在当前时刻真正运行,但是AccessibleObjectFromWindow返回E_FAIL。 我也尝试在一个循环中运行这个代码,并切换到Excel专注于应用程序。 同样的故事,AccessibleObjectFromWindow返回一个E_FAIL。 我现在正在网上search一个答案,但之前发现的一切都没有给我。 所以如果有人可以提供一个解释,将不胜感激。

从一些代码示例中find答案:

 int main( int argc, CHAR* argv[]) { CoInitialize( NULL ); ... 

在开始使用任何其他对象之前,CoInitialize(NULL)调用已解决该问题。