Skey is a variable, is there any way to do that?Code:if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" >> Skey), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
Skey is a variable, is there any way to do that?Code:if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" >> Skey), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
That's a syntax error. What are you trying to do?
My best code is written with the delete key.
Looks like he is trying to load the reg file: SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Unin stall\\
into the var Skey.
I guess from my understanding of what ive been reading in order to read the values in a regestry key you have to open the exact key first.
The uninstall key has various subkeys, the Skey variable is gonna be the name of one f the subkeys.. the code above will be looped for each subkey in the uninstall key.
im trying to open each one so I can grab the values in each like "display name" and uninstall directory, and the version of the software.
I grabed the code off of the MSDN site and it almost does what I need.. but not quite, which is what im trying to get it to do, it creates a list of subkeys for the uninstall key, but it dosn't grab the values in each of the subkeys, the code to grab the values is there, but I need to open the subkeys first to get it.
naw this line here
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion \\Uninstall\\" >> Skey),
thats like a pointer kinda... it hooks onto this HKEY_LOCAL_MACHINE
points to that key in the regestry.. Skey is supposed to be one key below eg: uninstall\\Doom3
hehe I used the >> like you would use cin hoping it would add it to that.. seeing as Skey is a string
::RegQueryValueEx for your registry querying needs. I'm sure you could make a nifty little operator overload for this, with a RegistryKey class and a buffer as the params of your overloaded >>. Even so, it wouldn't work how you described it, >> is a purely istream thing until you extend it.
can't figure out how to use regqueryvalue.... heck I barley understand what this is doin so far LOL, all Is what i mention in the code below.
here is what I have, all except for a few changes was copyed from here:
http://msdn.microsoft.com/library/de...mputername.asp
ok here is the code:
Ok, I know its not done at the bottom yet.. i need to get it to accept Skey first.. then i'll worry about looping it.. but I noted in red where the problem isCode:#include <stdio.h> #include <windows.h> #include <apstring.h> #include <tchar.h> #include <fstream.h> ifstream fin; ofstream fout; #define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 apstring QueryKey(HKEY hKey) { fout.open("value.txt"); <=== I open this to store the results int K = 1; TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time DWORD i, retCode; TCHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; // Get the class name and the value count. retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // last write time // Enumerate the subkeys, until RegEnumKeyEx fails. if (cSubKeys) { printf( "\nNumber of subkeys: %d\n", cSubKeys); for (i=0; i<cSubKeys; i++) { cbName = MAX_KEY_LENGTH; retCode = RegEnumKeyEx(hKey, i, achKey, &cbName, NULL, NULL, NULL, &ftLastWriteTime); if (retCode == ERROR_SUCCESS) { _tprintf(TEXT("(%d) %s\n"), i+1, achKey); fout << K << achKey<< endl; return (achKey); <=== im retuning achkey because it contains the subkey name that I need to open to retrieve the value K++; } } } // Enumerate the key values. if (cValues) <===== problem because the uninstall key has no values.. its the subkeys that have the values I need so after the value of the subkey is returned to the main function it will be put into Skey and this whole thing ill be repeated for the subkey.after I can get it to do that i will figure out how to keep it from just getting the value from the same subkey over and over. { printf( "\nNumber of values: %d\n", cValues); for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) { cchValue = MAX_VALUE_NAME; achValue[0] = '\0'; retCode = RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL); if (retCode == ERROR_SUCCESS ) { _tprintf(TEXT("(%d) %s\n"), i+1, achValue); } } } } void _tmain(void) { apstring Skey = ""; HKEY hTestKey; if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" Skey), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS) { Skey = QueryKey(hTestKey); } }
hope this at least explains what im tryin to do.. searching this spot in the registry is the only way I can think of of obtaining a list of all installed software on the machine.
Last edited by Sephiroth222; 08-28-2005 at 08:54 AM.
Well, from the .h's up top, in particular the stdio.h, is this C or C++? :P
In your example, I don't know what an apstring is, or why we'd be using it, but you were returning an HKEY anyways so your QueryKey should have been defined to return one.
>> Well, from the .h's up top, in particular the stdio.h, is this C or C++? :P
Meh, if you're using the Win32 API and aren't going to write all your own wrappers, a lot of it will look like regular C anyways. Anyways, to get all the installed programs is going to be somewhat awkward but it's a cool idea. What you might do is, like in your example, is use RegQueryInfoKey in order to get the number of subkeys (cSubKeys) in the already open SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstal l key. Then you will loop through each subkey, and, using the key you obtain from the enumeration, you will open it and RegQueryValue[Ex] or RegGetValue the DisplayName or QuietDisplayName values, and then print them out!
Want to give that a try and report back? Be sure to just look at the MSDN documentation on the functions you need
Well fstream is only found in C++, but he's using outdated C++. FYI, the new standard dictates that the following style be used:
- Header files from the C library should be preceded by a 'c'
- Standard files do not need the '.h'
- Namespaces must be used
like so
That 'using' statement is the simplest way to just say that you're using the standard namespace. Nothing else in your code needs to change. There are other styles, which might make it easier if you're working with other namespaces, but since you're just using the standard namespace, I recommend you stick with this for now.Code:#include <cstdio> // A standard C header file #include <windows.h> // A non-standard file #include <apstring.h> // Same as above, I assume #include <tchar.h> // Same as above, I assume #include <fstream> // A standard C++ header file using namespace std;
this is what i tried and it worked,
Code:#include <iostream> #include <windows.h> using namespace std; int main() { HKEY hk; if ( RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\ILV", &hk) == ERROR_SUCCESS) { RegSetValueEx(hk, "hello", 0, REG_EXPAND_SZ, (LPBYTE)"world", 6); } cin.get(); return 0; }
>> ...obtaining a list of all installed software on the machine. (Sephiroth)
>> this is what i tried and it worked [code]... (ILoveVectors)
Was there any relevence with that ILoveVectors?