Bonjour!
Je me permets de poster ici (j'espère que c'est la bonne section) car je rencontre des problèmes sur le projet que voici : Je dois réaliser un activeX en VC++ avec visual studio 2005 pour lire des données dans la base de registre windows, et présenter le résultat dans une page web avec javascript. Or, je rencontre deux problèmes principaux. Le premier est que l'activeX fait planter IE dans la méthode qui est censée lire un REG_SZ que voici
[CODE]
BSTR CNewTryCtrl::ReadSZValue(LPCTSTR hive, LPCTSTR key, LPCTSTR value)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString strResult;
HKEY hiveName, hKey;
LPCTSTR HKCU, HKLM;
DWORD size;
DWORD type = REG_SZ;
HKCU = CString("HKCU");
HKLM = CString("HKLM");
if (_tcsicmp(hive, HKCU) == 0) {
hiveName = HKEY_CURRENT_USER;
} else {
hiveName = HKEY_LOCAL_MACHINE;
}
if( RegOpenKeyEx(hiveName, key, 0L, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, value, NULL, NULL, NULL, &size) == ERROR_SUCCESS) {
LPTSTR szValue = new TCHAR[size/sizeof(TCHAR)];
if (RegQueryValueEx(hKey, value, NULL, &type, (LPBYTE)szValue, &size) == ERROR_SUCCESS) {
BSTR result = (BSTR)CComBSTR(szValue);
delete(szValue);
RegCloseKey(hKey);
return result;
} else {
strResult = CString("Could not read key value");
RegCloseKey(hKey);
}
} else {
strResult = CString("Could not read key value");
RegCloseKey(hKey);
}
} else {
strResult = CString("Could not open key");
}
return strResult.AllocSysString();
}
[/CODE]
et que j'utilise comme ceci en javascript dans la page web
[CODE]
function getIEVersion() {
return(RegAX.ReadValue("HKLM", "SOFTWARE\\Microsoft\\Internet Explorer", "Version"));
}
...
...
[/CODE]
A noter que j'ai fait une méthode readDWValue qui lit les REG_DWORD et que celle-ci marche très bien. Egalement, lorsque je fais l'appel à la méthode ReadSZValue, puis un appel à ReadDWValue, ça plante, alors que l'inverse ne plante pas. J'ai donc pensé à un problème d'allocation mémoire, ou un problème de string, avec lesquelles je suis peu familier dans ce langage, mais je n'ai pas été capable de repérer l'erreur.
Le second problème est que l'activeX se télécharge et se lance sur certaines machines distantes, mais pas toutes, alors qu'a priori je l'ai signé correctement avec les outils makecert et signcode.
Merci d'avance!
Nyn
PS: A titre informatif, et à des fins de comparaison, j'inclus ici la méthode ReadDWValue :
[CODE]
LONG CNewTryCtrl::ReadDWValue(LPCTSTR hive, LPCTSTR key, LPCTSTR value)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HKEY hiveName, hKey;
CString HKCU, HKLM;
DWORD dwValue;
DWORD size;
DWORD type = REG_DWORD;
HKCU = "HKCU";
HKLM = "HKLM";
if (_tcsicmp(hive, HKCU) == 0) {
hiveName = HKEY_CURRENT_USER;
} else {
hiveName = HKEY_LOCAL_MACHINE;
}
if( RegOpenKeyEx(hiveName, key, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, value, NULL, &type, (LPBYTE)&dwValue, &size) == ERROR_SUCCESS) {
RegCloseKey(hKey);
return dwValue;
} else {
RegCloseKey(hKey);
return -1;
}
} else {
return -1;
}
}
[/CODE]