none
Corruption de Mémoire (Marshall.AllocHGlobal) RRS feed

  • Discussion générale

  • Bonjour à toutes et à tous.

    Voila je vous explique le problème que je rencontre:

    J'ai une Dll C# développé sur Framework 3.5 qui gère une application générique sur laquelle on connecte des drivers.

    A un moment dans cette Dll j'initialise mon système de Trace, dans celui-ci j'ai une méthode organisé de la manière suivante:

    if{...}
    else{...}
    return 0;

    Mon erreur survient plus tard dans un de mes drivers.

    Mon driver utilise le protocole XFS et lors d'une tentative de Get_Info j'ai un erreur interne du Hardware qui est remonté par le Service Provider.

    Malheureusement je ne peux pas avoir plus de détail sur cette erreur.

    Voici la partie de mon driver qui pose problème  :

    IntPtr ipResultStockDeposit2 = Marshal.AllocHGlobal(2048);
    iResult = XFS_LibraryWrapper_XFSAPI.WFSGetInfo(m_lpHService, 1303, (IntPtr)null, 0, ref ipResultStockDeposit2);

    L'alloc à 2048 est normal et je suppose que c'est en partie sa qui pose problème.

    Le truc très étrange est le suivant:

    Dans ma dll générique je passe toujours dans le if, seulement mon programme marche correctement si je commente la partie else.

    La ce niveau la je comprend pas pourquoi, pourquoi une partie du code qui n'est pas exécuté perturberais mon exécution??

     

    Petite précision j'utilise un wrapper pour communiquer avec les Dll du Service Provider en C++.

    Je me trompe peut être de piste mais je trouve sa très louche et je ne comprend pas pourquoi.

    En vous remerciant par avance pour l'aide que vous pouvez me fournir.

    Cordialement

    mardi 21 août 2012 12:48

