Dll vc++ [Résolu]

Signaler
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009
-
Messages postés
1
Date d'inscription
lundi 2 octobre 2006
Statut
Membre
Dernière intervention
2 février 2009
-
Bonjour à tous

j'ai une dll en vc++,quand j'utilise l'une de ses fonctions en c# une exception se lance à la compilation à cause de la non comptabilité entre les types de variables en vc++ et c#.
Ma fonction retourne un tableau de double,je sais pas à qoi correspond un tableau de double en c#.
Si vous avez un idée, s'il vous plait m'aider.

Merci

bonne journée

11 réponses

Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

Pas de souci ^^
Pense a la regle 2 :p

Les trois lois de Codes-Sources :
1) Tu lis et respecte le reglement
2) Tu pense a valider si une reponse apportée a ton probleme t'a aidé
3) Si tu ne respecte pas les 2 premières .......................... TU SORS !!!!!!
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008

Pour avoir un tableau de Double tu peux passer par une List<Double> qui est une collection generique ( il faut donc ajouter using System.Collections.Generic; )

Les trois lois de Codes-Sources :
1) Tu lis et respecte le reglement
2) Tu pense a valider si une reponse apportée a ton probleme t'a aidé
3) Si tu ne respecte pas les 2 premières .......................... TU SORS !!!!!!
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009

Salut

merci beaucoup,ça marche.

Bonne journée
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009

A l'exécution j'ai ce genre d'exceptio:MarshalDirectiveException was unhandled
"Cannot marshal 'return value': Generic types cannot be marshaled."
ceci dans la ligne de commande quand j'appelle la fonction de ma dll vc++

Vous avez une idée sur ce genre d'exception?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, tu utilises l'attribut DllImport pour appeller une fonction de ta dll, c'est bien ça  ? Dans ce cas c'est impossible de marshaller le tableau dans une liste générique, le tableau renvoyé est un pointeur, il faut utiliser le type C# IntPtr puis utiliser Marshal.Copy ou le code unsafe pour récupéré les valeurs du tableau. Il faut aussi détruire le tableau une fois que tu as terminé.
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009

Bonjour

      Merci pour votre réponse, je demande si vous pouvez m'expliquer plus comment faire.
      J'ai le code suivant :

        [DllImport("CalDes.dll")]
        public static extern double* calculHist(string path);
       
          IntPtr ptr = calculHist(path);
          double* hist = (double*)ptr;

          Mais j'ai ce genre d'erreur: "Pointers and fixed size buffers may only be used in an unsafe context"
          C'est quoi le problème?

  Bonne journée
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009

Bonjour à tous

S'i vous plaît, je cherche encore une solution pour le problème mentionné juste au dessus de ce message.
Prière de m'aider.

Bonne journée

Mes remerciements
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
dsl j'avais pas vu ta question.

Pour utiliser les pointeurs il faut 2 choses :

- 1 ) définir un bloc unsafe

unsafe
{
   // ...
}

ou marquer la fonction avec le mot clé unsafe.

private unsafe void DoSomething( ) { .. }

2 ) Dans les paramètres du projet cocher la case "Autoriser le code unsafe" ou l'option -unsafe pour le compilo en ligne de commande.
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009

Bonjour

J'ai mis en place le code correspondant pour l'appel de dll, tout ça marche sauf en exécution j'ai cette exception:

DllNotFoundException was unhandled
Unable to load DLL 'SiftGPU.dll': Le module spécifié est introuvable. (Exception from HRESULT: 0x8007007E)

même si j'ai mis cette dll dans le dossier de mon projet, j'ai cette exception.

Prière de m'aider le plus vite que possible.

Merci infinement
Messages postés
19
Date d'inscription
jeudi 10 mai 2007
Statut
Membre
Dernière intervention
12 août 2009

Bonjour

J'ai le code suivant

[DllImport(@"C:\Documents and Settings\Espoir\Bureau\Essai\Offline\bin\Debug\SIFTGPU.dll", EntryPoint = "calculHist")
public static extern IntPtr calculHist(string path);
double[] hist = new double[64];
IntPtr ptr = calculHist(path);
Marshal.Copy(ptr, hist, 0, 64);

Quand j'execute j'ai l'exeception suivante

DllNotFoundException was unhandled
Unable to load DLL 'SiftGPU.dll': Le module spécifié est introuvable. (Exception from HRESULT: 0x8007007E)

Avez vous une idée sur ça

Prière de m'aider

Merci d'avance
Messages postés
1
Date d'inscription
lundi 2 octobre 2006
Statut
Membre
Dernière intervention
2 février 2009

tu dois placer ta DLL dans le répertoire release ou debug. en gros le répertoire ou est créer ton exécutable