2011-12-21 4 views
3

Пожалуйста, ознакомьтесь следующий код, который предполагается подключить к Excel в настоящее время работает:AccessibleObjectFromWindow возвращает код E_FAIL

#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. Я сейчас ищу в интернете ответ, но все, что я нашел, ничего не дал мне. Поэтому, если кто-то может дать объяснение, мы будем очень благодарны.

+0

Вы не сказали «пожалуйста, не отвечайте на ссылки MSDN», поэтому [здесь вы идете!] (Http://support.microsoft.com/kb/216686). Это статья о «Как автоматизировать Excel с C++» в комплекте с примерами кода, и это прямо из уст лошади! –

+0

Я видел этот пример, и он отлично работает. Спасибо! К сожалению, он использует OLE вместо MSAA, который мне действительно нужен. Поэтому вопрос все еще открыт. –

+0

Пожалуйста, не обращайте внимания на предыдущие комментарии, так как я резко изменил этот вопрос. Давайте выкопаем точный пример кода, опубликованный выше. Спасибо всем заблаговременно. –

ответ

2

Найдено ответ из некоторого кода, например:

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

Проблема решена с CoInitialize (NULL) вызова перед началом работы с любыми другими объектами.

Смежные вопросы