INFORMAÇÕES: Interface do Windows Rundll e Rundll32

Traduções deste artigo Traduções deste artigo
ID do artigo: 164787 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

O Microsoft Windows 95, Windows 98 e Windows Millennium Edition (Me) contém dois programas utilitários da linha de comando Rundll.exe e Rundll32.exe que permite chamar uma função exportada de um DLL, de 16 bits ou 32 bits. No entanto, os programas Rundll e Rundll32 não permitem que você chame nenhuma função exportada de nenhum DLL. Por exemplo, você não pode usar estes programas utilitários para chamar o Win32 API (Application Programming Interface) chamadas exportadas do sistema DLLs. Os programas somente permitem que você chame funções de um DLL que são explicitamente gravadas para serem chamadas por eles. Este artigo fornece mais detalhes sobre o uso dos programas Rundll e Rundll32 nos sistemas operacionais do Windows listados acima.

Microsoft Windows NT 4.0, Windows 2000 e Windows XP enviado somente com o Rundll32. Não há nenhum suporte para o Rundll (o utilitário Win16) em qualquer uma das plataformas.

Os programas utilitários Rundll e Rundll32 foram originalmente projetados somente para uso interno da Microsoft. Mas a funcionalidade oferecida por eles é tão genérica que agora estão disponíveis para uso geral. Observe que o Windows NT 4.0 vem somente com o programa utilitário Rundll32 e oferece suporte somente para Rundll32.

Mais Informações

Rundll vs. Rundll32

O Rundll carrega e executa DLLs de 16 bits enquanto o Rundll32 carrega e executa DLLs de 32 bits. Se você passa o tipo incorreto de DLL para o Rundll ou Rundll32, ele pode falhar em executar sem indicar qualquer mensagem de erro.

Linha de comando Rundll

A linha de comando para Rundll é a seguinte:
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
				
Um exemplo é o seguinte:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Existem três problemas a serem cuidadosamente considerados na linha de comando acima:
  1. O Rundll ou Rundll32 pesquisam pelo nome de arquivo DLL fornecido nos locais padrão (consulte a documentação para a função LoadLibrary() para obter detalhes). É recomendado que você forneça um caminho completo para o DLL para garantir que o correto seja encontrado. Para melhores resultados, use o nome de arquivo abreviado ao invés do nome de arquivo longo para assegurar que nenhum caractere ilegal apareça. Observe, em particular, que isso significa que um DLL na pasta "C:\Program Files" deve ser convertido para um nome menor.
  2. O <dllname> não pode conter nenhum espaço ou vírgula ou aspas. Esta é uma limitação no analisador de linha de comando do Rundll.
  3. Na linha de comando acima, a vírgula (,) entre o <dllname> e o nome da função <entrypoint> é extremamente importante. Se o separador de vírgula está ausente, o Rundll ou o Rundll32 irá falhar sem indicar qualquer erro. Além disso, não pode haver nenhum espaço em branco entre <dllname>, a vírgula e a função <entrypoint>.

Como que o Rundll funciona

O Rundll executa as seguintes etapas:
  1. Ele analisa a linha de comando.
  2. Carrega o DLL especificado via LoadLibrary().
  3. Obtém o endereço da função <entrypoint> via GetProcAddress().
  4. Chama a função <entrypoint>, passando a linha de comando tail que é <argumentos opcionais>.
  5. Quando a função <entrypoint> retorna, o Rundll.exe descarrega o DLL e sai.

Como escrever o seu DLL

No DLL, escreva a função <entrypoint> como o seguinte protótipo:

