RegGetValue Frage
Ich versuche zu schreiben(was ich dachte wäre) ein einfaches script in C++ zu suchen die registry(SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall speziell) und den Rückgabewert der Wert "DisplayName".
Ich durchgemacht habe in der MSDN-Doku und Stunden bei google gesucht, leider bin ich stecken.
#define BUFFER 8192
char value[255];
DWORD BufferSize = BUFFER;
if(RegGetValue(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"),
_T("DisplayName"),
RRF_RT_ANY,
NULL,
(PVOID)&value,
&BufferSize)
)
{
_tprintf(TEXT("(%d) %s - %s\n"), i+1, achKey, value);
}
Nun, ich muss in der Lage sein, zum Anhängen achKey der 2. parameter von RegGetValue, so dass es packt die richtigen Werte, wenn die Schleife durch jeden Unterschlüssel.
Ich habe versucht, eine million verschiedene Dinge, leider ist meine Erfahrung in C++ ist ziemlich beschränkt, meine google-Fähigkeiten anscheinend müssen einige Arbeit als gut.
Bearbeiten:
achKey ist der name des Schlüssels:
Ex: NVIDIA-Treiber
So, wenn angehängt, die 2. param Lesen sollte:
SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NVIDIA Drivers
Hier ist der MSDN-Referenz auf RegGetValue:
http://msdn.microsoft.com/en-us/library/ms724868%28v=vs.85%29.aspx
Ich habe auch versucht, so etwas wie:
wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)
Wird es kompilieren, aber dann, wenn Sie ausgeführt wird, stürzt es ab.
<pre>
oder <code>
.Was ist achKey? Ich nehme an, dass ist der name des Schlüssels, der abgestimmt ist?
OK, danke.
Yessir, es ist der name des Schlüssels.
Stick mit C++ - strings anstelle von char[] : std::string (oder std::wstring für unicode). Das einzige, was Sie dann, dass Sie sich sorgen machen müssen ist, dass Windows-API-Aufrufe wie
RegGetValue
wohne in einem älteren, hirngeschädigten Welt. Übergeben std::string diese Funktionen verwenden Sie die c_str()
Methode. std::string foo = "HKLM/.../"; foo = foo + suffix; RegGetValue(..., foo.c_str(), ...)
InformationsquelleAutor Josh | 2011-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Haupt-Probleme mit dem original-code, den ich sehen kann:
char value[255]
. Verwenden Sie einewchar_t
oderTCHAR
stattchar
. dieRegGetValue()
Funktion werden automatisch weitergeleitet", um dieRegGetValueW()
oderRegGetValueA()
Funktionen je nach Projekt Unicode-Einstellungen. Wenn Sie möchten, zu zwingen, einen bestimmten Zeichensatz, den Sie verwenden können, diese Funktionen direkt, aber es ist generell besser, nur dieRegGetValue()
Funktion direkt.Der folgende code ist ein Beispiel für die Verwendung von weit Zeichenfolgen in der Weise, die Sie wünschen:
Edit: LPCWSTR Hinweise
Einen
LPCWSTR
im Windows ist einfach ein Zeiger auf eine Konstante Breite-string oder direkt eineconst wchar_t *
das ist das gleiche wie einTCHAR *
in einem Unicode-Projekt. Beachten Sie, dass wenn Sie änderungen an Ihrem Projekt zu einem MultiByte-Zeichensatz, dann ist die Funktion Erklärung derRegGetValue()
(und eine Vielzahl von anderen Windows-Funktionen) ändern würde, um mit einemLPCSTR
statt und einTCHAR
wäre einfach einechar
.Die nette Sache über die Verwendung von std::string/wstring ist, dass Sie direkt kompatibel mit einer
LPCWSTR
und einLPCSTR
. Somit ist dein AufrufRegGetValue()
verwenden können, ist der std::wstring-Variablen direkt wie:Auch sollte ich erwähnen, dass der 2. parameter in RegGetValue muss LPCWSTR.
Siehe mein edit oben erklärt, LPCWSTR ein bisschen mehr.
InformationsquelleAutor uesp
Weil Sie zu verknüpfen versuchen, etwas auf einer Zeichenkette, also das beste, dass passieren wird, ist Sie trampeln über zufällige Bereiche der Anwendung. Ich bin ein wenig überrascht, dass es kompiliert ohne Fehler oder Warnungen, wie die literal-Zeichenfolge sein würde, const...?
http://msdn.microsoft.com/en-us/library/h1x0y282%28v=vs.80%29.aspx
InformationsquelleAutor Roddy
Was Sie hier sehen, ist ziemlich basic-string-manipulation. So etwas wie:
Wenn Sie mit weiten Streichern, die Sie verwenden möchten
wstring
(und wide-character-Literale) statt:Auch, versuchen zu tun, Pfad + "Text Hier" nicht gelten(weder ist Pfad+achKey), "keine geeignete Konvertierung von std:: "LPCWSTR" existiert"
wenn Sie mit weiten Streichern, würden Sie wollen
std::wstring
statt. Dannpath+achKey
gültig sein sollte (gut, es ist wirklich sollte nicht gelten, sollte noch etwas anderes mit diesem verfluchten HN Mist, aber es ist sowieso).Ich habe versucht, wstring, kein würfeln, wie gut. Nicht einmal kompilieren. Ich habe gesucht über google und über einen Weg zum verketten von text makro-string und einen tchar-variable. Nichts hat funktioniert, noch habe ich auch gefunden, dass jemand versucht, es zu tun.
Sie müssen
.c_str()
auf die resultierende Zeichenfolge, um Sie zu passieren, um eine Funktion erwartet einen Zeiger auf die Zeichenfolge. Es gibt keine implizite Konvertierung wie es ist mit MFC-oder ATL-CStrings.InformationsquelleAutor Jerry Coffin