シンビアン:カーネルEXECライブラリの3パニック::ロード
質問
私はライブラリの動的ローディングとのトラブルがある - 次のようにカーン-Execの3と私のコードパニックをコードがあります:
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();
私はこのパニックを取り除くために何ができるかTInt res = dll.Load(dllName, dllPath);
にパニックを受けますか? MYDLL.DLLは本当に(テスト用)のみ1エクスポート機能を持っている私のdll、です。たぶんDLLと間違って何か?ここではそれが何であるかです。
DEFファイル:
EXPORTS
_ZN4Init4InitEv @ 1 NONAME
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"
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
のソースコード
// Exported Functions
namespace Init
{
EXPORT_C TInt Init()
{
// no implementation required
return 0;
}
}
ヘッダファイル
#ifndef __MYDLL_H__
#define __MYDLL_H__
// Include Files
namespace Init
{
IMPORT_C TInt Init();
}
#endif // __MYDLL_H__
私は、任意のヘルプは大歓迎です...これについてのアイデアを持っていません。
P.S。私は、静的なリンケージとのトラブルを持っているので、RLibrary ::ロードをやろうとしています。私は静的なリンケージを行うと、私のメインプログラムがまったく起動しません。私は何が起こるかをチェックすることを決めたとRLibrary ::負荷で、この問題を発見します。
解決
あなたは、静的なリンケージを使用することができないという場合は、あなたへの強い警戒する必要があります。それはあなたのDLLで何かが間違っているがあることを示しており、動的リンクは何も変更されません使用します。
通常、これらのケースで問題が不一致の能力です。 DLLは、あなたのメインプログラムが持っている能力の少なくとも同じセットを持っている必要があります。そして、これらすべての機能は、お使いの開発者の証明書によってカバーされるべきである。
他のヒント
A KERN-EXEC 3パニックが不正にアクセスするメモリの領域を試みることによって生成された未処理の例外(CPU障害)によって引き起こされます。この不正なメモリアクセスは、コード(スタック破損によって例えば、悪いPC)またはデータ(例えば、解放されたメモリへのアクセス)の両方にすることができます。 NULLポインタ(これは、セグメンテーション違反に等価である)を逆参照するとき、これらは、典型的には、観察された通りである。
により、プログラムエラーにKERN-EXEC 3を上げるべきではありませんRLibrary ::負荷に確かに呼び出しが、それは環境問題である可能性が高いです。そのように私は何が起こっているかを推測する必要があります。
私は観察されている問題は、スタックオーバーフローが原因であると考えています。あなたのMMPファイルは、初期スレッドが使用するスタックまたはヒープサイズを指定していません。 4Kbのこのようなデフォルトとして(私の記憶が正しければ)が使用されます。同様に、あなたはTFileNameを使用している - スタック上のこれらの使用は、一般的に回避...スタックオーバーフローにはお勧めしません。
。あなたが代わりにマクロ_LIT()を使用したほうが良いでしょう - 。これはあなたがバイナリの定数データセクションにありますよう記述子は直接一定の文字列を参照するとRLibrary ::ロード機能を提供できるようになりますが、
注意点として、あなたは関数呼び出しの成功を決定するために、エラー値をチェックする必要があります。
_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