Pergunta

Tenho problemas com o carregamento dinâmico de bibliotecas - meu código entra em pânico com o Kern -Exec 3. O código é o seguinte:

TFileName dllName = _L("mydll.dll");
TFileName dllPath = _L("c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(dllName, dllPath); // Kern-Exec 3!
TLibraryFunction f = dll.Lookup(1);
if (f)
    f();

Eu recebo pânico em TInt res = dll.Load(dllName, dllPath); O que posso fazer para me livrar desse pânico? mydll.dll é realmente minha DLL, que possui apenas 1 função exportada (para fins de teste). Talvez algo errado com a DLL? Aqui está o que é:

arquivo def:

EXPORTS
_ZN4Init4InitEv @ 1 NONAME

Arquivo PKG:

#{"mydll DLL"},(0xED3F400D),1,0,0


;Localised Vendor name
%{"Vendor-EN"}

;Unique Vendor name
:"Vendor"

"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\mydll.dll"-"!:\sys\bin\mydll.dll"

Arquivo MMP:

TARGET        mydll.dll
TARGETTYPE    dll
UID          0x1000008d 0xED3F400D

USERINCLUDE  ..\inc
SYSTEMINCLUDE   \epoc32\include

SOURCEPATH    ..\src

SOURCE        mydllDllMain.cpp
LIBRARY      euser.lib

#ifdef ENABLE_ABIV2_MODE
DEBUGGABLE_UDEBONLY
#endif

EPOCALLOWDLLDATA

CAPABILITY CommDD LocalServices Location MultimediaDD NetworkControl NetworkServices PowerMgmt ProtServ ReadDeviceData ReadUserData SurroundingsDD SwEvent TrustedUI UserEnvironment WriteDeviceData WriteUserData

Código fonte:

//  Exported Functions
namespace Init
    {
    EXPORT_C TInt Init()
        {
        // no implementation required
        return 0;
        }
    }

arquivo de cabeçalho:

#ifndef __MYDLL_H__
#define __MYDLL_H__

//  Include Files

namespace Init
{
    IMPORT_C TInt Init();
}

#endif  // __MYDLL_H__

Não tenho idéias sobre isso ... qualquer ajuda é muito apreciada.

PS Estou tentando fazer rlibrary :: carregar porque tenho problemas com a ligação estática. Quando faço a ligação estática, meu programa principal não começa. Decidi verificar o que acontece e descobri esse problema com o rlibrary :: load.

Foi útil?

Solução

O caso que você não pode usar a ligação estática deve ser um forte aviso para você. Isso mostra que há algo errado com sua DLL e o uso de vinculação dinâmica não mudará nada.

Geralmente, nesses casos, o problema está em recursos incompatíveis. A DLL deve ter pelo menos o mesmo conjunto de recursos que seu programa principal possui. E todos esses recursos devem ser cobertos pelo seu Cert Developer.

Outras dicas

Um pânico do Kern-Exec 3 é causado por uma exceção não tratada (falha da CPU) gerada tentando acessar inválida a uma região de memória. Esse acesso inválido à memória pode ser para ambos os códigos (por exemplo, PC ruim por corrupção de pilha) ou dados (por exemplo, acessar a memória liberada). Como tal, geralmente são observados ao desreferenciar um ponteiro nulo (é equivalente a um segfault).

Certamente a chamada para a carga :: A carga nunca deve aumentar um Kern-ExeC 3 devido a um erro programático, é provável que seja uma questão ambiental. Como tal, tenho que especular sobre o que está acontecendo.

Acredito que o problema observado se deve ao estrondo da pilha. Seu arquivo MMP não especifica a pilha ou o tamanho da pilha que o encadeamento inicial deve usar. Como tal, o padrão de 4KB (se bem me lembro) será usado. Da mesma forma, você está usando tfilename - o uso destes na pilha geralmente não é recomendado para evitar ... o excesso de pilha.

Em vez disso, você seria melhor usando a macro _lit () - isso permitirá que você forneça a função RLibrary :: Load com um descritor referenciando diretamente as seqüências constantes, conforme localizado na seção de dados constantes do binário.

Como nota lateral, você deve verificar o valor de erro para determinar o sucesso da chamada de função.

_LIT(KMyDllName, "mydll.dll");
_LIT(KMyDllPath, "c:\\sys\\bin\\");
RLibrary dll;
TInt res = dll.Load(KMyDllName, MyDllPath); // Hopefully no Kern-Exec 3!
if(err == KErrNone)
    {
    TLibraryFunction f = dll.Lookup(1);
    if (f)
        f();
    }
// else handle error
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top