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