Utiliser un tableau de double en retour d'une DLL pour VB6
les french texans
Messages postés21Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention23 octobre 2006
-
11 juil. 2005 à 02:06
les french texans
Messages postés21Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention23 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.
A voir également:
Utiliser un tableau de double en retour d'une DLL pour VB6
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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.
les french texans
Messages postés21Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention23 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 :)
les french texans
Messages postés21Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention23 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...
AurelBUD
Messages postés4Date d'inscriptionmercredi 16 avril 2003StatutMembreDernière intervention10 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);
les french texans
Messages postés21Date d'inscriptionmardi 14 juin 2005StatutMembreDernière intervention23 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.