J'ai créé un .dll qui devrait fonctionner comme la commande RunAs. La seule différence est, qu'il devrait lire du registre. Mon problème est, que j'ai besoin de reed 3 valeurs du registre, mais je ne peux pas. Il lit le premier, qu'il échoue à la seconde (Mot de passe) avec le code d'erreur 2, ce qui signifie "Le système ne peut pas trouver le fichier spécifié". Si je demande seulement pour le domaine et le nom d'utilisateur alors c'est correct, si je demande seulement pour le mot de passe alors cela réussit toujours, mais si je veux interroger tous les trois alors il échoue. Quelqu'un peut-il me dire, ce que je fais mal?Comment lire correctement le registre pour plusieurs valeurs dans c?
Heres mon code:
HKEY hKey = 0;
DWORD dwType = REG_SZ;
DWORD dwBufSize = sizeof(buf);
TCHAR szMsg [MAX_PATH + 32];
HANDLE handle;
LPVOID lpMsgBuf;
if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Kampi Corporation\\RunAs!"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hKey, TEXT("Username"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS)
{
memset(szMsg, 0, sizeof(szMsg));
wsprintf (szMsg, _T("%s"), buf);
mbstowcs(wuser, szMsg, 255);
RegCloseKey(hKey);
}
else
{
MessageBox (pCmdInfo->hwnd, "Can not query for Username key value!", _T("RunAs!"), MB_ICONERROR);
RegCloseKey(hKey);
return -1;
}
}
else
{
CSimpleShlExt::showerror(GetLastError(), pCmdInfo->hwnd, "RegOpenKeyEx failed for Username with error code :: ");
return -1;
}
if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Kampi Corporation\\RunAs!"), 0, KEY_QUERY_VALUE ,&hKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hKey, TEXT("Password"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS)
{
memset(szMsg, 0, sizeof(szMsg));
wsprintf (szMsg, _T("%s"), buf);
mbstowcs(wpass, szMsg, 255);
RegCloseKey(hKey);
}
else
{
char test[200];
sprintf(test,"Can not query for Password key value! EC: %d",GetLastError());
MessageBox (pCmdInfo->hwnd, test, _T("RunAs!"), MB_ICONERROR);
RegCloseKey(hKey);
return -1;
}
}
else
{
CSimpleShlExt::showerror(GetLastError(), pCmdInfo->hwnd, "RegOpenKeyEx failed for Password with error code :: ");
return -1;
}
if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Kampi Corporation\\RunAs!"), 0, KEY_QUERY_VALUE ,&hKey) == ERROR_SUCCESS)
{
if(RegQueryValueEx(hKey, TEXT("Domain"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS)
{
memset(szMsg, 0, sizeof(szMsg));
wsprintf (szMsg, _T("%s"), buf);
mbstowcs(wdomain, szMsg, 255);
RegCloseKey(hKey);
}
else
{
sprintf(test,"Can not query for Password key value! EC: %d",GetLastError());
MessageBox (pCmdInfo->hwnd, test, _T("RunAs!"), MB_ICONERROR);
RegCloseKey(hKey);
return -1;
}
}
else
{
CSimpleShlExt::showerror(GetLastError(), pCmdInfo->hwnd, "RegOpenKeyEx failed for Domain with error code :: ");
return -1;
}
Salut! Merci beaucoup. C'était mon problème. J'avais juste besoin d'initialiser dwBufSize avant chaque requête. Merci beaucoup – kampi