[Résolu] modification d'une struct managée par un filtre directshow

modification d'une struct managée par un filtre directshow [Résolu] - C#/.NET managed - Programmation

Marsh Posté le 11-08-2006 à 15:07:27    

Je travaille actuelelment en C# sur un logiciel qui utlise directshow pour construire des graphes de  filtres et traiter des fichiers multimédias. Etant donné que je récupère un travail existant, je ne suis pas tout à fait libre des choix d'implémentation et je suis donc soumis à certaines contraintes. Des filtres directshow ont été développés, il s'agit donc d'objets COM. J'utilise la librairie open source DirectShowNet comme interface avec les objets COM. Une interface a été développée pour communiquer avec le filtre et récupérer quelques informations, j'ai donc complété directshownet avec les informations de cette interface en IDL pour pouvoir l'utiliser. Une de ces fonctions me pose problème. En effet, elle passe en paramètre une structure que l'objet COM doit initialiser correctement, pour que je puisse récupérer les informations qu'elle contient dans le code C#.

Code :
  1. public struct DLLRESULT
  2.     {
  3.         public string resultName;
  4.     public uint nThresholds;
  5.     public float[] thresholds;
  6.     public float currentValue;
  7.     public uint lastAckStart;
  8.     public uint lastAckEnd;
  9.     }
  10.         [PreserveSig]
  11.         int GetResultInfo(
  12.             [In] uint res,
  13.             [In] ref DLLRESULT _dllResult
  14.             );


Puisque la structure doit être crée avant d'être envoyée, j'ai indiqué ce paramètre comme étant In et placé en référence. Le problème est que, lorsque j'utilise cette fonction, le hr code rendu correspond à une erreur de type pointeur null, donc l'objet COM se retrouve avec un _dllResult null alors qu'il a bien été créé côté C#. Je me demande donc si l'objet COM a bien accès à la mémoire managée de mon programme C#, et si ce n'est pas le cas, comment pourais-je faire pour utiliser cette fonction ? Serait il possible de créer un objet non managé dans le code C# ?


Message édité par eld le 18-08-2006 à 14:14:53
Reply

Marsh Posté le 11-08-2006 à 15:07:27   

Reply

Marsh Posté le 11-08-2006 à 15:30:15    

Question bête (on sait jamais) : tu as bien fait un 'new' pour créer ta structure ?
Si oui, on peut voir le prototype de ta fonction et le code que tu utilises quand tu l'appelles ?
Oui, tu peux faire du code non-managé dans du code managé, mais c'est déconseillé. voir le mot-clef 'unsafe'.
 

Reply

Marsh Posté le 11-08-2006 à 15:58:48    

Code :
  1. DLLRESULT dllResStruct = new DLLRESULT();
  2.             try
  3.             {
  4.                 //loop to add all the results of the dll to the array, we know when we have all the results because we get an invalidarg exception
  5.                 while (i < OneDllResults.maxResNum)
  6.                 {System.Runtime.InteropServices.
  7.                     hr = filter.GetResultInfo(i, ref dllResStruct);
  8.                     DsError.ThrowExceptionForHR(hr);

Reply

Marsh Posté le 11-08-2006 à 16:00:06    

mpff le systeme runtime qui traine c'est rien, je remet le code :p
sinon, le prototype est indiqué dans l idl

Code :
  1. DLLRESULT dllResStruct = new DLLRESULT();
  2.             try
  3.             {
  4.                 //loop to add all the results of the dll to the array, we know when we have all the results because we get an invalidarg exception
  5.                 while (i < OneDllResults.maxResNum)
  6.                 {
  7.                     hr = filter.GetResultInfo(i, ref dllResStruct);
  8.                     DsError.ThrowExceptionForHR(hr);

Reply

Marsh Posté le 18-08-2006 à 13:59:42    

en fait le probleme venait de tout autre chose (nouveau topic)

Reply

Sujets relatifs:

Leave a Replay

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