Utiliser un tableau de double en retour d'une DLL pour VB6

les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006 - 11 juil. 2005 à 02:06
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006 - 18 juil. 2005 à 19:52
Bonjour, je vais essayer d'etre claire.

J'ai un programme en VB6 (qui marche normalement) qui a un tableau de double :

"Dim picture_array(0 To 310, 0 To 400) As Double"

Mon tableau doit etre utilise par une Dll en C++ par une fonction

"extern "C" _declspec(dllexport) double** CALLBACK RAThresh (double **InImg, int x, int y){ ... }"

Je l'ai bien declarer dans mon programme VB

"Public Declare Function RAThresh Lib "RAThresh.dll" (ByRef Infile() As Double, ByVal x As Integer, ByVal y As Integer) As Double"

mais j'ai toujours un message d'erreur a l'execution

"Can't assign to array"

...

J'espere avoir ete asser clair ... merci par avance de toutes reponses.

8 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
11 juil. 2005 à 10:08
Les x et y doivent être passés 'As Long' car 32 bits.
Pourquoi ta fonction C retourne 'double**', tu modifies la taille du tableau ? Retourner simplement un code d'erreur irait mieux.

ciao...
BruNews, MVP VC++
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
11 juil. 2005 à 23:57
Merci pour ta reponse BruNews,

je retourne un Double ** car je creer une autre image (malloc, ...) a partir de celle en parametre

j'ai toujours des problemes donc si tu vois une solution, je suis preneur.

merci par avance.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
12 juil. 2005 à 00:15
M'étonnerait que les tableaux de VB soient de simples pointeurs mémoire, ils savent dire leur ubound et autres bidules de ce genre.
Je crois que ce sont des SAFEARRAY, regarde MSDN.

ciao...
BruNews, MVP VC++
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
13 juil. 2005 à 17:13
merci je galere toujours, je vais (encore) essayer de passer ce tableau de double de VB en CPP puis un autre (creer dans la fonction) de CPP a VB

Merci pour ta reponse BruNews et si d'autres ont deja eu cette petite coquille, je suis preneur de pistes d'aide.

merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
14 juil. 2005 à 17:39
j'ai trouve (et enfin reussi) a passer mes tableau 2D de double de mon interface VB6 a ma DLL C++.

On passe le pointeur en "Long" (dans le declaration VB de la fonction DLL) et apres c du C++ normal :

*tableau; // pour la valeur
tableau++; // pour l'incrementation

en fesant gaffe de pas depasse les bords !!!! (mais c pas trop dur si on passe la taille en parametre ("Long" aussi meme si une fois en C++, on les traite en "Int") )

Bon, maintenant, je vais essayer de faire la meme chose a l'envers en passant par le "return" de la fonction C++ pour mon avoir mon nouveau tableau modifie ... si cela interesse quelqu'un une fois que j'aurai trouve je pourai toujours lui filler la source ...
mais la il me faut encore un peu de temps :)

Merci.
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
14 juil. 2005 à 22:26
Bon, bin, javais dit dans mon precedent post que j'essaye maintenant d'utiliser le return de ma fonction C++, bin, je bloque depuis qq heures maintenant...

si qqun a une piste, merci d'avance.
0
AurelBUD Messages postés 4 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 10 août 2005
18 juil. 2005 à 10:59
C est pas possible d utiliser le return de C++ vers VB.
Si tu as quelque chose à retourner il faut que tu le passes en paramètres à l'aide d'un pointeur.

Tu declares dans ton fichier Cpp et h :
STDMETHODIMP RAThresh (double **InImg, int x, int y, VARIANT *Return)
{
[... ce que ta fonction doit faire..];
*Return = [ce que tu veux retourner];
return S_OK;
}

Et dans ton fichier IDL :
[id(N°), helpstring("method RAThresh")] HRESULT RAThresh ([in] double **InImg, [in] int x, [in] int y, [out,retval] VARIANT *Return);
0
les french texans Messages postés 21 Date d'inscription mardi 14 juin 2005 Statut Membre Dernière intervention 23 octobre 2006
18 juil. 2005 à 19:52
En faite mainteant j'y arrive, ma fonction C++ a pour en-tete dans le point cpp :

extern "C" _declspec(dllexport) double * CALLBACK name_of_function (double * InImg, int x, int y) {
...
}

et comme declaration pour VB :
Public Declare Function RAThresh Lib "name_of_dll.dll" (ByVal my_array As Long, ByVal x As Long, ByVal y As Long) As Long

Cela me retourne l'adresse memoire du debut du tableau, que maintenant je peux utiliser dans mon programme VB (VarPtr, CopyMemory, ....)

Je sais pas si ma methode est efficace (vitesse, fiabilite, ...) mais pour l'instant cela tourne (quelques bugs a voir mais rien de mechant)

Je te remerci par contre pour tes indication qui me serviron par contre peut-etre plus tard.
0
Rejoignez-nous