IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

PInvokeStackImbalance a été détecté


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 5
    Par défaut PInvokeStackImbalance a été détecté
    Bonjour à tous,
    je ne débute en c#, et j'ai besoin juste de recompiler un ancien programme en c#. Mon prog fait appel a une dll ecrite en c, ci dessous les signatures de la fonction, tout concorde et pourtant il me met l'erreur PInvokeStackImbalance ??
    merci par avance pour votre aide

    code c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern __declspec(dllexport) int calculer(double *var1, double var2);
    code c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public double var1;		
    	public double var2;
    	[DllImport("malib.dll";, EntryPoint="calculer",CallingConvention=0,CharSet=CharSet.Auto)]
    	public static extern int calculer(ref double var1,  double var2);
    	public bool calculerVar()  {
    		int retour = DLL.calculer (ref var1,var2);
    	}
    Message d'erreur :
    PInvokeStackImbalance a été détecté
    Message: Un appel à la fonction PInvoke 'MonAppli!malib.DLL::calculerVar' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    La CallingConvention à 0 ne me semble pas très catholique.

    A priori, en export depuis le C , on écrit les DLL pour exposer des fonctions avec la convention StdCall (dite aussi "convention pascal") .

    Il est rare d'utiliser la convention "C" (Cdecl) en C pour les export (sauf en Windows CE) , précisément par ce que, à part C, peu de technologies clientes peuvent utiliser cette convention d'appel, où, la pile est dépilée par l'appelant, alors qu'en "convention pascal" la pile est dépilée par l'appelé. (en plus d'une inversion de l'ordre des paramètres sur la pile : G à D pour C, D à G pour pascal).

    Par ailleurs, CallingConvention à 0 ne correspond à aucun cas.....

    Ci joint l'enum de CallingConvention :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public enum CallingConvention
    {
    // Summary:
    // This member is not actually a calling convention, but instead uses the default
    // platform calling convention. For example, on Windows the default is System.Runtime.InteropServices.CallingConvention.StdCall
    // and on Windows CE.NET it is System.Runtime.InteropServices.CallingConvention.Cdecl.
    Winapi = 1,
    //
    // Summary:
    // The caller cleans the stack. This enables calling functions with varargs,
    // which makes it appropriate to use for methods that accept a variable number
    // of parameters, such as Printf.
    Cdecl = 2,
    //
    // Summary:
    // The callee cleans the stack. This is the default convention for calling unmanaged
    // functions with platform invoke.
    StdCall = 3,
    //
    // Summary:
    // The first parameter is the this pointer and is stored in register ECX. Other
    // parameters are pushed on the stack. This calling convention is used to call
    // methods on classes exported from an unmanaged DLL.
    ThisCall = 4,
    //
    // Summary:
    // This calling convention is not supported.
    FastCall = 5,
    }

Discussions similaires

  1. Warning PInvokeStackImbalance a été détecté
    Par Rpi78 dans le forum VB.NET
    Réponses: 0
    Dernier message: 02/08/2012, 12h05
  2. Carte réseau non détectée sous Win XP
    Par maddog2032 dans le forum Hardware
    Réponses: 10
    Dernier message: 20/10/2005, 11h54
  3. détected si .net est present sur la machine
    Par calfater dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 08/09/2005, 22h11
  4. [JMF] webcam non détectée
    Par Goldocrack dans le forum Multimédia
    Réponses: 3
    Dernier message: 17/07/2005, 00h31
  5. Comment détecté automatiquement Une base erronée.
    Par ada_b dans le forum Débuter
    Réponses: 4
    Dernier message: 13/01/2005, 07h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo