Usando Dll Nativa e Using

Usando Dll Nativa e Using

                Hoje gostaria de mostrar como importar algumas funções nativas do Windows em seu aplicativo usando C#.NET e mostrar como utilizar using de maneira diferente.

                Muitas pessoas precisam acessar funções nativas do sistema operacional Windows, para isso é necessário fazer alguns importes acima do método. Mas antes de começar a mostrar, é necessário usar algumas classes do Framework.NET. (Code 1)

 

using System;

using System.Globalization;

using System.Runtime.ConstrainedExecution;

using System.Runtime.InteropServices;

using System.Security.Principal;

using System.Text;

 

Code 1

                Junto desses using’s descritos acima, existe uma maneira nova de criando variável local que assume os dados da classe. Primeiro se coloca o nome igualando ao a classe que deseja usar. (Code 2)

 

using SysComTypes = System.Runtime.InteropServices.ComTypes;

 

Code 2

                Note que a classe de System.Runtime.InteropServices.ComTypes foi atribuída para a variável SysComTypes. Essa variável pode ser usada dentro da classe em qualquer lugar. É uma maneira interessante para uso de variáveis locais.

                Passando agora para a parte de importação nativa do sistema operacional, você precisa colocar no mínimo três linhas de código para cada importação, dependendo do método. Em exemplo, para verificar se o login do usuário precisa do código abaixo. (Code 3)

//

// advapi32.dll

//

 

[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, LogOnType dwLogonType, LogOnProvider dwLogonProvider, out IntPtr phToken);

 

 

[DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]

         [return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool LogonUser(string lpszUsername, string lpszDomain, IntPtr lpszPassword, LogOnType dwLogonType, LogOnProvider dwLogonProvider, out IntPtr phToken);

 

Code 3

                A dll nativa é a advapi32 do Windows. Existem outras interfaces disponíveis dessa dll, porém não é muito usado.

                Para a dll kernel32 existem outros métodos específicos como pegar a informação do HD local, verificar o status da thread, encontrar arquivo, pegar a memória da máquina e muito mais. Veja alguns exemplos abaixo. (Code 4)

//

// kernel32.dll

//

 

[DllImport("kernel32", BestFitMapping = false, CharSet = CharSet.Unicode, SetLastError = true, ThrowOnUnmappableChar = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool GetVolumeInformation(string lpRootPathName, StringBuilder lpVolumeNameBuffer, int nVolumeNameSize, out int lpVolumeSerialNumber, out int lpMaximumComponentLength, out int lpFileSystemFlags, StringBuilder lpFileSystemNameBuffer, int nFileSystemNameSize);

 

[DllImport("kernel32", SetLastError = true)]

internal static extern ExecutionState SetThreadExecutionState(ExecutionState esFlags);              

 

 

[DllImport("kernel32", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true, ThrowOnUnmappableChar = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool FindNextFile(SafeFindFileHandle hndFindFile, [In, Out] FindData lpFindFileData);

 

[DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]

internal static extern void GlobalMemoryStatus(NativeMemoryStatus lpBuffer);

 

[DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

internal static extern bool GlobalMemoryStatusEx(NativeMemoryStatusEx lpBuffer);

 

Code 4

                Bom, o objetivo foi mostrar apenas como colocar a chamada de funções ou métodos nativos do sistema operacional. Em um próximo artigo, posso mostrar como usar esses métodos específicos.

                Além dessas dlls, existem outras como oleaut32, setupapi, shell32, shlwapi e ole32.dll. Todas essas existem métodos próprios para uso na linguagem C#.NET ou qualquer outra do framework .NET.

                Espero que tenha gostado e qualquer dúvida pode entrar em contato pelo site.

This article was originally written by:
Maurício Júnior
MCP, MCAD, MVP Microsoft
www.mauriciojunior.org
blog.mauriciojunior.org

Leave a Comment
  • Please add 1 and 3 and type the answer here:
  • Post
Wiki - Revision Comment List(Revision Comment)
Sort by: Published Date | Most Recent | Most Useful
Comments
Page 1 of 1 (3 items)
Wikis - Comment List
Sort by: Published Date | Most Recent | Most Useful
Posting comments is temporarily disabled until 10:00am PST on Saturday, December 14th. Thank you for your patience.
Comments
  • Luciano Lima [MVP] Brazil edited Original. Comment: Adicionado (pt-BR) no título e as pt-BR e Portguês Brasil.

  • Maurício Júnior - MCP, MCAD, MVP Microsoft edited Revision 1. Comment: Colocando autor.

  • Priscila Mayumi Sato edited Revision 2. Comment: havia tags perdidas no inicio do texto. Adicionando TOC

  • Maurício, é possível chamar uma Dll serializada em um sql por exemplo?

  • Maurício, é possível chamar uma Dll serializada em um sql por exemplo?

  • Maurício, é possível chamar uma Dll serializada em um sql por exemplo?

  • Ótimo utilizo muito PINVOKE, o ruim é descer STRUCTS para o C++, tem que ajustar tamanho de bytes....

Page 1 of 1 (7 items)