2010-05-08 8 views
1

je fais un wrapper pour lire TDM et les fichiers TDMS mais j'ai un problèmeWrapper C# en utilisant dll non géré

 [DllImport(lib, CharSet = CharSet.Auto)] 
    static extern int DDC_OpenFileEx(
     [MarshalAs(UnmanagedType.LPStr)] 
         string filePath, 
     [MarshalAs(UnmanagedType.LPStr)] 
    string fileType, 
         int read_only, 
         ref long file); 

fonctionne très bien, mais

 [DllImport(lib, CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int DDC_GetNumChannelGroups(long file, 
         [MarshalAs(UnmanagedType.U4)] 
           ref int numChannelGroups); 


      int numGru = 0; 

      errCode = ReadTDM.DDC_GetNumChannelGroups(file,ref numGru); 
      System.Console.WriteLine("Error Code {0} GetNumChannelGroups", errCode); 

donne une erreur -6202, // Une argument non valide a été transmis à la bibliothèque. J'ai essayé ref uint, uint * (dangereux), UIntPtr. Le def du fichier .h

int __stdcall DDC_GetNumChannelGroups (DDCFileHandle file,unsigned int *numChannelGroups); 

le deuxième paramètre est le problème. il semble que unsigned int *! = Uint.

Est-ce que quelqu'un a une idée comment appeler cette fonction à partir de la DLL?

http://forums.ni.com/ni/board/message?board.id=60&thread.id=11821

+0

Vous n'avez pas besoin de spécifier 'MarshalAs' dans ces cas particuliers:' LPStr' est la valeur par défaut et 'U4' ne fait rien ici comme' int' et 'uint' sont de la même taille. –

+0

Suppression des attributs est une bonne idée, mais utilisez beaucoup CharSet.Ansi –

Répondre

2

Il est le 1er argument selon lequel est déclaré faux. Cela supprime le cadre de pile et empêche le code non géré de lire correctement le pointeur pour le 2ème argument. "long" est 64 bits, DDCFileHandle est presque certainement un pointeur, 32 bits sur un système d'exploitation 32 bits.

Modifiez la déclaration d'argument à IntPtr. Vous devrez également modifier la déclaration de la fonction qui renvoie ce handle.

+0

THX. J'avais un mauvais fichier .h. celui-ci est pour matlab typedef long \t \t \t DDCFileHandle; typedef long \t \t \t DDCChannelGroupHandle; typedef long \t \t \t DDCChannelHandle; j'ai changé les poignées à int et ça marche –

Questions connexes