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);
}
}
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
Lève une exception.Cependant, cela fonctionne:
ImageBufferDef bufferDef = (ImageBufferDef) Marshal.PtrToStructure(ptr, typeof(ImageBufferDef));
Comment puis-je maintenant obtenir l'IntPtr pusBuffer imbriqué? – JasonComment mettez-vous en surbrillance le code dans Commentaires? – Jason