Laden...

Problem beim DllImport einer unmanaged DLL: Attempted to read or write protected memory

Erstellt von SkySurfer vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.402 Views
S
SkySurfer Themenstarter:in
298 Beiträge seit 2006
vor 13 Jahren
Problem beim DllImport einer unmanaged DLL: Attempted to read or write protected memory

Hi,

ich versuche eine unmanaged C++ DLL einzubinden und hänge gerade etwas..

Habe von der DLL die Header Datei in der ist die Funktion die ich brauche auch definiert:


BOOL ParserInit(char *);

leider nicht als extern C noch mit _declspec (dllimport) was die sache etwas verkompliziert.

habe mir mit bindump den EntryPoint rausgesucht und dann die Funktion in meinen Code eingebunden :


      [DllImport("MdtParser.dll", EntryPoint = "?ParserInit@@YAHPAD@Z", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto, ExactSpelling = true)]
      private static extern bool ParserInit(StringBuilder outBuffer);

Wenn ich diese dann aufrufe bekomme ich folgende Meldung :


Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Habe auch schon CallingConvention = CallingConvention.Cdecl probiert und die gleiche Meldung bekommen.

Hat noch jemand eine Idee was man noch machen kann?

Gruß SkySurfer

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

schau mal in DllImportAttribute-Klasse:

Gibt an, dass die attributierte Methode durch eine nicht verwaltete DLL (Dynamic Link Library) als statischer Einstiegspunkt verfügbar gemacht wird.

Diesen statischen Einstiegspunkt gibt's AFAIK entweder durch _declspec(dllexport), oder die Funktion muss beim Kompilieren der Dll in der EXPORTS-Sektion einer zugehörigen .DEF-Datei bekannt gemacht werden.

Wenn dies nicht gegeben ist (die Dll also nicht weiss, daß die Methode exportiert werden soll), vermute ich, Du hast schlechte Karten.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
SkySurfer Themenstarter:in
298 Beiträge seit 2006
vor 13 Jahren

Habe zur DLL leider nur die Lib.
Also muss ich mir wohl die Arbeit machen und einen Wrapper in mannaged C++ schreiben...

Hatte gehofft ich könnte mir das sparen.

Danke

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
M
1.439 Beiträge seit 2005
vor 13 Jahren

@MarsStein
Die DLL exportiert ja die Funktion. Nur leider als C++ und nicht als C Funktion, daher auch das Name Mangling.
@SkySurfer
Verwende als CallingConvention cdecl statt stdcall

S
248 Beiträge seit 2008
vor 13 Jahren

Hallo,

des Weiteren string verwenden anstatt StringBuilder und CharSet von Auto auf Ansi.

spooky