AccessViolationException wurde nicht behandelt

ActiveO2

Ensign
Registriert
Feb. 2009
Beiträge
161
[.COM / .NET / C#] AccessViolationException wurde nicht behandelt

Hallo,

mich belastet schon wieder ein riesen Problem, vielleicht kann mir ja jemand weiterhelfen.

Sobald ich in VB oder C# eine bestimmte, in .COM erstellte Funktion öffnen will kommt folgende Fehlermeldung:

AccessViolationException wurde nicht behandelt
"Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."

btw.: .NET ist installiert.


ein kleines Bsp.:


Code:
//2 Funktionen:
VARIANT GetVARIANT(void)
void SetVARIANT(VARIANT)

//bezogen auf C#:

object variantArray;

variantArray = GetVARIANT (); //funktioniert! Ich bekomme einen richtigen Wert heraus.

// übergebe ich nun dieses VARIANT (object) an die andere Funktion:

SetVARIANT (variantArray);  //funktioniert nicht! Hier kommt die oben beschriebene Fehlermeldung :/



.
 
Zuletzt bearbeitet:
Wäre vielleicht hilfreich zu wissen, was SetVARIANT macht.
Greifst du z. B. darauf auf ein noch nicht vorhandenes Object zu ?
Ich weiß es nicht, wie es bei C# ist, aber ich würde dir einfach die Verwendung eines Vektor empfehlen (ohne nun dein spezifisches Problem zu kennen).

Gruß,

badday
 
Ohne den Code der 2 Funktionen ist es eine Suche nach der sprichwörtlichen Nadel im Heuhaufen. Also poste mal die 2 Funktionen.
 
Hm ich habe diese Funktionen einfach als Beispiel verwenden wollen,
in der ersten Funktion "getVARAIANT(void)" bekomme ich ein VARIANT zurück ( return VARIANTname ).
Die zweite Funktionen braucht einen VARIANT der gleichen form wie ich ihn aus der vorigen Funktion
bekomme.
Ich habe einfach mal darauf spekuliert, dass jemand schoneinmal den selben Fehler hatte.

Anbei: In der "SetVARIANT (VARIANT)"-Funktion wird überprüft ob der übergebene VARIANT den
Anforderungen entspricht. Falls nicht gibt es ein einfaches "return".
Also am Quellcode sollte es hier nicht liegen.


Nachtrag: 20.10.2009, 09.09 Uhr:
C# kennt kein VARIANT.
Der Funktionsparamter von "SetVARIANT" wird mir folgendermaßen angezeigt:
void SetVARIANT (object pVariable)
 
Zuletzt bearbeitet:
Sorry, kann dir nicht helfen ohne die entsprechenden Codes. Im übrigen hat sich bei mir in der Vergangenheit immer wieder gezeigt, das eine "Vorsortierung" oder besser "Vorbeurteilung" von einem Programmierer nicht wirklich geholfen hatte um dessen Problem zu lösen. Keine Dokumentation ist exakter, wie der Quellcode selbst. Mir gehts hier nicht darum von jemand anderen den Code zu "klauen". Also falls du die Codes nicht öffentlich zugänglich machen willst, dann kannst du diese auch gerne per PN schicken...

PS: Woher kommt der Typ VARIANT? Das ganze sieht mir stark nach Interop bzw. Automatisierung aus.
 
Was ist, wenn du nacheinander mal alles versuchst zu initialisieren (da du wohl auf einen Speicher zugreifst, der dir nicht gehört)?
Hast du vll. irgendwo einen NULL-Zeiger?
Sonst könntest du vielleicht noch versuchen die AccessViolationException zu behandeln, also die Ausnahme "einzufangen".

Aber wie Rossibaer schon völlig richtig gesagt hat: Wirklich helfen werden wir erst mit Quellcode können.

Gruß,

badday
 
Hallo,

den Code kann ich leider nicht posten.
Vielleicht fällt ja trotzdem noch jemandem etwas ein.

VS tut automatisch marshallen:
The .NET Framework does not have a "variant" type. If you start typing the
method signature of a referenced third-party library in the Visual Studio IDE, Visual Studio Intellisense will show you the return type of the method.

Failing that, you can do this:

Object obj=MyThirdPartyLib.MyThirdPartyLibFunction();
type t = typeof(obj);

Default marshaling rules map System.Object to/from VARIANT.

Visual Studio automatically puts a wrapper around the COM Object for
me which is great and it specifies the parameter as a "ref Object var"
so when I call it I must specifiy it as follows

Soweit war ich auch schon,
blos wird eben nur in die eine Richtung zuverlässig gemarshallt (schreibt man das so?).
Die Funktion "GetVARIANT()" gibt mir den VARIANT gemarshallt als object zurück.
Blos beim übergeben eines objects macht mir der Compiler faxen.


.
 
Zuletzt bearbeitet:
Wenn du Zugriff auf die Codes der Funktionen hast, dann ändere doch mal die Signatur der SetVARIANT Funktion:

Code:
void SetVARIANT([B]ref[/B] VARIANT obj)

Das ist aber - wie gesagt - nur ein Schuß ins Blaue!

Edit

Ansonsten hier noch 2 Adressen, falls du sie noch nicht selbst gefunden hast:

Überblick/Referenz über Marshalling im .Net Framework: http://msdn.microsoft.com/en-us/library/d3cxf9f0(VS.71).aspx

Interessant, weil der GC während der Laufzeit Objekte hin und her schiebt und so schnell mal ein "BadPointer" für den Unmanaged Code herauskommen kann: http://www.codeproject.com/KB/cs/PinnedObject.aspx

Die 2. Adresse deswegen, weil ein Schreibversuch auf einen geschützten Speicherbereich die AccessViolationException auslösen kann.

Viel Glück!
 
Zuletzt bearbeitet:
Zurück
Oben