2010-01-22 6 views
0

J'utilise Visual Studio 2008/.NET 3.5. J'ai utilisé VS pour rendre un composant COM interopérable dans .NET. J'ai ajouté une référence de l'application à la DLL COM. La DLL COM est un objet tiers - partie d'un SDK.Pointeur COM sur struct

Pour toutes les méthodes et tout événements fonctionne très bien - objets COM/événements sont représentés en tant que premiers objets .NET de classe/événements.

Voici ce qui se passe:

La méthode d'analyse() fonctionne. À la fin de son exécution, il déclenche un événement.

void scanner_ImageBuffer(int lStructure) 
{ 
} 

L'argument - lStructure - en fonction de la documentation est:

ImageBuffer(int lStructure) 

Description: L'événement ImageBuffer en informe l'application cliente de l'achèvement d'un balayage et de transmettre une structure contenant la largeur, taille, taille et image tampon de l'image qui a été recueillie dans le cadre de l'analyse. Il est de la responsabilité de l'application cliente pour libérer la mémoire qui a été allouée à la mémoire tampon d'image et pour libérer la mémoire pour la structure. Cet événement peut ne pas être compatible avec les applications Visual Basic . Paramètres:

L'int lStructure est un pointeur 32 bits à la structure suivante

struct _ImageBufferDef 
{ 
    int lWidth; // size of the image width in pixels 
    int lHeight; // size of the image height in pixels 
    int lSize; // size of the image in bytes 
    unsigned short* pusBuffer; // allocated memory containing image 
} 

est ici où je suis coincé: Comment puis-je reconstruire l'objet avec seulement int?


J'ai essayé:

[StructLayout(LayoutKind.Sequential)] 
struct ImageBufferDef 
{ 
    int lWidth; 
    int lHeight; 
    int lSize; 
    IntPtr pusBuffer; 
} 

void scanner_ImageBuffer(int lStructure) 
{ 
    IntPtr ptr = new IntPtr(lStructure); 

    ImageBufferDef buf = new ImageBufferDef(); 

    try 
    { 
     Marshal.PtrToStructure(ptr, buf); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 
+0

Que se passe-t-il exactement lorsque vous appelez 'Marhsal.PtrToStructure()'? Est-ce qu'il lance une exception ou le ImageBufferDef retourné est-il rempli de déchets? – cmw

+0

Lève une exception.Cependant, cela fonctionne: ImageBufferDef bufferDef = (ImageBufferDef) Marshal.PtrToStructure(ptr, typeof(ImageBufferDef)); Comment puis-je maintenant obtenir l'IntPtr pusBuffer imbriqué? – Jason

+0

Comment mettez-vous en surbrillance le code dans Commentaires? – Jason

Répondre

0

En raison de

int lSize; // size of the image in bytes 
unsigned short* pusBuffer; // allocated memory containing image 

Après

ImageBufferDef bufferDef = (ImageBufferDef)Marshal.PtrToStructure(ptr, typeof(ImageBufferDef)); 

vous pouvez essayer

short[] buffer = new short[bufferDef.lSize/2]; 
Marshal.Copy(bufferDef.pusBuffer, buffer, 0, buffer.Length); 

Si vous allez changer le type de tableau buffer, attention au sujet de sa longueur et le paramètre Marshal.Copylength, parce que la première doivent tenir compte de la taille de l'élément de tableau qui est l'être un short[] , et le second veut le nombre d'éléments du tableau au lieu du nombre total d'octets.

Questions connexes