2010-04-12 6 views
1

Comment puis-je obtenir la valeur de la DLL suivante? offreg.dll.ERROR_MORE_DATA --- PVOID et C# --- types non gérés

Dans mon code ci-dessous, j'ai ouvert avec succès la ruche, la clé et maintenant j'essaye d'obtenir la valeur de la clé et je continue à courir dans l'erreur ERROR_MORE_DATA (234).

Voici le C++ .dll:

DWORD 
ORAPI 
ORGetValue (
    __in ORHKEY  Handle, 
    __in_opt PCWSTR lpSubKey, 
    __in_opt PCWSTR lpValue, 
    __out_opt PDWORD pdwType, 
    __out_bcount_opt(*pcbData) PVOID pvData, 
    __inout_opt PDWORD pcbData 
    ); 

Voici mon code C#:

 [DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORGetValue", SetLastError = true, CallingConvention = CallingConvention.StdCall)] 
     public static extern uint ORGetValue(IntPtr Handle, string lpSubKey, string lpValue, out uint pdwType, out StringBuilder pvData, out uint pcbData); 

      IntPtr myHive;    
      IntPtr myKey; 
      StringBuilder myValue = new StringBuilder("", 256); 
      uint pdwtype; 
      uint pcbdata; 

uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, out myValue, out pcbdata); 

Donc, la question semble être autour PVOID pvData Je ne peux pas semblent avoir le bon type, ou la bonne taille de tampon. Toujours avec l'erreur 234. REMARQUE: Lors de l'exécution de cette commande pcbdata = 28 ... donc 256 devrait être plus que suffisant.

Toute aide serait grandement appréciée.

Comme indiqué ci-dessus, je l'ai essayé constructeur string ... string ... IntPtr etc ... Aucun qui ont pu gérer la pvData de ...

Merci.

Répondre

1

Vous devez initialiser pcbData à la taille de votre tampon avant de le transmettre. Rappelez-vous que C ne connaît pas la taille d'un tampon que vous lui transmettez, la valeur pcbData indique à la fonction quelle est la taille de pvData. Dans votre cas, vous passez à zéro, en disant OrGetValue que vous pvData est un tampon de 0 octet, donc il répond en vous disant qu'il a besoin d'un tampon plus grand.

Ainsi, dans votre pcbData de definiation PInvoke devrait être ref param et une valeur non nulle allant dans:

[DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORGetValue", SetLastError = true, CallingConvention = CallingConvention.StdCall)] 
public static extern uint ORGetValue(IntPtr Handle, string lpSubKey, string lpValue, out uint pdwType, out StringBuilder pvData, ref uint pcbData); 

IntPtr myHive;    
IntPtr myKey; 
StringBuilder myValue = new StringBuilder("", 256); 
uint pdwtype; 
uint pcbdata = myValue.Capacity(); 

uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, out myValue, ref pcbdata); 
+1

Et c'est une question de 10 mois sur la première page parce que quelqu'un a décidé de modifier 14 il y a quelques minutes. – shf301

Questions connexes