2013-01-09 2 views
1

명령 줄에서 "msiexec/fm"명령을 실행하면 특정 HKLM 레지스트리 키가 복구되지 않는 것으로 나타났습니다. C++에서 다음과 같이하면 같은 일이 발생합니다. "MsiReinstallProduct (ProductCode, REINSTALLMODE_REPAIR | REINSTALLMODE_MACHINEDATA);"MSI는 특정 레지스트리 키를 복구하지 않습니다

상황은 이렇습니다. COM DLL을 등록해야합니다. 이 DLL의 CLSID 정보는 MSI 레지스트리 테이블에 있습니다. 설치하는 동안 MSI는 정보를 레지스트리에 저장합니다. 수동으로 CLSID 키를 삭제하고 "msiexec/fm"복구를 수행하면 레지스트리 키가 올바르게 복원됩니다. Simlarly DLL을 가리키는 레지스트리의 경로를 수동으로 변경하면 MSI는 원래 값으로 문자열을 복구합니다.

키가 복구되지 않는 워크 플로가 하나 있습니다. 설치와 함께 제공된 DLL을 대체하기 위해 새 버전의 DLL을 컴퓨터에 놓으면 MSI는 더 이상 CLSID 키를 복구하지 않습니다. 마치 MSI가 DLL이 동일하지 않기 때문에이 키를 복구하지 말아야한다고 결정한 것입니다. DLL이 변경 되었더라도 레지스트리 키를 수정하기 위해 MSI 복구를 강제하는 방법이 필요합니다.

"msiexec/fdm"명령은 실제로 레지스트리 키를 수정하지만 파일을 원래 파일로 다시 업데이트합니다. 제 경우에는 서비스 팩에 설치되었으므로 새로운 파일이 있습니다. 새 파일을 유지하고 레지스트리 키만 수정하면됩니다.

답변

2

내 생각에 DLL 파일은 레지스트리 키를 보유하는 구성 요소의 주요 구성원입니다. 키 구성원이 없으면 구성 요소가 기본적으로 다시 설치되지 않습니다. 구성 요소 재설치가 트리거되도록하기 위해 두 개 이상의 플래그를 지정해야합니다. 예 :/fpem

http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx#BKMK_Repair

+0

예, 당신은 내가/FDM과 키가 복원됩니다 같은 옵션을 제공 할 수 정확합니다. 원본 .msi 파일의 파일을 다시 설치하지 않아도됩니다. 내가 제안한 것과 같은 옵션을 제공하면 파일을 덮어 씁니다. 이는 내가 원하는 것이 아닙니다. 이 경우 dll은 서비스 팩 (기본적으로 원본 덮어 쓰기)에서 제공 되었기 때문에 컴퓨터에 새 dll이 있습니다. 새 파일을 남기고 싶지만 깨진 레지스트리 경로를 업데이트해야합니다. 위의 질문을 업데이트하겠습니다. – user1882841

+0

.msi 파일의 레지스트리와 파일을 .msi의 다른 구성 요소로 구분할 수 있습니까? 내가 그랬다면 파일이 여전히 존재하더라도 키가 복구 될 것으로 기대할 수 있습니까? – user1882841

+0

가능합니다. 레지스트리 항목은 구성 요소의 핵심 구성원이 될 수 있습니다. – Ciprian

관련 문제