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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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