2010-11-19 36 views
1

Bonjour à tous Je tente d'obtenir des données à partir de mon c-dll non géré. La fonction c attend un pointeur vers une structure, initialise la structure avec une valeur et termine. L'erreur pourrait être n'importe où, même dans la déclaration dll c. (Je fais ce la première fois)invoquer la fonction C avec le pointeur struct en tant que paramètre

Voici le code c h fichier:

#ifndef MYFUNCS_H 
#define MYFUNCS_H 

__declspec(dllexport) typedef struct t_Point{ 
int x; 
int y; 
} Point; 

__declspec(dllexport) Point myFuncs(); 
__declspec(dllexport) int getPoint(Point* point); 
#endif 

c-file:

#include "stdafx.h" 
#include "OpenCVTest.h" 

int getPoint(Point* point){ 
point->x = 4; 
point->y = 2; 
return 0; 
} 

L'emballage en C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace CSharp_mit_OpenCV 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct Point 
    { 
     public int x; 
     public int y; 
    }; 

    class Wrapper 
    { 
     [DllImport("OpenCV Test.dll", CharSet= CharSet.Auto)] 
     public static extern int getPoint(ref Point point); 

    } 
} 

Et la fonction C# qui utilise ce wrapper:

Point p = new Point(); 
      Wrapper.getPoint(ref p); 
      textBox1.Text = p.x.ToString(); 
      textBox2.Text = p.y.ToString(); 

Avec ce code, je reçois l'erreur d'exécution suivante:

« Un appel à la fonction PInvoke 'CSharp mit OpenCV CSharp_mit_OpenCV.Wrapper :: GetPoint! A déséquilibré la pile. Cela est probablement dû au fait que la signature PInvoke gérée ne correspond pas à la signature cible non gérée. Assurez-vous que la convention d'appel et les paramètres de la signature PInvoke correspondent à la cible signature non géré. »

Quel est le problème ici? S'il vous plaît aider! Merci à tous!

Répondre

0

qui calling convention est utilisé par votre projet C? Si c'est cdecl (l'IIRC par défaut), vous devez le spécifier explicitement dans votre attribut DllImport:

[DllImport("OpenCV Test.dll", CharSet = CharSet.Auto, 
    CallingConvention = CallingConvention.Cdecl)] 
public static extern int getPoint(ref Point point);