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

Windows Forms Discussion :

[C#] Problème avec [dllImport]


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    NL
    NL est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5
    Par défaut [C#] Problème avec [dllImport]
    Bonjour,

    Dans le cadre d'une application j'emploie une dll fournis pas SPSS pour créer et écrire dans un fichier .sav. La dll est écrite en c++ et distribuée avec le .h. J'importe les méthodes dont j'ai besoin (jusque là tous va bien)
    Voilà la liste des méthodes que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int spssOpenWrite (const char *filename, int *handle)
    int spssSetIdString (int handle, const char *id)
    int spssCloseWrite (int handle)
    Que j'importe en c# de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [DllImport("spssio32.dll")]
    private static extern int spssOpenWrite (string filename, ref IntPtr handle);
     
    [DllImport("spssio32.dll")]
    private static extern int spssCloseWrite (ref IntPtr handle) ;
     
    [DllImport("spssio32.dll")]
    private static extern int spssSetIdString (ref IntPtr handle, string id) ;
    Lorsque j'appelle la première méthode qui ouvre le fichier, celà fonctionne et me sélectionne le bon fichier pour que je puisse écrire dedans. Le problème est que le handle n'est pas modifié et quand j'appelle la 2ème méthode il ne trouve pas le début du fichier (qui devrait correspondre à l'adresse dans le handle.

    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
     
    IntPtr handle = IntPtr.Zero;
    int error = 0;
    string id = "idtest" ;
    error = spssOpenWrite("C:\\Temp\\test.sav", out handle) ;
    if(error == 0)
    	{
    	error = spssSetIdString(out handle, id) ;
    	if(error == 0)
    		MessageBox.Show("Ecriture réuissi") ;
     
            else
                    MessageBox.Show("Ecriture pas faite") ;
     
    	error = spssCloseWrite(out handle) ;
    	}
    	else
    	MessageBox.Show("Problème lors de l'ouvertur du fichier") ;
    Est-ce que quelqun à déjà eu ce genre de prolbème?

    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    hum.. tu as essayé de jetter un oeil ici http://morpheus.developpez.com/DllDotnet/

    :

  3. #3
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Pas besoin de mettre un argument IntPtr en reference

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [DllImport("spssio32.dll")]
    private static extern int spssOpenWrite (string filename, IntPtr handle);
     
    [DllImport("spssio32.dll")]
    private static extern int spssCloseWrite (IntPtr handle) ;
     
    [DllImport("spssio32.dll")]
    private static extern int spssSetIdString (IntPtr handle, string id) ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [DllImport("spssio32.dll")]
    private static extern int spssOpenWrite (string filename, ref int handle);
     
    [DllImport("spssio32.dll")]
    private static extern int spssCloseWrite (ref int handle) ;
     
    [DllImport("spssio32.dll")]
    private static extern int spssSetIdString (ref int handle, string id) ;
    Dans le premier cas, lors des appels n'utilise pas le mot clé out

  4. #4
    NL
    NL est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5
    Par défaut
    J'ai implémenté la 2ème solution. La première sans le ref provoquait une erreur.

    hum.. tu as essayé de jetter un oeil ici http://morpheus.developpez.com/DllDotnet/
    Sympa le lien, je vais essayé de me débrouiller avec.

    Merci à vous 2.

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par NL
    J'ai implémenté la 2ème solution. La première sans le ref provoquait une erreur.
    mmhh ..
    Laquelle stp ? C'est pour ma culture. Merci

  6. #6
    NL
    NL est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5
    Par défaut
    Voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [DllImport("spssio32.dll")]
    		private static extern int spssOpenWrite (string filename, ref int handle);
     
    		[DllImport("spssio32.dll")]
    		private static extern int spssCloseWrite (int handle) ;
     
    		[DllImport("spssio32.dll")]
    		private static extern int spssSetVarName (int handle, string varName, int varLength) ;
     
    		[DllImport("spssio32.dll")]
    		private static extern int spssSetIdString (int handle, string id) ;
    Puis :

    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
    int handle = 1;
    int error = 0;
    int longueur = 12 ;
    string id = "idtest" ;
    error = spssOpenWrite("C:\\Temp\\test.sav", ref handle) ;
     
    if(error == 0)
    {
    	error = spssSetIdString(handle, id) ;
    	if(error == 0)
    		error = spssSetVarName(handle, "Test", longueur) ;
    		if(error == 0)
    	error = spssCloseWrite(handle) ;
    	}
    }
    ...
    Les 2 autres fonctions ne demandent pas un pointeur donc il n'y a pas besoin de passé par référance.

  7. #7
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Je parlais de la première .. mais c'est pas grave
    Laisse tomber.
    Merci

  8. #8
    NL
    NL est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5
    Par défaut
    Ah ok voilà l'erreur : "Object reference not set to an instance of an object"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec DllImport
    Par math007 dans le forum C#
    Réponses: 10
    Dernier message: 24/02/2011, 13h10
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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