У меня есть установщик, созданный с использованием Installshield 2012, который во многом зависит от значения ключа реестра, написанного каким-либо другим приложением, разработанным внутри компании. Я использую API-интерфейс RegDBGetKeyValueEx для получения значения.Недопустимые/чужие символы из значения, полученного из реестра
Это значение представляет собой путь к каталогу, который, как гарантируется, имеет обратную косую черту. Это значение служит TARGETDIR для моего установщика.
Проблема заключается в том, что я часто вижу иностранного персонажа (китайца, японца или корейца), прилагаемого к обратной косой чертой. Это приводит к тому, что мой TARGETDIR содержит внешний символ. Это загрязняет мою установку.
Я чувствую, что это некоторая ошибка с API-интерфейсом Installscript, который неправильно преобразует значение реестра.
Просьба представить несколько материалов, чтобы я мог найти причину проблемы.
EDIT 1:
Другая заявка на вопрос чисто ANSI приложения без поддержки Unicode. В любом месте не указано #define UNICODE. Я также проверил параметры компилятора и не нашел ничего, что связано с Unicode.
Это приложение считывает один ключ реестра и добавляет обратную косую черту и обновляет другие ключи. После того, как эта операция выполняется мой инсталлятор извлекает значения написано:
if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, csVersKey, 0, KEY_READ|KEY_WRITE, &hKey) == ERROR_SUCCESS) &&
(RegQueryValueEx(hKey, "BasePath", NULL, NULL, (unsigned char *)szTemp, &BufferSize) == ERROR_SUCCESS))
{
m_reqPath = szTemp;
if (m_regPath.Right(1) != "\\") m_reqPath += "\\";
m_reqMachinePath = m_reqPath + "\\" + m_reqMachine + "\\";
m_reqHardwarePath = m_reqMachinePath + HARDWARE_DIRECTORY;
m_reqManualPath = m_reqMachinePath + MANUAL_DIRECTORY;
m_reqVersionPath = m_reqMachinePath + m_reqVersion + "\\";
m_reqFirmwarePath = m_reqVersionPath + FIRMWARE_DIRECTORY;
m_RegVersDirectory = m_reqVersionPath + PROGRAM_DIRECTORY;
RegCloseKey(hKey);
}
Значения обновляются в приведенном выше коде затем записываются в реестр. код InstallScript, который извлекает эти значения является:
if ((RegDBKeyExist(szBaseKey^szRegKey) = 1) && (RegDBGetKeyValueEx(szBaseKey^szRegKey, "ReqPath", nTemp, szTemp, nvSize) = 0)) then
EDIT 2:
Путь устанавливается значение реестра, кажется, неправильно:
RegSetValueEx(hKey, LEICA_PATH, 0, REG_SZ, (const unsigned char*)m_reqLeicaPath.GetBuffer(m_reqLeicaPath.GetLength()), m_reqLeicaPath.GetLength());
Я чувствую правильный код должно быть:
RegSetValueEx(hKey, LEICA_PATH, 0, REG_SZ, (const unsigned char*)m_reqLeicaPath.GetBuffer(m_reqLeicaPath.GetLength()), m_reqLeicaPath.GetLength() + 1);
Are вы уверены, что значение ключа реестра, написанного другим в домашнем приложении, является правильным? Я помню, что у меня были проблемы с функцией RegSetValueEx, когда я написал строку, указав длину строки, а не длину строки + 1 для параметра cbData. –
Если вы посмотрите в реестре, вы видите иностранного персонажа? Если нет, то, скорее всего, вы читаете/интерпретируете неверное значение в вашем коде. Можете ли вы показать свой фактический код чтения? –
Почему вы запрашиваете доступ к «KEY_WRITE», когда вы на самом деле ничего не пишете на ключ? Используйте 'KEY_READ' самостоятельно или даже просто' KEY_QUERY_VALUE'. Чем меньше разрешений вы запрашиваете, тем лучше ваши шансы открыть ключ в более жестких средах безопасности. Кроме того, вы пропустите ключевой дескриптор, если 'RegOpenKeyEx()' успешно, но 'RegQueryValueEx()' терпит неудачу. –