Frage

Ich habe Probleme mit dynamischem Laden von Bibliotheken - mein Code panics mit Kern-Exec 3. Der Code lautet wie folgt:

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();

Ich erhalte Panik auf TInt res = dll.Load(dllName, dllPath); Was kann ich von dieser Panik zu tun bekommen zu befreien? mydll.dll ist wirklich meine dll, die nur 1 exportierte Funktion (für Testzwecke) hat. Vielleicht etwas mit dem DLL? Hier ist, was es ist:

def-Datei:

EXPORTS
_ZN4Init4InitEv @ 1 NONAME

pkg-Datei:

#{"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-Datei:

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

Quellcode:

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

Header-Datei:

#ifndef __MYDLL_H__
#define __MYDLL_H__

//  Include Files

namespace Init
{
    IMPORT_C TInt Init();
}

#endif  // __MYDLL_H__

Ich habe keine Ideen dazu ... Jede Hilfe sehr geschätzt.

P. S. Ich versuche RLibrary :: Load zu tun, weil ich Probleme mit statischer Bindung habe. Wenn ich statische Verknüpfung tun, wird mein Hauptprogramm nicht starten. Ich beschloss, zu überprüfen, was passiert, und entdecken dieses Problem mit RLibrary :: Load.

War es hilfreich?

Lösung

Der Fall, dass Sie nicht statisch Verknüpfung verwenden können, soll eine starke Warnung sein. Es zeigt, dass es etwas falsch mit Ihrem DLL und mit dynamischer Verknüpfung ändert nichts ist.

In der Regel ist in diesen Fällen das Problem in nicht übereinstimmen Fähigkeiten. DLL muss mindestens die gleiche Menge von Fähigkeiten, die Ihr Hauptprogramm hat. Und all diese Funktionen sollten von Ihrem Entwickler cert abgedeckt werden.

Andere Tipps

A KERN-EXEC 3 Panik wird durch eine nicht behandelte Ausnahme (CPU-Fehler) erzeugt, die durch einen Bereich des Speichers zu invalidly Zugriff versucht. Dieser ungültige Speicherzugriff kann sowohl Code sein (zum Beispiel schlecht PC durch Stapelbeschädigung) oder Daten (beispielsweise freigegebene Speicher zugreifen). Als solche werden diese typischerweise beobachtet, wenn ein NULL-Zeiger Dereferenzieren (es einen segfault äquivalent ist).

Sicherlich der Aufruf von RLibrary :: Load sollte nie ein KERN-EXEC 3 aufgrund programmatischer Fehler auslösen, ist es wahrscheinlich ein Umweltproblem sein. Als solche muss ich spekulieren, was geschieht.

Ich glaube, das Problem, das beobachtet wird, aufgrund Stapelüberlauf ist. Ihre MMP-Datei angeben nicht den Stapel oder Heap-Größe der anfängliche Thread verwenden soll. Als solche ist die Standardeinstellung von 4Kb (wenn ich mich richtig erinnere) verwendet. Ebenso TFileName Sie verwenden -. Verwendung dieses auf dem Stapel in der Regel nicht zu vermeiden empfohlen ... Stack-Überlauf

Sie wäre besser dran, die _LIT mit () Makro statt -. Dies ermöglicht es Ihnen, die RLibrary :: Load-Funktion mit einem Descriptor die konstanten Strings direkt zu liefern Referenzierung, wie in der konstanten Datenabschnitt des binären befindet

Als Randbemerkung, sollten Sie den Fehlerwert überprüfen den Erfolg des Funktionsaufrufes zu bestimmen.

_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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top