AccessibleObjectFromWindow返回E_FAIL代码

AccessibleObjectFromWindow returns an E_FAIL code

本文关键字:FAIL 代码 返回 AccessibleObjectFromWindow      更新时间:2023-10-16

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

#include <windows.h>
#include <oleacc.h>
#import "C:Program Files (x86)Common Filesmicrosoft sharedOFFICE14MSO.DLL" no_implementation rename("RGB", "ExclRGB") rename("DocumentProperties", "ExclDocumentProperties") rename("SearchPath", "ExclSearchPath")
#import "C:Program Files (x86)Common Filesmicrosoft sharedVBAVBA6VBE6EXT.OLB" no_implementation
#import "C:Program Files (x86)Microsoft OfficeOffice14EXCEL.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。我现在在网上搜索一个答案,但所有发现之前没有给我任何东西。因此,如果有人能提供一个解释,我将不胜感激。

从一些代码示例中找到答案:

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

在开始处理任何其他对象之前,使用CoInitialize(NULL)调用解决了这个问题。