begin process at 2012 05 29 15:01:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Divers

 > 

General

 > 

Passage d'un tableau de strings d'une DLL C++ => VB


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Passage d'un tableau de strings d'une DLL C++ => VB

mercredi 7 avril 2010 à 12:09:01 | Passage d'un tableau de strings d'une DLL C++ => VB

speron

Bonjour,

Après plusieurs tentatives depuis plusieurs jours, je me rabas sur ce forum ... car il semble qu'aucune réponse claire ne soit disponible sur internet ...

Je cherche à récupérer, d'un programme écrit VB ( sous visual 2005 ) un tableau de données alimenté par des chaines de caractères à partir d'une dll en C++ ...

J'arrive bien à communiquer et lancer mes méthodes dans la dll ... mais impossible de récupérer les données ..

Est-ce qu'il serait possible d'avoir un exemple simplissime, fonctionnant sous visual 2005 pour créer une méthode qui alimente et renvoie un tableau de chaines .. que je peux ensuite afficher dans mon programme VB ?

Pour info .. j'avais essayé cela :
MYDLL VARIANT _stdcall retVariantArray(void) {
COleSafeArray saRet;
DWORD numElements[] = {10, 10}; // 10x10

// Create the safe-array...
saRet.Create(VT_R8, 2, numElements);

// Initialize it with values...
long index[2];
for(index[0]=0; index[0]<10; index[0]++) {
for(index[1]=0; index[1]<10; index[1]++) {
double val = index[0] + index[1]*10;
saRet.PutElement(index, &val);
}
}

// Return the safe-array encapsulated in a VARIANT...
return saRet.Detach();
}

Mais en appelant cette méthode depuis le programme VB ( en spécifiant un retour de type OBJECT car le type VARIANT a disparu ! ), j'ai une exception comme quoi on ne peut récupérer un VARIANT ...

Voilà .. Quelqu'un aurait t'il la solution ?

D'avance ... Merciiii
samedi 10 avril 2010 à 18:29:55 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Autant VB6 était très orienté OLE/COM, autant c'est moins le cas pour VB2005...

Si le tableau en question est de taille fixée, pourquoi ne pas l'allouer dans la partie VB2005 ? Ou pourquoi ne pas passer par un vrai pointeur plutôt que par du COM ?
mardi 13 avril 2010 à 10:42:54 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

speron

Bonjour,

Merci beaucoup pour cette réponse ....

Justement je cherche le moyen de passer par un vrai pointeur (en déclarant coté vb et c++ une structure identique) mais jusqu'à présent je n'ai trouvé aucun exemple qui marche ...

En auriez vous un, simple, que je pourrais reproduire avec la partie vb et c++ ?

D'avance merci ...
mardi 13 avril 2010 à 13:51:44 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

speron

Mon problème est que je n'arrive pas à envoyer le pointeur de mon tableau ..
Avant VB5, il y avait la méthode VarPtr .. maintenant comment faire pour passer l'adresse mon tableau ?

mardi 13 avril 2010 à 14:08:53 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

rt15

Membre Club Administrateur CodeS-SourceS
Avant VB5 ? Avant VB7 en fait. VB6 est le dernier "vrai" VB.

Regarde par là. Dommage que ce soit pour du C# par contre.
mardi 13 avril 2010 à 14:59:50 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

speron

Merciiiiiii ... je suis désolé .. dans l'exemple que tu m'as donné ... il n'y a pas d'appel Visual Basic ..

De plus, le pointeur transmis est modifié dans la même méthode .. et quand la valeur finale est trouvée, on renvoie un int ..
Par contre si tu as un exemple avec une méthode qui renvoie un pointeur à un code VB, je suis preneur !
mardi 13 avril 2010 à 17:05:04 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

rt15

