Добрый день!

Хочу написать приложение, которое бы подключалось к запущенному браузеру и могло им управлять и получать из него данные. Как я понял, это возможно с помощью xpcom glue.

Написал следующее тестовое приложение:

Выделить код

Код:

#include <stdio.h>

#include "nsISupports.h"
#include "nsCOMPtr.h"
#include "nsXPCOM.h"
#include "nsIServiceManager.h"
#include "nsICookieManager.h"

#include "nsIWindowMediator.h"
#include "nsISimpleEnumerator.h"
#include "nsIDOMWindowInternal.h"
#include "nsServiceManagerUtils.h"

#include "nsXPCOMGlue.h"
#include "xpcom-config.h"
#define XPCOM_GLUE 1

int main()
{
nsresult rv;

    static const GREVersionRange greVersion = {
        "1.8", PR_TRUE,
        "2", PR_TRUE
    };

    char xpcomPath[256];

    rv = GRE_GetGREPathWithProperties(&greVersion, 1, nsnull, 0,xpcomPath, sizeof(xpcomPath));
    if (NS_FAILED(rv)) {
        fprintf(stderr, "Couldn't find a compatible GRE.\n");
        return 1;
    }
printf("GRE: %s\n", xpcomPath);

  nsCOMPtr<nsIServiceManager> servMan;

  strcpy(xpcomPath,"/usr/lib/libxpcom.so");

printf("GRE: %s\n", xpcomPath);

  XPCOMGlueStartup(xpcomPath);

  rv = NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull);
  if (NS_FAILED(rv))
  {
     printf("ERROR: XPCOM intialization error [%x].\n", rv);
     return -1;
  }

/*
  nsCOMPtr<nsIWindowMediator> windowMediator (do_GetService(NS_WINDOWMEDIATOR_CONTRACTID));
  if (windowMediator) { printf("windowMediator ok\n"); } else { printf("fuck\n"); }
*/
  rv = NS_GetServiceManager(getter_AddRefs(servMan));
  if (NS_FAILED(rv)) printf("1\n");

  nsCOMPtr<nsIWindowMediator> windowMediator;
  rv = servMan->GetServiceByContractID("@mozilla.org/appshell/window-mediator;1",NS_GET_IID(nsIWindowMediator),getter_AddRefs(windowMediator));

printf("2\n");

  nsCOMPtr<nsISimpleEnumerator> windowEnumerator;
  windowMediator->GetEnumerator(nsnull, getter_AddRefs(windowEnumerator));

printf("3\n");

  PRBool more;

  windowEnumerator->HasMoreElements(&more);

printf("4\n");

printf("more %d\n", more);

  while (more)
  {
printf("5\n");

    nsCOMPtr<nsISupports> protoWindow;
    windowEnumerator->GetNext(getter_AddRefs(protoWindow));
    if (protoWindow)
    {
      nsCOMPtr<nsIDOMWindowInternal> domWindow = do_QueryInterface(protoWindow);
      if (domWindow) { printf ("Found DOM window!!!\n"); } else { printf ("no window\n"); }
    }
    else
    {
       printf("NO WINDOFZZ\n");
    }
    windowEnumerator->HasMoreElements(&more);
  }

 // Shutdown XPCOM
    NS_ShutdownXPCOM(nsnull);

    XPCOMGlueShutdown();


}

и ничего :-( Пробовал с разными GRE (как видно из кода)
список окон возвращается всегда 0

Если собирать этот код как компоненту, то все в порядке, находится DOM окно ...

Я чего то не понимаю в этой жизни? :-((