2010-10-24 10 views
4

Voici le problème - J'ai une bibliothèque de traitement d'image C que j'ai besoin d'utiliser à partir de l'application C#. Le manque d'expérience avec DllImport me semble dur pour le moment.C# Marshalling char ** et unsigned char **

La fonction que je dois utiliser ressemble à:


    IMAGEPROCESS_API const int importImage 
     (
     const unsigned char* image, 
     const char* xmlInput, 
     unsigned char** resultImage, 
     char** xmlOutput 
     ); 

Ainsi, il accepte les données d'images brutes, contenant les paramètres xml et l'image width'height puis revenir image traitée et certains rapports xml.

Pour l'instant im essayant d'aborder comme ceci:

 
[DllImport("imageprocess.dll",CallingConvention = CallingConvention.StdCall,EntryPoint = "importImage",CharSet=CharSet.Ansi)] 
     private static extern int ImportImageNative(IntPtr imageData, String xmlDescriptor, out IntPtr processedImage, out IntPtr xmlOut); 

mais sans aucun succès.

Des suggestions comment devrait-il être fait?

Edit: toujours pas de chance (( fait par désordre C++ CLI pour l'instant

+0

Pouvez-vous fournir plus de détails sur « sans succès »? – Dialecticus

+0

Oh, il compile et s'exécute mais rencontre une violation d'accès, donc quelque chose ne va vraiment pas. J'ai vérifié double entrée xml, donc je crois que le problème est avec la sortie – ALOR

Répondre

3

Pour les paramètres de sortie, vous devez accéder aux données renvoyées en utilisant Marshal.PtrToStringAnsi

Depuis la mémoire originale a été allouée à l'intérieur. l'API non managée, il est toujours de votre responsabilité de le libérer le cas échéant

Je pense aussi que vous devez utiliser String sur les deux premiers paramètres, je ne sais pas pourquoi le premier est IntPtr?

+0

Parce que je reçois un IntPtr immédiatement par System.Drawing.Bitmap.GetHBitamp(); – ALOR

+0

@ALOR - Je vois, ce n'est pas un C-string alors et vous avez raison. C'est 'Bitmap' pas' Bitamp' je pense? –

+0

Yeap, sry pour faute d'orthographe – ALOR

0

Essayez cette

[DllImport("imageprocess.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int importImage(string imageData, string xmlDescriptor, out string processedImage, out string xmlOut); 
+0

Ok, mais comment puis-je 'cast' octet [] à la chaîne et vice versa? – ALOR

+0

OK signifie que cela a fonctionné (comme dans - pas écrasé)? De quel octet parlez-vous? La signature que vous avez publiée n'a que des tableaux de caractères/pointeurs –