System.AccessViolationException

buell

Mitglied
Hallo,

ich habe seit gestern ein Problem welches ich irgendwie nicht gelöst bekomme. Ich habe eine unmanaged C++ dll. Auf diese greife ich von managed C++ aus zu. Das funktioniert soweit auch alles wunderbar. Irgendwann während des Programmablaufes wird von der unmanaged dll ein Callback zur managed Seite ausgelöst. Das hat eine Weile wunderbar funktioniert, aber auf einmal geht es nicht mehr.

Hier mal ein paar Code-Auszüge:

managed Seite:
Code:
//VxmlInterpreterAPI.h
typedef void (__stdcall *EventCallback)(int evntType, const char* elementName, const char* expression);

class __declspec(dllexport) VxmlInterpreterAPI : VxmlEventListener
{
.....
private:
	EventCallback callb;
...
public:
	void setCallback(EventCallback* _callback) { callb = *_callback; };
...
}

// .cpp
...
void VxmlInterpreterAPI::vxmlEvent(VxmlEvent *vxmlEvent)
{
	if(vxmlEvent && vxmlEvent != NULL)
	{
		VXMLLOG_TRACE(logger, "callback: " << vxmlEvent->eventType << " " << (vxmlEvent->eventName ? vxmlEvent->eventName : "") << " " << (vxmlEvent->expression ? vxmlEvent->expression : ""));
		if(callb && callb != NULL) (*callb)((int) vxmlEvent->eventType, vxmlEvent->eventName, vxmlEvent->expression);
	}
}
...
{

managed Seite:
Code:
//wrapper.h

namespace VxmlInterpreterDotNetWrapper {

	public delegate void VoiceXMLEventCallback(int evntType, const char* elementName, const char* expression);

	public ref class VxmlInterpreterLib
	{
	private:
		IntPtr dll;
		VoiceXMLEventCallback^ callb;

		[DllImport("VxmlInterpreterDll.dll",
			EntryPoint="?getInstance@VxmlInterpreterAPI@@SAPAV1@XZ")]
		static IntPtr getInstance( );
...
		[DllImport("VxmlInterpreterDll.dll",
			EntryPoint="?setCallback@VxmlInterpreterAPI@@QAEXPAP6GXHPBD0@Z@Z",
			CallingConvention=CallingConvention::ThisCall)]
		static void setCallback( IntPtr instance, VoiceXMLEventCallback^ vxmlCallback );
...
	public:
		VxmlInterpreterDotNetWrapper::VxmlInterpreterLib()
			:dll(getInstance())
		{
			callb = gcnew VoiceXMLEventCallback(this, &VxmlInterpreterDotNetWrapper::VxmlInterpreterLib::OnVxmlEvent);
			setCallback(dll, callb);
		}
....
		void OnVxmlEvent(int evntType, const char* elementName, const char* expression);
...
	};
}

Also ich kann im trace verfolegn, dass die Methode VxmlInterpreterAPI::vxmlEvent noch aufgerufen wird, dann beim Versuch das Callback durchzuführen knallts.

Fehlermeldung:
Unbehandelte Ausnahme: System.AccessViolationException: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hin
weis darauf, dass anderer Speicher beschädigt ist.
bei VxmlInterpreterDotNetWrapper.VxmlInterpreterLib.startFormInterpretation(IntPtr instance, SByte* formName)
bei VxmlInterpreterDotNetWrapper.VxmlInterpreterLib.startFormInterpretation(String formName) in e:\exchange\eml\vsprojects\multimodalframework\vxml
interpreterdotnetwrapper\vxmlinterpreterdotnetwrapper.cpp:Zeile 31.
bei MyTester.Program.test() in E:\Exchange\EML\VSProjects\MultiModalFramework\MyTester\Program.cs:Zeile 43.
bei MyTester.Program.Main(String[] args) in E:\Exchange\EML\VSProjects\MultiModalFramework\MyTester\Program.cs:Zeile 48.

Die Fehlermeldung ist etwas verwirrend, da der DLL-Start mit VxmlInterpreterDotNetWrapper.VxmlInterpreterLib.startFormInterpretation(IntPtr instance, SByte* formName) absolut korrekt ausgeführt wird und erst das Callback den Fehler auslöst.

Hoffe jemand kann mir helfen...
 

Neue Beiträge

Zurück