DLL de 16 bits:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
DLL de 32 bits:
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
Novamente, há três problemas a serem considerados com a função EntryPoint:
  1. Obviamente, o nome "EntryPoint" deve ser substituído com o nome real da sua função do ponto de entrada. Observe que o ponto de entrada Rundll32 é totalmente desvinculado da função DllEntryPoint em um DLL de 32 bits que trata de notificações anexar/desanexar de thread e de processo.
  2. A função entrypoint para o Rundll32 deve ser definida com a convenção de chamada _stdcall (o CALLBACK padroniza para usar o atributo_stdcall). Se o atributo _stdcall está ausente, a função padroniza para a convenção de chamada _cdecl e o Rundll32 terminará de maneira anormal.
  3. Visto que você deve declarar a função com a convenção de chamada _stdcall, conforme descrito acima, o compilador do Visual C++ na verdade exportará ela como _EntryPoint@16 se o DLL for escrito em C ou usará uma decoração de nome adicional se o DLL for escrito em C++. Portanto, tenha cuidado ao usar o nome de exportação de forma correta na linha de comando para Rundll ou Rundll32. Se você deseja evitar usar os nomes decorados, use um arquivo .def e exporte a função entrypoint pelo nome. Consulte a documentação do produto e o artigo a seguir para informações adicionais sobre a decoração de nome ao usar os compiladores do Visual C++:
    140485 Como exportar símbolos PASCAL semelhantes em DLLs de 32 bits
Os parâmetros para o ponto de entrada Rundll são os seguintes:
   hwnd - identificador de janela que deve ser usado como o proprietário da janela para
          qualquer janela que o DLL criar
   hinst - o identificador de instância do DLL
   lpszCmdLine - a linha de comando ASCIIZ que o DLL deve analisar
   nCmdShow - descreve como a janela do DLL deve ser exibida
				
No seguinte exemplo:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
O Rundll chamaria a função entrypoint InstallHinfSection() no Setupx.dll e passaria os seguintes parâmetros:
   hwnd = (identificador de janela pai)
   hinst = HINSTANCE do SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (qualquer que seja o nCmdShow que tenha passado para CreateProcess)
				
Observe que é a função <entrypoint> (ou InstallHinfSection() no exemplo acima) que tem que analisar a linha de comando (o parâmetro lpszCmdLine acima) e usar os parâmetros conforme necessário. O Rundll.exe analisa somente até os argumentos opcionais passado para sua linha de comando O resto da análise vai até a função <entrypoint>.

Observações especiais sobre as diferenças entre o Windows 95 e o Windows NT

No Windows NT, Windows 2000 e Windows XP o comportamento do Rundll32.exe é um pouco diferente, para acomodar as linhas de comando UNICODE.

O Windows NT tenta primeiro o GetProcAddress para <EntryPoint>W. Se esse ponto de entrada for encontrado, supõe-se que o protótipo seja:
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Isto é o mesmo que o ANSI EntryPoint, exceto que o parâmetro lpszCmdLine é agora uma cadeia de caracteres UNICODE.

Se o ponto de entrada <EntryPoint>W não for encontrado, então o Windows NT usará o GetProcAddress para o <entrypoint>A e para o <entrypoint>. Se os dois forem encontrados, então é considerado um ponto de entrada ANSI e é tratado da mesma forma que o Windows 95/98/Me. No entanto, se desejar que o DLL execute no Windows 95 com suporte ANSI e no Windows NT/2000/XP com suporte UNICODE, você deve exportar duas funções: EntryPointW e EntryPoint. No Windows NT/2000/Me, a função EntryPointW será chamada com uma linha de comando UNICODE; no Windows 95/98/Me, a função EntryPoint será chamada com uma linha de comando ANSI.
Observação: este é um artigo de ?PUBLICAÇÃO RÁPIDA? criado diretamente pela organização de suporte da Microsoft. As informações aqui contidas são fornecidas no presente estado, em resposta a questões emergentes. Como resultado da velocidade de disponibilização, os materiais podem incluir erros tipográficos e poderão ser revisados a qualquer momento, sem aviso prévio. Consulte os Termos de Uso para ver outras informações.

Propriedades

ID do artigo: 164787 - Última revisão: terça-feira, 29 de abril de 2014 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Palavras-chave: 
kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage KB164787

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com