사내에서 개발 한 다른 응용 프로그램에서 작성한 레지스트리 키 값에 크게 의존하는 Installshield 2012를 사용하여 만든 설치 프로그램이 있습니다. RegDBGetKeyValueEx Installscript API를 사용하여 값을 가져옵니다.레지스트리에서 값을 가져온 유효하지 않은/외래 문자
이 값은 백 슬래시가있는 디렉터리 경로입니다. 이 값은 설치 관리자의 TARGETDIR 역할을합니다.
문제는 내가 종종 외국 문자 (중국어, 일본어 또는 한국어)가 백 슬래시에 추가 된 것을 볼 수 있다는 것입니다. 이로 인해 내 TARGETDIR에 외래 문자가 포함됩니다. 이것은 설치를 오염시킵니다.
레지스트리 값을 잘못 번역 한 Installscript API의 버그라고 생각합니다.
문제의 근본 원인을 찾을 수 있도록 일부 입력 사항을 제공해주십시오.
편집 1 :
문제의 다른 응용 프로그램이 유니 코드를 지원하지 않습니다와 순수 ANSI 응용 프로그램입니다. 아무 데나 #define 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
편집 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);
가 있습니까 당신은 확실히 집안의 다른 응용 프로그램에 의해 작성된 레지스트리 키의 가치가 올바른지? 한 번 내가 문자열 길이를 지정하여 문자열을 쓴 때 RegSetValueEx 함수에 문제가 있었는지 기억하고 cbData 매개 변수에 대한 문자열 길이 + 1 아닙니다. –
레지스트리를 보면 외래 문자가 보이십니까? 그렇지 않다면 코드에서 잘못된 값을 읽고 해석 할 가능성이 있습니다. 실제 독서 코드를 보여줄 수 있습니까? –
실제로 키에 아무 것도 쓰지 않을 때'KEY_WRITE' 액세스를 요청하는 이유는 무엇입니까? 'KEY_READ' 만 사용하거나'KEY_QUERY_VALUE' 만 사용하십시오. 요구하는 권한이 적을수록 엄격한 보안 환경에서 키를 열 가능성이 높아집니다. 또한'RegOpenKeyEx()'가 성공했지만'RegQueryValueEx()'가 실패하면 키 핸들이 누출됩니다. –