Toutes les réponses

  • Bonjour Cyril,

    Pourriez-vous nous montrer ce qu'il y a dans le IF ELSE ?


    fred on youTube
    PHP MySQL Web Site Creator
    fred

    mardi 21 août 2012 15:13
  • Voici le bout de code : 

    if ((m_bTrace_COM == false) && (m_bTrace_DEBUG == false) && (m_bTrace_ERROR == false) && (m_bTrace_INFO == false) && (m_bTrace_WARNING == false))
    {
           Console.WriteLine("Dans le if");
    }
    else
    {
           Console.WriteLine("Dans le else");
           string[] strtabFilesInDirectory = Directory.GetFiles(m_strFilePath, "*.log").ToArray<string>();
    
           foreach (string strCurrentFileName in strtabFilesInDirectory)
           {
           string YearOfFile = strCurrentFileName.Substring(m_strFilePath.Length, 4);
           string MonthOfFile = strCurrentFileName.Substring(m_strFilePath.Length + 5, 2);
           string DayOfFile = strCurrentFileName.Substring(m_strFilePath.Length + 8, 2);
    
                    try
                    {
                          // Gets the last modification time of the current file 
                          DateTime oDateOfFile = new FileInfo(strCurrentFileName).LastWriteTime;
    
                          TimeSpan NumberDayBetweenDate = DateTime.Now - oDateOfFile;
                          if (NumberDayBetweenDate.Days > m_iNumberDayLogFileHistorical)
                          {
                           File.Delete(strCurrentFileName);
                          }
                     }
            catch
            {
                      strErrorMessage = String.Format("Error in the format of the date in the file name: {0}", strCurrentFileName);
            }
    }
    }
    Vraiment très particulier comme problème, j'ai bien l'affichage dans les deux cas qui témoigne que je suis dans le if seulement ça marche uniquement si je commente le else. 

    mercredi 22 août 2012 08:46
  • Bonjour,

    Le dernier paramètre doit bien être un pointeur sur un pointeur et non pas un pointeur ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 22 août 2012 17:28
    Modérateur
  • La documentation XFS me donne les informations suivantes:

    WFSGetInfo( hService, dwCategory, lpQueryDetails, dwTimeOut, lppResult );

    HSERVICE hService:  Handle to the Service Provider.
    DWORD dwCategory:  Specifies the category of the query.
    LPVOID lpQueryDetails:  Many queries have no input parameters, in which case this pointer is NULL.
    DWORD dwTimeOut:  Number of milliseconds to wait for completion
    LPWFSRESULT * lppResult:  Pointer to the pointer to the data structure to be filled with the result of the execution. The
    Service Provider allocates the memory for the structure.

    Et voici le Marshall utilisé pour la commande Get_Info :

    [DllImport("MSXFS.dll", EntryPoint = "WFSGetInfo")]
    public static extern int WFSGetInfo(IntPtr hService,
                                        uint dwCategory,
                                        IntPtr lpQueryDetails,
                                        uint dwTimeOut,
                                        ref IntPtr WfsResult);

    J'alloue beaucoup de mémoire pour mon pointeur parce que il va récupérer de nombreux étages de structures.

    Vu que le problème est remonté par la machine il ne s'agit pas d'un problème de traitement des données reçu mais bien de données envoyées à la machine.

    Je sais également que le Handle du service est bon et que les autres paramètres d'entrés sont passés sans variables du coup sont bon aussi.

    En tout cas merci d'avance de l'aide que vous pouvez m'apporter.

    Cordialement

    jeudi 23 août 2012 07:58
  • Bonjour Cyril,

    J'ai pas mal travailler avec le Marshal

    La taille mémoire fournie pour WfsResult doit être la même que la structure indiquée :

    Dans votre cas, il faut définir une structure .net identique à LPWFSRESULT puis le donnée en paramètre.

    Exemple :

    En C++ on a

    struct UserInfo{
        char FirstName[50];
        char LastName[50];
        int Age;
    };

    Ici on a, deux tableaux de caractère (50 + 50 = 100) et un entier (soit 4 octets)

    donc en tout on aura 50 + 1 + 50 + 1 + 4 (1+1 correspondant au 0 final indiquant la fin de chaine en mémoire) et un entier 32bits = 4octets

    A partir de là votre allocation mémoire doit être de même taille soit 106 octets.

    Mais il y a une façon très simple (merci Microsoft), il vous suffit de refaire la même structure coté .Net puis d'utiliser Marshal dans System.Runtime.InteropServices

    Exemple par rapport à celui ci-dessus :

    [StructLayout(LayoutKind.Sequential)]
    struct UserInfo(){
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=50)]
       public char[] FirstName;
       [MarshalAs(UnmanagedType.ByValArray, SizeConst=50)]
       public char[] LastName;
       [MarshalAs(UnmanagedType.I4)] //non obligatoire, le framework le passe en 4 octets
       public int Age;
    }

    Une fois la structure définie, il faut la monter en mémoire :

    créer une instance de la structure, puis utiliser Marshal pour convertir la structure managée en non managée grâce à Marshal.StructureToPtr.

    Si l'application break encore, essayez de faire un Fill des variables de la structure.

    Voilà, si cela ne marche pas ou qu'il faut éclaircir des points (Désolé j'écris vite avant de me sauver), n'hésitez pas à revenir.




    • Modifié Lyamine jeudi 23 août 2012 15:42 ajout [StructLayout(LayoutKind.Sequential)]
    jeudi 23 août 2012 15:40
  • Désolé de répondre si tard.

    Je prend note de votre réponse et vous remercie.

    Je ne pourrais malheureusement pas essayer cette solution tout de suite, car la partie Hardware est partie à l'habillage.

    Je ne pourrais effectuer ces tests que dans une ou deux semaines et je vous donnerais alors le retour de cet essai.

    Cordialement et encore merci de votre aide.

    mercredi 29 août 2012 08:08
  • Re-bonjour,

    Je fais remonter ce post car j'ai récupérer ma partie Hardware mais je n'ai toujours pas réussi à trouver le problème:

    J'ai fais les essais précédemment cité, donc instancier la structure pour initialisé le pointeur dessus mais cela ne résous pas le problème, 

    D'après mes traces ma partie hardware me répond bien puisqu'elle me redonne l'heure de l’exécution, cependant le lpBuffer de ma structure WFSResult : 

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct WFSRESULT
    {
        public uint requestID; //REQUESTID
        public SYSTEMTIME tsTimestamp; //TIMESTAMP
        public uint hResult; //HRESULT
        public union u; //UNION
        public IntPtr lpBuffer; //LPVOID
    }

    est vide.

    Dans cette structure après l’exécution elle est remplie sauf le lpBuffer.

    Sauf que avec une application de test la fonction marche très bien, mais elle ne s’exécute pas sous .Net.

    Comment faire un fill des variables de la structure?

    Ou comment savoir si la mémoire est allouée et en lecture écriture?

    Ou encore si vous avez d'autre pistes je suis preneur.

    En vous remerciant d'avance.

    Cordialement

    mardi 18 septembre 2012 09:16
  • Re-bonjour,

    Je fais remonter ce post car j'ai récupérer ma partie Hardware mais je n'ai toujours pas réussi à trouver le problème:

    J'ai fais les essais précédemment cité, donc instancier la structure pour initialisé le pointeur dessus mais cela ne résous pas le problème, 

    D'après mes traces ma partie hardware me répond bien puisqu'elle me redonne l'heure de l’exécution, cependant le lpBuffer de ma structure WFSResult : 

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct WFSRESULT
    {
        public uint requestID; //REQUESTID
        public SYSTEMTIME tsTimestamp; //TIMESTAMP
        public uint hResult; //HRESULT
        public union u; //UNION
        public IntPtr lpBuffer; //LPVOID
    }

    est vide.

    Dans cette structure après l’exécution elle est remplie sauf le lpBuffer.

    Sauf que avec une application de test la fonction marche très bien, mais elle ne s’exécute pas sous .Net.

    Comment faire un fill des variables de la structure?

    Ou comment savoir si la mémoire est allouée et en lecture écriture?

    Ou encore si vous avez d'autre pistes je suis preneur.

    En vous remerciant d'avance.

    Cordialement

    Bonjour,

    En fait en relisant votre documentation, LPWFSRESULT retourne un pointer de pointer.

    Si vous faites un Marshal.ReadIntPtr(LPWFSRESULT) après appel de WFSGetInfo, est-ce qu'il vous retourne un Pointer ?

    Si oui, Il faut utiliser la méthode précédente pointer vers struct pour récupérer la structure en fonction de ce pointer.


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !



    • Modifié Lyamine mardi 18 septembre 2012 09:36
    mardi 18 septembre 2012 09:32
  • Re bonjour, 

    J'ai d'autres infos encore plus ennuyante sur ce problème:

    En fait ce driver tourne dans une application générique qui l'appelle et l'instancie, les nouvelles infos que j'ai sont les suivantes:

    - Ma partie Hardware peut fonctionner correctement si je désactive certain système de mon application générique.

    - Mon application a de nombreux problèmes lors du fonctionnement avec mon driver, comme si des modules n’existaient plus (par exemple un système de gestion de messages)

    Ce qui me fait de plus en plus penser à un problème de corruption de mémoire : 

    Je vous fournis quelque marshalling sur lesquelles j'ai des doutes:

    (C++) HAPP hApp   ==>   (C#) uint hApp
    The application handle to be associated with the session being opened.If this parameter is
    equal to WFS_DEFAULT_HAPP, the session is associated with the calling process as a whole

    (C++) LPHSERVICE lphService  ==>  (C#) ref IntPtr lphService

    Pointer to the service handle that the XFS Manager assigns to the service on a successful open

    (C++) HSERVICE hService  ==>  (C#) IntPtr hService
    Handle to the Service Provider as returned by WFSOpen or WFSAsyncOpen

    (C++) HWND hWndReg  ==>  (C#) IntPtr hWndReg (= oPanel.Handle)

    The window handle which is to be registered to receive the specified messages

    Je comprend vraiment pas ce qui pourrais faire dysfonctionner mon application alors qu'elle tourne très bien avec tout les autres driver.

    Les seuls différences sont le marshalling et l'utilisation d'un Service Provider.

    mardi 18 septembre 2012 15:45
  • Re bonjour, 

    J'ai d'autres infos encore plus ennuyante sur ce problème:

    En fait ce driver tourne dans une application générique qui l'appelle et l'instancie, les nouvelles infos que j'ai sont les suivantes:

    - Ma partie Hardware peut fonctionner correctement si je désactive certain système de mon application générique.

    - Mon application a de nombreux problèmes lors du fonctionnement avec mon driver, comme si des modules n’existaient plus (par exemple un système de gestion de messages)

    Ce qui me fait de plus en plus penser à un problème de corruption de mémoire : 

    Je vous fournis quelque marshalling sur lesquelles j'ai des doutes:

    (C++) HAPP hApp   ==>   (C#) uint hApp
    The application handle to be associated with the session being opened.If this parameter is
    equal to WFS_DEFAULT_HAPP, the session is associated with the calling process as a whole

    (C++) LPHSERVICE lphService  ==>  (C#) ref IntPtr lphService

    Pointer to the service handle that the XFS Manager assigns to the service on a successful open

    (C++) HSERVICE hService  ==>  (C#) IntPtr hService
    Handle to the Service Provider as returned by WFSOpen or WFSAsyncOpen

    (C++) HWND hWndReg  ==>  (C#) IntPtr hWndReg (= oPanel.Handle)

    The window handle which is to be registered to receive the specified messages

    Je comprend vraiment pas ce qui pourrais faire dysfonctionner mon application alors qu'elle tourne très bien avec tout les autres driver.

    Les seuls différences sont le marshalling et l'utilisation d'un Service Provider.

    (C++) HAPP hApp   ==>   (C#) uint hApp. Il faut aussi IntPtr car c'est un handle. Mais je ne pense pas que ce soit le problème.

    Il ce peut que le matériel soit mono-instance. Comme l'application générique l'utilise, votre appel d'instance ce bloque. Comme font certain programme de gestion WiFi sous windows, d'où la désactivation du service sans fil dans Windows.

    En arrêtant l'application générique que ce passe-t-il ?


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    mardi 18 septembre 2012 17:18
  • Bonjour, désolé encore pour le temps de réponse je ne peux faire des tests qu'en début de semaine:

    Alors en désactivant l'application générique j'avais toujours le problème, mais je n'ai plus l'erreur à partir du moment ou je n'instancie pas une autre classe qui gère un système de traduction.

    Cependant cette classe n'est pas utilisée pendant mon test, le simple fait de l'instancier pose problème:

    m_LanguageManager = new cTS_LanguageManager();
    try
    {
                        m_LanguageManager.Init(Assembly.GetExecutingAssembly().GetName().Name, strLanguage);
    }
    catch
    {
                        m_LanguageManager.Init(Assembly.GetExecutingAssembly().GetName().Name, "ENG");
    }

    Avant c'était mon système de Trace et maintenant mon système de Langage, je vois pas de solution.

    lundi 24 septembre 2012 10:33
  • Bonjour, désolé encore pour le temps de réponse je ne peux faire des tests qu'en début de semaine:

    Alors en désactivant l'application générique j'avais toujours le problème, mais je n'ai plus l'erreur à partir du moment ou je n'instancie pas une autre classe qui gère un système de traduction.

    Cependant cette classe n'est pas utilisée pendant mon test, le simple fait de l'instancier pose problème:

    m_LanguageManager = new cTS_LanguageManager();
    try
    {
                        m_LanguageManager.Init(Assembly.GetExecutingAssembly().GetName().Name, strLanguage);
    }
    catch
    {
                        m_LanguageManager.Init(Assembly.GetExecutingAssembly().GetName().Name, "ENG");
    }

    Avant c'était mon système de Trace et maintenant mon système de Langage, je vois pas de solution.

    Bonjour,

    Vous avez quoi comme erreur ?

    Que fait cette classe ? Fournir un maximum d'info si possible Merci ;)

     


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !


    • Modifié Lyamine lundi 24 septembre 2012 11:10
    lundi 24 septembre 2012 11:08
  • Cette initialisation se passe bien, l'erreur survient plus loin au moment ou j'essaye de récupérer le statut de mon module XFS, je tombe alors sur une Internal_Error autrement dit un problème qui n'a pas été géré par le Service Provider.

    Cette classe permet de sélectionner entre deux document XML, des traductions selon la langue choisit à l'initialisation, donc à part de l'adressage de fichier XML la classe ne fait rien d'autre.

    En empêchant cette initialisation, ma commande passe mais j'ai tout de même d'autre module qui ne sont plus actif, comme écrasé, mais qui ne sont pas en rapport avec de l'adressage XML.

    lundi 24 septembre 2012 14:35
  • Cette initialisation se passe bien, l'erreur survient plus loin au moment ou j'essaye de récupérer le statut de mon module XFS, je tombe alors sur une Internal_Error autrement dit un problème qui n'a pas été géré par le Service Provider.

    Cette classe permet de sélectionner entre deux document XML, des traductions selon la langue choisit à l'initialisation, donc à part de l'adressage de fichier XML la classe ne fait rien d'autre.

    En empêchant cette initialisation, ma commande passe mais j'ai tout de même d'autre module qui ne sont plus actif, comme écrasé, mais qui ne sont pas en rapport avec de l'adressage XML.


    Est-ce au même endroit cité dans votre 1er poste ?

    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    lundi 24 septembre 2012 15:39
  • Oui j'appel effectivement la méthode Get_Info directement après l'initialisation de mon système, comme pour mon 1er poste.

    lundi 24 septembre 2012 15:49
  • Est-il possible d'avoir le projet et le tester ? Si il faut une application tierce etc, est-ce possible de l'avoir ? ou documentation complète...

    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    lundi 24 septembre 2012 16:02
  • Malheureusement je ne peux pas vous envoyer le projet pour le tester, sauf si vous achetez la partie Hardware, sinon vous ne constaterez pas l'erreur remonté par la machine.

    La documentation par contre je peux :

    http://www.cen.eu/cen/Sectors/Sectors/ISSS/Activity/Pages/xfs_cwas.aspx

    sur cette page il y a le SDK (3.20) que j'utilise pour initialiser mon système XFS.

    Cordialement


    lundi 24 septembre 2012 16:22
  • Malheureusement je ne peux pas vous envoyer le projet pour le tester, sauf si vous achetez la partie Hardware, sinon vous ne constaterez pas l'erreur remonté par la machine.

    La documentation par contre je peux :

    http://www.cen.eu/cen/Sectors/Sectors/ISSS/Activity/Pages/xfs_cwas.aspx

    sur cette page il y a le SDK (3.20) que j'utilise pour initialiser mon système XFS.

    Cordialement


    Ce soir en rentrant je regarderais. Sinon faites un try catch puis utiliser getlasterror API pour avoir la cause du problème (dans le catch).

    Voir ICI


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    lundi 24 septembre 2012 16:34
  • J'avais pensé au GetLastError, mais je n'ai pas d'exception levé mon Erreur -15 est le retour de ma fonction donc aucun exception.

    Et les objets qui ne sont plus présent ne génèrent aucun erreurs.

    mardi 25 septembre 2012 07:17
  • Re-bonjour, 

    Alors il semblerait que le problème soit résolut cependant je ne le validerais qu'après une série de tests.

    Mon soucis se situait lors de l'initialisation, notamment la fonction WFS_Open qui ouvre la connexion entre l'application et le Service Provider.

    Parmi les paramètre de cette fonction il y a un nom logique qui permet de paramétrer le Service Provider, et ce nom logique n'était pas adapté à mon matériel.

    Du coup quand j'appelais la fonction Get_Info le retour n'étais pas pour les types de structure que j'utilisait, et donc cela entraînait des problème au niveau de la mémoire.

    Je reviens confirmer cela la semaine prochaine.

    Mais en tout cas merci a tous ceux qui m'ont aidé.

    Cordialement

    mardi 25 septembre 2012 12:12
  • Re-bonjour, 

    Alors il semblerait que le problème soit résolut cependant je ne le validerais qu'après une série de tests.

    Mon soucis se situait lors de l'initialisation, notamment la fonction WFS_Open qui ouvre la connexion entre l'application et le Service Provider.

    Parmi les paramètre de cette fonction il y a un nom logique qui permet de paramétrer le Service Provider, et ce nom logique n'était pas adapté à mon matériel.

    Du coup quand j'appelais la fonction Get_Info le retour n'étais pas pour les types de structure que j'utilisait, et donc cela entraînait des problème au niveau de la mémoire.

    Je reviens confirmer cela la semaine prochaine.

    Mais en tout cas merci a tous ceux qui m'ont aidé.

    Cordialement

    Bonjour,

    Ok on attend vos retour ;)


    Merci de valider par "Proposer comme réponse" si celle-ci répond a votre demande !

    mardi 25 septembre 2012 12:25
  • Bonjour tout le monde.

    Le problème est bel et bien résolut.

    Cependant j'ai une autre difficulté sur du Marshall de fenêtre d'évènement, je voulais savoir si il faut mieux que j'ouvre une autre post?

    Cordialement

    mardi 2 octobre 2012 07:46
  • Bonjour,

    Si vous souhaitez interagir avec des événements (plutôt méthode .net), je sais comment faire.

    Est-ce que vous souhaitez appeler un événement .NET depuis votre API (driver) ?

    Si vous avez une fonction de l'API qui demande un Handle de fonction, je peux vous aider.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    mardi 2 octobre 2012 08:12
  • Re-bonjour,

    Voila c'est exactement sa, j'ai une fonction définie en C++ :

    HRESULT WFSRegister( hService, dwEventClass, hWndReg )
    
    Enables event monitoring for the specified service by the specified window; all messages of the specified
    class(es) are sent to the window specified in the hWndReg parameter.
    
    Parameters HSERVICE hService
    Handle to the service provider.
    
    DWORD dwEventClass
    The class(es) of events
    
    HWND hWndReg
    The window handle which is to be registered to receive the specified messages.
    
    Comments Issuing a WFSRegister for a service enables event monitoring on that service. WFSRegister
    calls can be cumulative for the same window.

    J'ai donc fait un marshall : 

    public static extern int WFSRegister(IntPtr hService, 
                                                        uint dwEventClass,
                                                        IntPtr hWndReg);

    Je me doute que le hWnd n'est pas bien gérer mais je ne vois vraiment pas par ou aller pour récupérer ces évènements.

    En vous remerciant par avance

    Cordialement


    mardi 2 octobre 2012 12:21
  • Re-bonjour,

    Voila c'est exactement sa, j'ai une fonction définie en C++ :

    HRESULT WFSRegister( hService, dwEventClass, hWndReg )
    
    Enables event monitoring for the specified service by the specified window; all messages of the specified
    class(es) are sent to the window specified in the hWndReg parameter.
    
    Parameters HSERVICE hService
    Handle to the service provider.
    
    DWORD dwEventClass
    The class(es) of events
    
    HWND hWndReg
    The window handle which is to be registered to receive the specified messages.
    
    Comments Issuing a WFSRegister for a service enables event monitoring on that service. WFSRegister
    calls can be cumulative for the same window.

    J'ai donc fait un marshall : 

    public static extern int WFSRegister(IntPtr hService, 
                                                        uint dwEventClass,
                                                        IntPtr hWndReg);

    Je me doute que le hWnd n'est pas bien gérer mais je ne vois vraiment pas par ou aller pour récupérer ces évènements.

    En vous remerciant par avance

    Cordialement


    OK bon alors il faut faire un delegate déjà d'une part, faire un événement identique à l'attente de votre hWnReg, le monté en mémoire et le passer à votre 3ème argument. Je vous informes que cette déclaration doit être local à la classe. ne pas la déclarer dans la fonction car le GC va le supprimer et lors du prochain appel par votre API, une exception apparaitra.

    Exemple :

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication2 { class Program { [UnmanagedFunctionPointer(CallingConvention.Cdecl, SetLastError = true)] static delegate void helloWorld(int param1); static private helloWorld helloWorldDelegate; static IntPtr helloWorldPtr; static void Main(string[] args) { helloWorldPtr = IntPtr.Zero; helloWorldDelegate = new helloWorld(HelloWorld); //nouvelle instance en indiquant la fonction ci-dessous //Montage en mémoire (unmanaged memory) de la fonction helloWorldPtr = Marshal.GetFunctionPointerForDelegate(helloWorldDelegate); //Call de votre fonction WFSRegister(param1, param2, helloWorldPtr); //NE PAS FAIRE DE FREE HGLOBAL CAR UTILISATION CONSTANTE }

    //Event appelé par votre API C++ private static void HelloWorld(int param1) { //Traitement de votre code :) } } }

    J'ai fait depuis un projet console, donc ne pas faire de "static" dans votre cas. Indiquez les bons paramètres, etc...

     

    Est-ce que ça répond à votre demande ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine mardi 2 octobre 2012 13:50
    mardi 2 octobre 2012 13:49
  • Bonjour,

    Désolé pour ma réponse tardive.

    Ce fonctionnement à l'air de marcher comme il faut.

    Encore merci.

    Cordialement

    lundi 8 octobre 2012 08:44
  • You're welcome !!!!

    merci de valider la proposition si tout est OK ;)

     

    cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine lundi 8 octobre 2012 17:58
    lundi 8 octobre 2012 14:14
  • Bonjour, désolé du retour un peu tardif.

    Euh je ne trouve pas le "Proposer comme réponse", pouvez vous me dire ou il se trouve?

    Cordialement

    lundi 22 octobre 2012 07:38
  • Bonjour,

    Il en va de même de mon coté, ça fait une semaine peut-être deux (me souvient plus) que je n'ai plus le bouton proposer comme réponse.

    Est-ce une MAJ ou un bug ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    lundi 22 octobre 2012 18:46
  • Bonjour, 

    Je revient vers vous, j'ai effectuer des tests qui aurait du me générer des évènements et le système précédemment mis en place ne marche pas en fait.

    Je suis désolé c'est une erreur de ma part, j'enregistrait une mauvaise classe d'évènement, du coup le système passait l'initialisation mais ne récupérait pas les évènements. Maintenant que j'ai remis les bonnes classes j'ai une erreur du type : 

    WFS_ERR_INVALID_HWNDREG
    The hWndReg parameter is not a valid window handle.

    J'ai ouvert une nouvelle question car le sujet est différent de celui d'origine.

    http://social.msdn.microsoft.com/Forums/fr-FR/visualcsharpfr/thread/0e0c241f-49dc-400f-898b-d6236d6d9267

    Encore désolé

    Cordialement

    lundi 29 octobre 2012 10:51