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++/CLI Discussion :

Appeler une fonction C depuis c#


Sujet :

C++/CLI

  1. #1
    Membre Expert Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Par défaut Appeler une fonction C depuis c#
    Salut,

    j'essaie désespérément d'appeler une fonction c depuis un programme c#.

    Ma fonction C est déclarée comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    extern "C" PAGODE
    __declspec(dllexport)
    __stdcall PagodePrice(char *ssj, double cours, char *cp, int jj, int mm, int aa, double strike, char *ae)
    {
    	return _PagodePrice(ssj, cours, cp, jj, mm, aa, strike, ae) ;
    }
    la structure de retour est déclarée de la sorte :

    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
    typedef struct PAGODES
    {
      double value ;
      double delta ;
      double gamma ;
      double vega  ;
      double theta ;
      double rho   ;
      double dvega ;
    	double dvvm  ;
    	double rsmile ;
    	double rdvmin ;
      double vol ;
    	double volC ;
    	double vegart ;
    	double vegah ;
    	double rsmileh ;
      double rsmilert ;
    	char   ts[50] ;
    } PAGODE ;
    J'ai tenté d'appeler la fonction en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            [DllImport("pagode32.dll", EntryPoint = "_PagodePrice@40")]
            public static extern IntPtr PagodePrice(
                [In]string X_CODE_Long, [In]double cours, [In]string cp, [In]int jj, [In]int mm, [In]int aa, [In]double strike, [In]string ae);
    J'ai tenté de remplacer l'Entrypoint par le nom de la fonction "PagodePrice", le type de retour IntPtr par une classe PAGODE équivalente C# mais rien n'y fait
    J'obtiens toujours une exception "AccessViolationException"

    "Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée"
    Je suis sûr que la fonction de la DLL fonctionne parfaitement car déjà utilisée dans une vieux programme C.

    J'utilise une autre fonction de cette DLL qui fonctionne très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            [DllImport("pagode32.dll",EntryPoint="PagodeForward")]
            public static extern double PagodeForward(
                [In]string X_CODE_Long, [In]double cours, [In]int jj, [In]int mm, [In]int aa);

    Est-ce que quelqu'un a une idée? Merci d'avance

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Par défaut
    tu peux poster ta classe pagode equivalente ,

    SInonun petit truc , enleve tes [In] et ne les met jamais , si tu passe un tableau par exemple byte[] qui sera modifié par ta fonction c alors met [In,Out] devans sinon aucune modification ne sera faite sur celui si.

  3. #3
    Membre Expert Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Par défaut
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
        [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
        public class PAGODE
        {
            /// <summary>
            /// Le PNL
            /// </summary>
            public double value;
            /// <summary>
            /// Sensibilité du pnl au spot
            /// </summary>
            public double delta;
            /// <summary>
            /// Sensibilité du delta au spot
            /// </summary>
            public double gamma;
            /// <summary>
            /// Sensibilité du pnl à la volatilté historique
            /// </summary>
            public double vega;
            /// <summary>
            /// Sensibilité du pnl au temps
            /// </summary>
            public double theta;
            /// <summary>
            /// Sensibilité du pnl au taux
            /// </summary>
            public double rho;
            public double dvega;
            /// <summary>
            /// Sensibilité du pnl au vmin
            /// </summary>
            public double dvvm;
            public double rsmile;
            public double rdvmin;
            public double vol;
            public double volC;
            /// <summary>
            /// Sensibilité du pnl à la volatilité à la monnaie
            /// </summary>
            public double vegart;
            public double vegah;
            /// <summary>
            /// Sensibilité du pnl au smile historique
            /// </summary>
            public double rsmileh;
            /// <summary>
            /// Sensibilité du pnl au smile racine de T
            /// </summary>
            public double rsmilert;
            [MarshalAs(UnmanagedType.ByValArray)]
            public byte[] ts;
     
            public PAGODE()
            {
                value     = 0.0;
                delta   = 0.0;
                gamma   = 0.0;
                vega    = 0.0;
                vegart  = 0.0;
                theta   = 0.0;
                rho     = 0.0;
                rsmilert   = 0.0;
                dvvm   = 0.0;
                rsmileh     = 0.0;
                rsmilert   = 0.0;
            }
        }
    et voilà l'équivalent en C#

    J'ai essayé d'enlever les [In] mais sans succès.

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Par défaut
    -je te consille de ne pas trop jouer avec les attribut type StructLayout quand tu cree ta structurec# dans un premier temps car ca peut plus deranger que autre chose. Ensuite tu peux toujours les rajouter mais dans 99% ils ne servent a rien.

    Ensuite dans ta classe struct c tu as

    char ts[50] ;

    et dans ta classe c#

    public byte[] ts;

    n' oublie pas d initialier ts par un new byte[50] sinon tu va avoir des AccessViolationException

Discussions similaires

  1. [Python API] Appeller une fonction Python depuis le C++
    Par wetneb dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 18/10/2007, 12h49
  2. Réponses: 10
    Dernier message: 24/05/2007, 11h14
  3. [WebForms]Comment appeler une fonction ASP depuis une JavaScript ?
    Par flagadda dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 11/08/2006, 14h24
  4. [Info] Appeler une fonction Ada95 depuis Java
    Par mmathieu dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 15/09/2005, 09h42
  5. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15

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