2010-11-01 6 views
2

Je dois utiliser une DLL VC++ non managée.Fonction dll non managée byte * paramètre return in C#

Il a les deux fonctions suivantes qui nécessitent C# emballages:

bool ReadData(byte* byteData, byte dataSize); 
bool WriteData(byte* byteData, byte dataSize); 

Ils ont tous deux retourner vrai si elles réussissent, mais sinon false.

Actuellement en C# J'ai une classe (WRAP) avec des fonctions:

[DllImport("kirf.dll", EntryPoint = "ReadData", SetLastError=true)] 
[return: MarshalAs(UnmanagedType.VariantBool)] 
public static extern Boolean ReadData([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]out Byte[] bytesData, Byte dataSize); 

[DllImport("kirf.dll", EntryPoint = "WriteRFCard", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.VariantBool)] 
public static extern Boolean WriteRFCard[In]Byte[] bytesData, [In]Byte dataSize); 

Je puis ai

byte[] newData = new byte[17]; 
byte dataSize = 17; 
bool result = WRAP.ReadData(out newData, dataSize); 

Cela me donne toujours un résultat = false, newData = null, et aucune erreur jeté (ou plutôt il revient toujours avec succès).

Et

byte[] bytesData = new Byte[] { (byte)0x9B, (byte)0x80, (byte)0x12, (byte)0x38, (byte)0x5E, (byte)0x0A, (byte)0x74, (byte)0x6E, (byte)0xE6, (byte)0xC0, (byte)0x68, (byte)0xCB, (byte)0xD3, (byte)0xE6, (byte)0xAB, (byte)0x9C, (byte)0x00 }; 
byte dataSize = 17; 
bool actual = WRAP.WriteData(bytesData, dataSize); 

Toutes les idées sur ce que je pourrais faire mal?

modifier

Voilà comment je finalement réussi il:

 [DllImport("kirf.dll", EntryPoint = "ReadData", SetLastError=true)] 
     [return: MarshalAs(UnmanagedType.VariantBool)] 
     public static extern Boolean ReadData([Out] Byte[] bytesData, Byte dataSize); 

[DllImport("kirf.dll", EntryPoint = "WriteData", SetLastError = true)] 
     [return: MarshalAs(UnmanagedType.VariantBool)] 
     public static extern Boolean WriteData([In] Byte[] bytesData, Byte dataSize); 

Et:

Byte[] newData=new byte[17]; 
bool result = KABA_KIRF.ReadData(newData, (Byte)newData.Length); 

et

bool result = KABA_KIRF.WriteData(data, datasize); 

où les données étaient un paramètre Byte[] transmis à la fonction.

+0

Avez-vous confirmé que les fonctions fonctionnent en code non managé? Un simple harnachement peut-être? –

Répondre

1

Est-ce que ReadData crée un nouveau tableau d'octets? Sinon, je ne pense pas que bytesData devrait être un out param.

Regardez the PInvoke spec of ReadFile pour la comparaison:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, 
    uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped); 

lpNumberOfBytesRead est un des param, parce que ReadFile modifie la valeur de celui-ci. c'est-à-dire que si vous transmettez une variable locale pour lpNumberOfBytesRead, ReadFile changera la valeur sur la pile. La valeur de lpBuffer d'autre part est pas changé: Il pointe toujours vers le même tableau d'octets après l'appel. Les [In,Out] -Attributs indiquent à PInvoke que faire avec le contenu du tableau que vous transmettez.

Questions connexes