2010-02-06 3 views
0

J'ai besoin d'aide pour le marshaling personnalisé ... j'ai une DLL native ... les paramètres de certaines fonctions DLL sont définis avec char non signé *besoin d'aide marshaling personnalisé ..?

par exemple;

typedef short apiStatus; 
    apiStatus __declspec(dllexport) __stdcall DrfGetFirmwareVersion (HANDLE hCom, unsigned char *major,unsigned char *minor, unsigned char ReaderAddr = 0xff); 

la documentation que j'ai décrivant les arguments de la fonction comme suit;

Paramètre d'entrée:

  • Hcom-série Port poignée
  • version majeure-principale Nombre de programme du firmware
  • -subversion mineur Nombre de programme de firmware
  • adresse lecteur ReaderAddr-, pour application fixe RS485 pour lecteur fixe, valeur par défaut "0XFF" (ne s'applique pas aux ordinateurs de poche et aux modules)

comment puis-je déclarer cette fonction en C# .. ??

Toute aide à tout serait vraiment apprécié

Répondre

1

Si cette DLL est vraiment, vraiment vieux (en arrière quand ombles était encore non signé), alors il pourrait être des chaînes de retour. C'est assez peu probable cependant, il suffit de les déclarer comme sur octet:

[DllImport("blah.dll")] 
private static extern noidea DrfGetFirmwareVersion(IntPtr handle, 
    out byte major, out byte minor, byte address); 

Où « NoIdea » est sans doute nulle ou une sorte de code d'erreur int. Une autre chose à s'inquiéter est la propriété DllImport.CallingConvention, il pourrait être Cdecl. Utilisez-le lorsque vous obtenez un avertissement MDA sur un déséquilibre de pile. Et n'oubliez pas de définir la cible de plate-forme de votre projet sur x86 ou de bombarder les systèmes d'exploitation 64 bits.

+0

merci pour les commentaires .. j'ai mis la plate-forme cible à x86 comme vous l'avez dit..un autre problème est la documentation explique un peu les choses pour les fonctions..parfois je ne pouvais pas déterminer ce que je devrais faire ... le SDK de l'appareil contient un fichier lib .. J'ai ouvert la lib avec un editör et j'ai rencontré des noms décorés. Je n'ai pas décoré ces noms décorés avec undname.exe..les résultats comme suit; undname? DrfGetFirmwareVersion @@ YGFPAXPAE1E @ Z ---- >>>> short __stdcall DrfGetFirmwareVersion (void *, char non signé *, char non signé *, char signé) –

+0

PS "*" n'est pas le premier paramètre de la fonction. .il pourrait être comme suit; void * –

+0

Vous devez utiliser la propriété DllImport.ExactSpelling dans votre déclaration. –

0

J'ai utilisé overloed pour le paramètre par défaut (VS2005) .i j'ai importé la fonction comme suit;

public class sDrfGetFirmwareVersion 
     { 
      //apiStatus __declspec(dllexport) __stdcall DrfGetFirmwareVersion (HANDLE hCom, unsigned char *major,unsigned char *minor, unsigned char ReaderAddr = 0xff); 

      [DllImport("DrfApiV10.dll", CallingConvention = CallingConvention.StdCall,CharSet=CharSet.Ansi,EntryPoint="DrfGetFirmwareVersion", ExactSpelling=false)] 
      public static extern short DrfGetFirmwareVersion(IntPtr hCom, out byte major, out byte minor,byte ReaderAddr); 
      public static short DrfGetFirmwareVersion(IntPtr hCom, out byte major,out byte minor) 
       { 
        return DrfGetFirmwareVersion(hCom, out major,out minor, 0xff); 
       } 
     } 

pouvez-vous me vérifier s'il vous plaît ??

Questions connexes