Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1750 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  je reviens sur Platform Invoke / appel de DLL unmanaged

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

je reviens sur Platform Invoke / appel de DLL unmanaged

n°1094866
lohworm
Posté le 24-05-2005 à 13:34:10  profilanswer
 

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."

mood
Publicité
Posté le 24-05-2005 à 13:34:10  profilanswer
 

n°1094885
FlorentG
Posté le 24-05-2005 à 13:45:12  profilanswer
 

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

n°1094919
lohworm
Posté le 24-05-2005 à 14:01:55  profilanswer
 

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 !!!)

n°1094970
lohworm
Posté le 24-05-2005 à 14:24:02  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  je reviens sur Platform Invoke / appel de DLL unmanaged

 

Sujets relatifs
[ASP] Probleme pour un appel à une fonction asp sous htmlappel avec parametre de shockwave
Crée une DLLErreur Access DLL
[DLL] programme pour évaluer la taille des fonctions présentes ?PBM d'inportation d'un DLL C++ dans Visual DOTNET
DLL, OLE & fonctions exportéesDLL MFC en C++ un run time??
débutant PHP objet: Pb d'appel d'une fonctionAppel de détresse messieurs les codeurs ;[
Plus de sujets relatifs à : je reviens sur Platform Invoke / appel de DLL unmanaged


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR