0

ライブラリの動的ロードに問題があります。コードがKern-Exec3でパニックになります。コードは次のとおりです。

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は、実際には私のdllであり、エクスポートされた関数は1つだけです(テスト用)。たぶん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__

私はこれについて何も考えていません...どんな助けでも大歓迎です。

PS静的リンケージに問題があるため、RLibrary::Loadを実行しようとしています。静的リンケージを実行すると、メインプログラムがまったく起動しません。何が起こるかを確認することにし、RLibrary::Loadでこの問題を発見しました。

4

2 に答える 2

1

KERN-EXEC 3 パニックは、メモリ領域への無効なアクセス試行によって生成された未処理の例外 (CPU 障害) によって発生します。この無効なメモリ アクセスは、コード (たとえば、スタックの破損による不良 PC) またはデータ (たとえば、解放されたメモリへのアクセス) の両方である可能性があります。そのため、これらは通常、NULL ポインターを逆参照するときに観察されます (セグメンテーション違反と同等です)。

確かに RLibrary::Load への呼び出しは、プログラム エラーが原因で KERN-EXEC 3 を発生させるべきではありません。これは環境の問題である可能性があります。そのため、何が起こっているのかを推測する必要があります。

観察されている問題は、スタック オーバーフローによるものだと思います。MMP ファイルで、初期スレッドが使用するスタックまたはヒープ サイズが指定されていません。そのため、デフォルトの 4Kb (私の記憶が正しければ) が使用されます。同様に、TFileName を使用しています。スタック オーバーフローを回避するために、スタックでこれらを使用することは一般的に推奨されません。

代わりに _LIT() マクロを使用することをお勧めします。これにより、バイナリの定数データ セクションにある定数文字列を直接参照する記述子を RLibrary::Load 関数に提供できます。

補足として、関数呼び出しが成功したかどうかを判断するには、エラー値を確認する必要があります。

_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
于 2010-10-27T14:18:07.023 に答える
0

静的リンケージを使用できない場合は、強力な警告になるはずです。これは、DLLに問題があり、ダイナミックリンクを使用しても何も変わらないことを示しています。

通常、これらの場合、問題は機能の不一致にあります。DLLには、少なくともメインプログラムと同じ機能セットが必要です。そして、これらの機能はすべて、開発者証明書でカバーされている必要があります。

于 2010-10-28T06:33:10.450 に答える