J'essaie de récupérer des données d'image TIFF via COM à l'aide d'un StringBuilder mais le tampon n'a qu'une longueur de 3 après l'appel COM. Je convertis une version de VB.NET en C# qui utilise une chaîne au lieu de StringBuilder et fonctionne très bien. Si quelqu'un a des suggestions ou peut me diriger vers un bon matériel de lecture, je l'apprécierais.C# Com Récupération de l'image binaire (Tiff) Données du périphérique
COM signature Fonction:
ULONG MTMICRGetImage (char *pcDevName, char *pcImageID, char *pcBuffer, DWORD *pdwLength
);
[DllImport("mtxmlmcr", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern Int32 MTMICRGetImage(string DeviceName, string ImageId, StringBuilder ImageBuffer, ref Int32 ImageSize);
COM Code d'appel:
ImageSize = Convert.ToInt32(mtValue.ToString());
TempImage = new StringBuilder(ImageSize);
mtValueSize = 9216;
RC = MTMICRGetIndexValue(mtDocInfo, "ImageInfo", "ImageURL", 2, mtValue, ref mtValueSize);
// Allocate memory for image with size of ImageSize
RC = MTMICRGetImage(ExcellaDeviceName, mtValue.ToString(), TempImage, ref ImageSize);
EDIT: Je crois que cela est dû aux données binaires et comment il est Marshalled, le caractère 4 dans la chaîne est un caractère nul. Selon Marshal.PtrToStringAuto()/Marshal.PtrToStringUni(), tous les caractères jusqu'au premier caractère nul sont copiés.
Comme dans, la valeur de ImageSize est passée dans MTMICRGetImage en tant que dernier paramètre. – Justin
Oui, la taille de l'image est correcte. J'ai changé la version de vb.net pour utiliser un StringBuilder et j'ai eu le même problème que le code C#. Les 3 caractères sont le début de l'en-tête du fichier tiff 'll *' (en Ascii, * = décimal pour 42). Je revérifierai la taille pour m'assurer cependant. –
La taille de l'image est bonne, par StringBuilder a une capacité maximale basée sur la taille de l'image, par exemple 10754 mais après l'appel COM, il a une longueur de 3 seulement. –