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

Signaler
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006
-
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

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.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

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.
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

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.
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

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.
Messages postés
4
Date d'inscription
mercredi 16 avril 2003
Statut
Membre
Dernière intervention
10 août 2005

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);
Messages postés
21
Date d'inscription
mardi 14 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2006

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.