Membre Club Administrateur CodeS-SourceS
En fait, beaucoup d'exemple d'utilisation de PInvoke sont des utilisations de l'API Win32. Et cette API ne contient pratiquement pas de fonction renvoyant un pointeur. C'est en effet à éviter. En effet, l'appelant ne sait en général pas libérer ce qui est alloué par l'appeler (Sans même parler de plusieurs langages, faire free dans un .exe d'une zone allouée par malloc dans une dll, souvent, cela ne fonctionne pas).

Les seuls exemples qui me viennent à l'esprit, c'est FormatMessage (A libérer impérativement avec LocalFree) et GetCommandLine (Qui n'a pas besoin de libération).

Ce ne sont pas de très bon exemple car ce sont en fait des String qui sont utilisés. Mais on voit au moins des appels à des méthodes de Marshal (PtrToStringAnsi et PtrToStringAuto), documentées ici.

Il y a peut être des méthodes dans cette classe qui peuvent t'aider... Tu as par exemple Copy pour copier d'un tableau non managé vers un tableau managé.
mardi 13 avril 2010 à 18:36:51 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

speron

Oulala .. ca me parait compliqué tout cela ...

Ce que je ne comprend pas, c'est qu'on peut passer en argument ( avec Byref ) un tableau d'Integer à une méthode de la dll en c++ ..Cette méthode peut modifier les valeurs du tableau et on peut très bien réutiliser tout cela ...
void _stdcall FillArr(int *inArr) {
inArr[0] = 100;
inArr[1] = 200;
inArr[2] = 500;
}

Donc pourquoi est-ce si compliqué de faire la même chose pour une structure ?

Quand j'essaie, j'ai le message :Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

par exemple en faisant :
typedef struct {
long x;
BSTR chaine;
} data;
int _stdcall FillArr(data *inArr, int ArrSize) {
inArr[0].x = 100;
inArr[1].x = 200;
inArr[2].x = 500;
return 1;
}

Qu'est ce qui n'irait pas dans ce code ?

Merciiiii
mercredi 14 avril 2010 à 09:40:50 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

rt15

Membre Club Administrateur CodeS-SourceS
Et comment est ton code côté VB ?

Exemple de passage de structure, encore en C#.
mercredi 14 avril 2010 à 10:27:10 | Re : Passage d'un tableau de strings d'une DLL C++ => VB

speron

Donc la déclaration est la suivante au début :

Private Structure Data
Dim x As Long
Dim chaine As String
End Structure

Private Declare Function FillArr Lib "vb4.dll" Alias "?FillArr@@YGHPAUdata@@H@Z" (ByRef inArr() As Data) As Long


Dans la méthode qui est appelée sur un clic :

Dim tableau As data() = New data(3) {}
FillArr(tableau)

En fait, j'ai un plantage pur et simple maintenant, sans message ...

Merci ...

1 2 3

Cette discussion est classée dans : vb, dll, tableau, index, variant


Répondre à ce message

Sujets en rapport avec ce message

dll C++ dans vb, tableau 2D en paramètre [ par vba_blitz ] Bonjour,je souhaite faire passer un tableau 2D de double à partir de Vb pour appeler une dll c++. Je sais que pour les tableaux à une dimension il suf Mettre le contenu d'images de différents formats (Tiff, bmp, jpg...) dans un tableau [ par benobil ] Bonjour,Je dois réaliser une application VB qui fait un peu de traitement d'images. Comme ce langage ne s'y prête pas trop, j'ai fait une dll en C (ut Pointeur d'un tableau à 2 dimensions vers DLL C++ [ par Feanor06 ] Bonjour, Voilà, j'ai un exe principal en VB.net (VS2008 Express) et une DLL en C++ (Dev-C++). Je dois passer en paramètre à une fonction de la DLL u Passer un tableau de string de VB vers une DLL C++ [ par paco ] Salut, mon problème est le suivant : je désire travailler avec des tableaux de string dans une de mes DLL C++. Ces tableaux, dynamiques, doivent venir Problem d'utilisation d'une function d'une dll vb en vb.net [ par durka79 ] Bonjour à tous,Dans notre société, nous avons commencé de travailler en vb.net, il n'y a pas longtemps. Nous avons dans la suituation de reutiliser l passer un tableau de Bytes en paramètre d'une fonction dll [ par Taoufik77 ] Bonjour,j'ai une fonction dll (C++) qui prend en parametre un tableau de Bytes (CByteArray). Pour pouvoir l'appeler à partir d'une appli VB, j'ai défi dll C++ dans vb, tableau en paramètre [ par Gueubaille ] Bonjour, je cherche à passer un tableau d'entiers (de caractère j'ai renoncé...) à partir de VB pour appeler une dll faite en C++, et je voudrai savoi Appel DLL sous VB 2008 Express : DevC++ OK / Code Block NOK [ par Feanor06 ] Bonjour, J'apppelle une fonction d'une DLL C++ écrite avec Dev-C++ sous Visual Basic 2008 (vb.net). J'utilise une déclaration du type : extern "C" _ VB 2008 et dll system.core [ par l0r3nz1 ] Salut à tous! j'ai développé un joli ptit prog sous windows 7 pro avec vb2008 visual studio. le probleme c'est que son exécution plante 1 ordi sur de VB.Net Remplir un Tableau à partir d'une requête SQL d'un fichier Access [ par JeffC1977 ] Bonjour Je cherche et je ne trouve pas... un moyen pour remplir un tableau à partir d'un ficher access (requête SQL). J'ai le code pour faire affich


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,761 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales