Windows Vista:Não é possível carregar a DLL 'x.dll':Acesso inválido ao local de memória.(DllNotFoundException)

StackOverflow https://stackoverflow.com/questions/29284

Pergunta

Eu estava testando em um cliente da caixa, esta tarde, que tem o Windows Vista (que Ele tinha em casa, mas eu estou testando em um Business Edition, com os mesmos resultados).

Nós fazemos uso de um .DLL que obtém o ID de Hardware do computador.É o uso é muito simples e o programa de exemplo eu tenho obras criadas.A Dll é Isso a partir de AzSdk.Na verdade, isso funciona perfeitamente no Windows XP.No entanto, por alguma estranha razão, dentro do nosso projecto (modo maior), obtemos a seguinte exceção:

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

Eu não sei o que pode estar causando o problema, desde que eu tenha controle total sobre a pasta.O projeto é uma c#.net aplicação de Formulários do Windows e tudo funciona bem, exceto a chamada para a biblioteca externa.

Eu estou declarando-lo assim:(nota:é não uma biblioteca COM e ele não precisa de estar registado).

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool BIOS, string sRegistrationCode);

E, em seguida, o código de chamada é bastante simples:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");
}

Quando você criar um aplicativo de exemplo, funciona, mas por dentro meu projectit não.No XP funciona bem.Alguma idéia sobre o que eu deveria fazer em Vista para fazer esse trabalho?Como eu já disse, a pasta e sub-pastas ter Controle Total para "Todos".

ATUALIZAÇÃO: Eu não tenho o Vista SP 1 instalado.

ATUALIZAÇÃO 2: Eu instalei o Vista SP1 e agora, com o UAC desativado, nem mesmo o simples exemplo funciona!!!:( Porra Vista.

Foi útil?

Solução

@Martín

A razão que você não recebiam o prompt do UAC é porque o UAC pode apenas alterar a forma como um processo de iniciado, uma vez que o processo está em execução, ele deve ficar no mesmo nível de elevação.O UAC irá solicitar que vai acontecer se a:

  • Vista pensa que é um instalador (muitas regras aqui, o mais simples é chamado "setup.exe"),
  • Se é sinalizado como "Executar como Administrador" (você pode editar esta alterando as propriedades do atalho ou exe), ou
  • Se o exe contém um manifesto solicitando privilégios de administrador.

As duas primeiras opções são soluções alternativas para o 'legado' aplicações que estavam ao redor antes de UAC, a forma correta de fazê-lo para novas aplicações é incorporar um manifesto de recursos pedindo para os privilégios que você precisa.

Algum programa, tais como O Process Explorer parecem elevar um processo em execução (quando você escolher "Mostrar detalhes de todo o processo", no menu arquivo, neste caso), mas o que eles realmente fazem é iniciar uma nova instância, e é essa nova instância, que fica elevada, não a que foi originalmente em execução.Esta é a recomendação maneira de fazê-lo se apenas algumas partes da sua aplicação necessitar de elevação (e.g.especial 'admin' opções de caixa de diálogo).

Outras dicas

Não é possível carregar a DLL 'HardwareID.dll':Acesso inválido ao local de memória.(Exceção de HRESULT:0x800703E6)

O nome do DllNotFoundException é confuso você - isso não é um problema de encontrar ou carregar o arquivo DLL, o problema é que, quando a DLL é carregado, ele faz um ilegais de acesso de memória que faz com que o processo de carregamento falhar.

Como um outro cartaz aqui, eu acho que isso é um problema de DEP, e que o UAC, etc, as alterações têm, finalmente, permitiu-lhe desactivar a DEP para esta aplicação.

É a máquina que você tem o código implementado em uma máquina de 64 bits?Você pode também estar a correr em uma DEP questão.

Editar

Esta é a 1ª geração do Macbook Pro com uma 1ª geração Core 2 Duo processador Intel.Longe de 64 bits.

Eu mencionei 64 bits, porque em níveis baixos, estruturas de 32 bits para 64 bits não recebem o tratamento adequado.Uma vez que as máquinas não são de 64 bits, então mais do que provavelmente desabilitar o DEP seria um bom passo lógico seguinte.Vista fez ficar mais seguro que o XP SP2.

Bem, acabei de fazer o DEP globalmente fora sem sucesso.Mesmo erro.

Bem, eu também li que as pessoas estavam recebendo esse erro depois de actualizar um computador para o Vista SP1.Fazer esses Vista instala o SP1-los?

Acaba por ser algo completamente diferente.Apenas para fins de teste, eu já desativou de UAC (nota:Eu não estava recebendo qualquer linha de comandos).

Ótimo, eu ia sugerir isso, mas eu percebi que você, provavelmente, já tentei.

Você já fez um pedido de apoio para o fornecedor?Talvez haja algo sobre o MacBook Pro de hardware que impede que o produto do trabalho.

Dado que a exceção é uma DllNotFoundException, você pode querer tentar verificar o HardwareID.dll com Dependência Walker ANTES de instalar qualquer dev ferramentas na Vista instalar para ver se de fato existe uma dependência em falta.

Além de permitir controle total para a "Todos" o local também permitir processos, com uma média de nível de integridade de escrever?

Como posso verificar isso ?Eu sou novo a Vista, eu não gosto muito, ele é muito lento, dentro de uma VM para o trabalho diário e para VStudio de uso dentro de uma Máquina Virtual, não traz nada de novo.

A partir de um prompt de comando, você pode executar:

icacls C:\Folder

Se você ver uma linha como "Obrigatório Etiqueta\Obrigatório Alto Nível", em seguida, a pasta é acessível apenas para uma alta integridade do processo.Se não houver nenhuma linha, em seguida, integridade média de processos pode acessá-lo desde que não haja outras ACLs negar o acesso (com base no usuário por exemplo).

EDITAR:Esqueci de mencionar que você pode usar o /setintegritylevel mudar para realmente mudar o necessário nível de integridade para acessar o objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top