2010-04-12 6 views
0

Je suis en train de créer un registre hors ligne dans la mémoire à l'aide du offreg.dll fournies dans les fenêtres DDK package 7.ERROR_MORE_DATA ---- lecture du Registre

Vous pouvez trouver plus d'informations sur le offreg.dll ici: MSDN

Actuellement, tout en essayant de lire une valeur d'une ruche registre ouverte/clé que je reçois l'erreur suivante: 234 ou

ERROR_MORE_DATA

Voici le code .h qui contient ORGetValue:

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 le code que j'utilise pour tirer les données

[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 string pvData, out uint pcbData); 

     IntPtr myHive;    
     IntPtr myKey; 
     string myValue; 
     uint pdwtype; 
     uint pcbdata;  

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

Le but est de pouvoir lire myValue sous forme de chaîne.

Je ne sais pas si je dois utiliser marshaling ... ou un deuxième appel avec un tampon ajusté .. Ou bien comment régler le tampon en C#. Toute aide ou pointeurs seraient grandement appréciés.

Merci.

Répondre

1

L'attribut sur l'argument pcbData est faux, il est arbitre, pas. Vous devez l'initialiser à la capacité du StringBuilder que vous transmettez pour l'argument pvData. À l'heure actuelle, la fonction API voit probablement un 0, donc retournera le code d'erreur.

Il devrait ressembler à ceci:

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

    int pdwtype; 
    var buffer = new StringBuilder(256); 
    int pcbdata = buffer.Capacity; 
    uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, buffer, ref pcbdata); 
    string myValue = buffer.ToString(); 
+0

Pas vraiment sûr de ce que cela ressemblerait dans le code, en utilisant mon exemple ci-dessus pourriez-vous par hasard me montrer une démo? Merci. – user314749

+0

Btw, le buffer.Append ("DefaultUserName"); n'est pas nécessaire. – user314749

0

Pour sur les paramètres de chaîne, vous devez utiliser StringBuilder pas la chaîne.

En règle générale, si le paramètre est un LPCTSTR (LPCSTR, LPCWSTR) puis d'utiliser la chaîne, si le paramètre est LPTSTR (LPSTR, LPWSTR) puis utiliser StringBuilder.

+0

si le paramètre est PVOID comme dans mon exemple ci-dessus? – user314749

+0

@ user314749: Je pense que vous aurez également besoin d'un StringBuilder dans ce cas. Cela dépend du type de valeur que vous obtenez. Vous auriez peut-être plusieurs DllImports différents pour chaque type de données. –

+0

Je sais que quand on tire des valeurs du registre, il n'y a pas de type de valeur définie ... il pourrait soit être une chaîne ou un entier, etc. Je crois que ce pourquoi son défini comme PVOID ... Alors ... J'attemped utiliser stringbuilder: sur StringBuilder pvData, StringBuilder myValue = new StringBuilder ("", 256); Cependant, je reçois toujours le ERROR_MORE_DATA. – user314749

Questions connexes