Symbian: Kern-Exec 3 Panic on Rlibrary :: Load
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.
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