2010-08-31 4 views
1

Je rencontre un problème étrange. J'ai écrit un petit module dans VC++ en utilisant OpenCV.Exception de violation d'accès

Cela fonctionne très bien. Le code agrège le flux de la caméra CCTV connectée au port USB.

Cependant, j'ai dû écrire le reste de mon application en C#, j'ai donc créé une DLL du code VC++ et appelé la méthode VC++ de C#.

Maintenant, j'ai fini par obtenir une erreur

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

Quelqu'un peut-il s'il vous plaît me suggérer une solution à cela. Y at-il une violation d'accès lors de l'accès dans un code managé?

+3

Pouvez-vous publier le code où vous appelez la DLL et les définitions externes? J'ai quelques réflexions, je veux m'assurer qu'ils s'appliquent avant de répondre –

+0

[DllImport ("Tracking.dll", EntryPoint = "TrackIt")] public extern statique IntPtr TrackBlob(); C'est l'appel. et c'est où j'appelle IntPtr ptr = TrackIt(); chaîne temp = Marshal.PtrToStringAnsi (ptr); Marshal.FreeBSTR (ptr); – Jayesh

+0

quelle ligne bombarde sur vous? –

Répondre

1

Si TrackBlob retourne une chaîne, vous devriez être en mesure de définir votre dllimport en tant que tel:

[DllImport("Tracking.dll", EntryPoint = "TrackIt")] 
public extern static string TrackBlob(); 

et sauter en essayant de maréchal il. En le retournant comme un IntPtr, vous essayez d'obtenir un pointeur dans la mémoire appartenant à la DLL non managée ... le renvoyer comme une chaîne retournera une copie de la chaîne pour que vous travailliez avec. Faites-moi savoir si cela fonctionne! James

* Modifier *

Essayez l'un de ces:

[DllImport("Tracking.dll", EntryPoint = "TrackIt")] 
public extern static [MarshalAs(UnmanagedType.BStr)] string TrackBlob(); 

ou

[DllImport("Tracking.dll", EntryPoint = "TrackIt")] 
public extern static [MarshalAs(UnmanagedType.AnsiBStr)] string TrackBlob(); 

Vérifiez ce lien MSDN sur marshalling chaîne:
http://msdn.microsoft.com/en-us/library/s9ts558h.aspx

+0

Ma DLL est en train de renvoyer BSTR, car C ne peut pas avoir de chaînes. J'ai essayé votre méthode, en gardant le type de retour dans la DLL comme BSTR. mais même erreur. – Jayesh

+0

Pouvez-vous publier la définition de la méthode C++? –

+0

Salut, la définition de la méthode est énorme. Il ne prend aucun paramètre d'entrée. Calcule le flux d'image et renvoie un BSTR. – Jayesh

Questions connexes