Desenvolvimento - C/C++

Apresentando o projeto OmniObjects

Apresento aos meus prezados leitores meu primeiro projeto open source, o OmniObjects. Esse projeto tem o (nada) humilde objetivo de substituir do Microsoft DCOM com algo mais extensível, mais configurável e open source.

por Rodrigo Strauss



Apresento aos meus prezados leitores meu primeiro projeto open source, o OmniObjects. Esse projeto tem o (nada) humilde objetivo de substituir do Microsoft DCOM com algo mais extensível, mais configurável e open source.

Como todos sabem, eu gosto muito de COM, acho o padrão binário do COM um conceito simples, extensível e extremamente multiplataforma. O Firefox (que roda em mais plataformas e sistemas operacionais que meus dedos conseguem contar), por exemplo, é todo feito em XPCOM, que é uma versão do COM feita pelo pessoal da Mozilla Foundation. O CORBA usa exatamente o mesmo conceito. Além desse padrão binário ser independente de linguagem (coisa que o .NET também é), ele também é independente de runtime (coisa que tudo baseado em .NET não é). Não adianta, a coisa mais multiplataforma que existe é C/C++, ainda não inventaram nada que seja mais portável do que um código fonte.

A Microsoft resolveu os problemas do DCOM criando a plataforma .NET, o Remoting e o Windows Communication Foundation. Muito bom, mas se você pretende continuar no C++ nativo, bare metal, sua única alternativa é continuar convivendo com as qualidades e com as limitações do DCOM, além da certeza de que a Microsoft não investirá mais muito tempo nisso. Apesar do DCOM ser uma plataforma madura e testada, lhe falta um toque de Internet. DCOM funciona muito bem em redes locais, mas não é configurável o suficiente para ser usado via Internet. Aí entra o projeto OmniObjects.

O OmniObjects faz exatamente o que faz o DCOM: leva uma chamada à um método de um objeto de uma máquina para outra. Só que ao invés de existir um serviço no Windows que atende requisições em uma porta fixa, você mesmo pode fazer o host do componentes, da mesma forma que no .NET Remoting. Como um código vale mais que mais um entre os milhões de projetos no SourceForge, veja isto:

int main()
{
  OmniInitialize();

  OmniInitializeHosting(L"TCP", L"12345");

  //
  // pronto, já estamos atendendo requisições
  // usando TCP, e na porta 12345. 
  // 
  // "Olhe mamãe, sem a porta 135!"
  //
  _getch();

  OmniUninitialize();

  return 0;
}

Fazer host de objetos COM usando OmniObjects parece simples. E você nem precisa de loop de mensagens como no COM, ele cria uma thread separada para atender as requisições. O código para instanciar um objeto remoto também não é lá muito complicado. Veja com seus próprios olhos:

int main()
{
  OmniInitialize();
  {
    //
    // esse é o nosso smart pointer mais smart do que os outros
    // você não precisa usá-lo, pode usar _com_ptr_t, CComPtr
    // ou gerenciar na mão, como no tempo das cavernas
    //
    omni_ptr<ITest1> pTest1; 
    CComBSTR bstr(L"Olhe mamãe, eu consigo passar pelo firewall!"), bstrOut;
    unsigned int a = 10;

    OmniCreateRemoteInstance(L"tcp://127.0.0.1:12345", CLSID_Test1,
                             NULL, __uuidof(ITest1), pTest1.ppvoid());

    pTest1->Method1(bstr, 25);
    pTest1->Method2(&bstr, &a, &bstrOut);
  }  
  OmniUninitialize();
  return 0;
}

Todo o resto é COM. O que muda em relação ao DCOM é a instanciação do objetos e o hosting. Claro, não tem segurança integrada com Windows, mas isso muitas vezes é uma vantagem. Imagine que você está fazendo um Instant Messenger. Usando OmniObjects você nunca mais vai precisar usar sockets e ficar fazendo parse de pacotes na memória. O código para enviar uma mensagem pode ser algo simples como pInstantMessengerServer->SendMessage("user12312", "Free your mind");. Só não esqueça que apesar de tudo parecer maravilhoso, o projeto OmniObjects ainda está na versão 0.10. Tudo ficará mais maravilhoso ainda (inclusive chamadas via HTTP, etc) ao longo do tempo. :-)

Para fazer com que seu objeto sejá acessível pelo OmniObjects, tudo que você precisa fazer é compilar seu arquivo IDL com o OmniIdl.exe e compilar o projeto Visual C++ 8.0 que ele gerará. Isso produzirá a DLL de proxy e stub que fará toda mágica funcionar. Para mais detalhes e instruções veja a página do projeto OmniObjects.

O OmniObjects é um projeto open source hospedado no SourceForge. Ele está disponibilizado usando licença BSD, que é basicamente: use os fontes para o que você quiser - inclusive para ficar milionário com um aplicativo comercial baseado nele e não me dar nenhum centavo e nem os fontes modificados de volta - contanto que não me responsabilize por nada que acontecer pelo uso desse fonte. Baixe a versão 0.1 enquanto ainda está quente e faça um bom proveito.

Rodrigo Strauss

Rodrigo Strauss - MCP em Visual C++ e C#. Começou a programar com 12 anos de idade, e desde lá nunca mais parou. Trabalha atualmente desenvolvendo softwares para área financeira usando Visual C++, focando a parte server side e de otimização de performance. Entre seus objetos de estudo estão as linguagens C++ e Python, otimização de performance, e programação kernel mode para plataforma Windows.
Mantém o site
www.1bit.com.br, onde escreve um blog e artigos sobre C++ e programação em geral.