3 votes

AccessibleObjectFromWindow renvoie un code E_FAIL

Veuillez revoir le code suivant, qui est censé se connecter à Excel en cours d'exécution :

#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;
}

La vérité est qu'Excel fonctionne réellement à ce moment-là, mais AccessibleObjectFromWindow renvoie E_FAIL. J'ai également essayé d'exécuter ce code dans une boucle et de passer à Excel pour qu'il se concentre sur l'application. La même histoire, AccessibleObjectFromWindow renvoie un E_FAIL. Je cherche maintenant une réponse sur Internet, mais tout ce que j'ai trouvé auparavant ne m'a rien donné. Si quelqu'un pouvait me fournir une explication, je l'apprécierais grandement.

2voto

Daniil Belonin Points 365

J'ai trouvé une réponse à partir d'un exemple de code :

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

Le problème est résolu par l'appel à CoInitialize(NULL) avant de commencer à travailler avec d'autres objets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X