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 StraussApresento 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.