Desenvolvimento - C#

Acesso ao WordBasic via Reflections

Estava com um problema num aplicativo, que se destinava a abrir um documento Word, selecionar a impressora destino, alterar alguns valores dentro do mesmo, e imprimir em seguida na impressora selecionada...

por Paulo Henrique dos Santos Monteiro



Estava com um problema num aplicativo, que se destinava a abrir um documento Word, selecionar a impressora destino, alterar alguns valores dentro do mesmo, e imprimir em seguida na impressora selecionada.

O problema era que o programa simplesmente não imprimia. Usava-se a propriedade ActivePrinter do objeto Word.ApplicationClass, mas o mesmo tinha problemas, fora que o uso desta propriedade muda a impressora padrão do Sistema Operacional, o que não era o desejado.

Analisando o MSDN, verifiquei que o WordBasic possui um método chamado FilePrintSetup, que redireciona a impressora destino SEM ALTERAR a impressora padrão do sistema operacional. Era o que se precisava.

No entanto, existe o problema: O objeto Word.ApplicationClass retorna uma instancia do WordBasic, só que a mesma é acessada como Object. Sua implementação inicial é um IDispatch.

Portanto, para acessar o WordBasic em C# ou VB.NET, é necessário fazer o mesmo que se faz em C++, ou seja, usar o acesso via InvokeMember.

Para tanto, e como não havia precedentes no próprio MSDN (apenas exemplos em C++, VBA, etc), traduzi a chamada que seria utilizada em C++ para C#, usando a capacidade de executar métodos com parâmetros opcionais e nomeados do .NET Framework.

Eis a função (em 2 versões, VB.NET e C#):

C#

private void RedirecionaImpressora(Word.ApplicationClass objWord, string nomeImpressora)
{
			
	Type wordBasic = objWord.WordBasic.GetType();
			
// Imprimir na Impressora Selecionada ...
// Seleciona impressora SEM MUDAR a impressora default do sistema ...

wordBasic.InvokeMember("FilePrintSetup", metodoBindingFlags.DeclaredOnly | 
BindingFlags.Public | BindingFlags.NonPublic | 
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, 
objWord.WordBasic,			new object[]{nomeImpressora,1},null, null, new 
string[]{"Printer","DoNotSetAsSysDefault"});
			
}

VB.NET

Private Sub RedirecionaImpressora(ByVal objWord As Word.Application, ByVal nomeImpressora As String)
   Dim wordBasic As Type = objWord.WordBasic.GetType()
   Dim parametros As Object() = {nomeImpressora, 1}
   Dim nomesparametros As String() = {"Printer", "DoNotSetAsSysDefault"}


   " Imprimir na Impressora Selecionada ...
   " Seleciona impressora SEM MUDAR a impressora default do sistema ...
   wordBasic.InvokeMember("FilePrintSetup", _
       BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or _
       BindingFlags.Instance Or BindingFlags.InvokeMethod Or BindingFlags.OptionalParamBinding, _
       Nothing, _
       objWord.WordBasic, _
       parametros, _
       Nothing, _
       Nothing, _
       nomesparametros)
End Sub

É necessário, como visto, instanciar o objeto Word.Application em seu método, e repassar a instância para o método.

Código Disponível, clique aqui para baixá-lo.

Paulo Henrique dos Santos Monteiro

Paulo Henrique dos Santos Monteiro - Tecnólogo formado pela Faculdade de Tecnologia da Baixada Santista FATEC/BS, com 20 anos de experiência comprovada na área, tendo atuado em praticamente todas as áreas, desde saúde, epidemiologia, até automação bancária, software básico, comércio, indústria, backoffice bancário, jogos, segurança, prestação de serviços e consultoria. Também ministrei aulas de programação, análise e tópicos avançados de programação em escolas de 2º. Grau técnico e cursos particulares.
Iniciou com Basic, Clipper, Assembly e C, passando pelo C++ (em Unix, OS/2, Windows e DOS), e depois desenvolvendo sistemas com Delphi, Visual Basic (conheço desde a obscura versão DOS, e atuo com VB desde o Beta da versão 1), Prolog, Pascal, ASP, Javascript, Java, e com .NET e ASP.Net desde o Beta da primeira versão.
Atua também como DBA, e é grande entusiasta da programação armazenada, em Sybase, Sql Server e Oracle.
Publica dicas e códigos no seu blog,
http://taotecnologia.blogspot.com.