je reviens sur Platform Invoke / appel de DLL unmanaged

je reviens sur Platform Invoke / appel de DLL unmanaged - C#/.NET managed - Programmation

Marsh Posté le 24-05-2005 à 13:34:10    

Je sais que le sujet a déjà pas mal été débattu,
J'ai quand même pas mal cherché (MSDN, google,...) pour trouver comment résoudre mon problème,  
 
MAIS je n'ai pas encore trouvé d'exemple où on passerait à la DLL une chaine de longueur variable et inconnue dans sa longueur max, comme on lui passerait un bête "ref String la_chaine", mais cette fois en [OUT] ou [IN/OUT] et pas en [IN] comme on peut le faire.
 
Je n'ai trouvé jusqu'ici que des exemples de passage d'une chaine de longieur fixe, ou de passage d'un pointeur sur un buffer (avec StringBuilder en fait), et ce, en passant aussi la taille du buffer...Ce qui suppose donc de savoir à l'avance la taille maximale de la chaine en retour.
 
Or, dans mon cas, la DLL peut me renvoyer 3 caractères comme x milliers, x étant totalement inconnu...
 
Pour fixer les idées, voici la déclaration de la fonction C++ et comment elle procède en interne pour remplir la chaine retour :
 
ESS_GetCubeItems(char**  ListItems)
{
...
 sprintf(*ListItems,"%s%s%s",*ListItems,tsResultat[iCount][0],csSepListeAlias);
...
}
 
Comment puis-je appeler en C# cette DLL sans savoir à l'avance la taille de la chaine renvoyée ?
Est-ce seulement possible ?
 
Cordialement,
Laurent
 
PS : bizarrement, avec un appel "ESS_GetCubeItems(ref ma_chaine)" où ma_chaine a été définie comme "string ma_chaine = string.Empty;"...
ça marche
MAIS à la longue (10 appels...), un appel à la DLL ne répond plus qu'avec  
"System.NullReferenceException : La référence d'objet n'est pas définie à une instance d'un objet."

Reply

Marsh Posté le 24-05-2005 à 13:34:10   

Reply

Marsh Posté le 24-05-2005 à 13:45:12    

Et en C#, t'as déclaré comment ta fonction ? Sachant qu'avec un char**, ça donnera (version VB.NET) un ByRef pouet As String

Reply

Marsh Posté le 24-05-2005 à 14:01:55    

une déclaration comme ça :
 
[ DllImport( "Lib_DotNet.dll" )]
public static extern int ESS_GetCubeItems(ref string ListUDA);
 
et un usage comme ceci :
 
string ListUDA = string.Empty;
int codeRet = ESS_GetCubeItems(ref  ListUDA);
 
 
(et ça passe !!!)

Reply

Marsh Posté le 24-05-2005 à 14:24:02    

En admettant que je voie assez large pour mon buffer...
Pour me rabattre sur la solution StringBuilder,
le fait que la chaine retour soit définie en char** et pas en char* ne va-t-il pas poser un problème ? faudra-il que je passe mon StringBuilder par ref ?
 
 :pt1cable:  :pt1cable:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed