2013-05-01 2 views
1

사용자가 내 응용 프로그램을 처음 설치하는 경우 DLL을 자동 등록하도록 어떻게 구성합니까? 이전 버전이 있으면 등록을 취소하고 새 버전을 등록하십시오 인터페이스가 다르다고 가정)?Inno 설치로 DLL 서버 업데이트

[Setup] 
... 

[Languages] 
... 

[Files] 
Source: "C:\example.dll"; DestDir: "{app}"; Flags: ignoreversion regserver 

을 내 구글 검색에서 내가 UnregisterServer를 발견하지만 난 내 스크립트에이를 추가하는 방법을 모른다 : 아래와 같이

나는 현재 내 파일 섹션하여 regserver를하고 ignoreversion 플래그를 사용합니다. 나는 기쁘게 어떻게 돌아가는지를보기 위해 주위를 고치기 시작할 것이지만, 나는 나의 레지스트리를 엉망으로 만드는 일을하고 싶지 않다.

here 비슷한 게시물이 있지만 실제로 어떻게 수행되는지는 설명하지 않습니다.

편집

파스칼 주위 해킹 후 나는 [코드] 섹션에 다음을 추가 할 수 있었다 일했다. 아래 코드에서 {app} 상수를 사용하여 fileName을 동적으로 정의하는 방법을 아는 사람이 있습니까?

[Code] 
const 
    fileName = 'C:\Program Files\TFolderName\tigercontroller.dll'; 
var 
    serverExists: Boolean; 

function InitializeSetup(): Boolean; 
begin  
    serverExists := UnregisterServer(False, fileName, False); 

    if serverExists then begin 
    Result:= True; 
    MsgBox('This will update with the most recent version', mbInformation, mb_Ok); 
    end else 
    Result := True; 
end; 
+1

'InitializeSetup' 시간에'{app}'상수를 확장하기에는 너무 이르다. 또한,'{app}'상수는 이전에 선택한 응용 프로그램 폴더를 확인하기 위해 현재 선택된 설치 폴더를 포함합니다. 'WizardForm.PrevAppDir' 속성의 마지막 폴더는'InitializeWizard' 이벤트 메서드에서 곧 얻을 수 있습니다. ['이 길 '] (http://pastebin.com/pkXAgEzH). – TLama

+0

Tlama, 고맙습니다! 왜 내가 {app}을 참조 할 수 없는지 궁금합니다. WizardForm.PrevAppDir은 어떻게 작동합니까? 마법사를 사용하여 이전에이 마법사를 사용했음을 알 수 있도록 .iss 스크립트를 동일하게 유지해야합니까? –

+0

일반적으로 호환되지 않는 COM 인터페이스를 충분히 변경하지 않아도됩니다. (단 하나만 추가하고 빼기는 절대하지 않아야합니다.) 따라서 이전 버전의 등록을 취소 할 필요가 없습니다. 물론 공유 된 응용 프로그램이 아닌 응용 프로그램 개인 라이브러리 인 경우 약간의 여유가 생깁니다. – Miral

답변

2

무엇 BeforeInstall 및 파일에 대한 AfterInstall 매개 변수를 사용하는 방법에 대해?

사용법은 다음과 같습니다

[Files] 
Source: "MYDLL.DLL"; DestDir: "{app}"; BeforeInstall: MyBeforeInstall; AfterInstall: MyAfterInstall; 

BeforeInstall 및 AfterInstall 함수는 반환 값이 없어야합니다!

procedure MyBeforeInstall(); 
begin 
    // Your code here: If file (old) file exists call UnregisterServer() on old file 
    // Use function FileExists(const Name: String): Boolean; or similar for it 
    // Also you can delete the file entirely with function DeleteFile(const FileName: string): Boolean; 

    // Hint: You can use 'CurrentFileName' variable to get currently processed file 
end; 

procedure MyAfterInstall(); 
begin 
    // Your (new) file was processed and now you can do additional tweaks on it 
    // 'CurrentFileName' variable is still available 
    // Setup registers all files with the 'regserver' or 'regtypelib' flags as the last step of installation so in this function the file is still not registered! 
end; 
+0

나는 이것을 아주 좋아한다. 내가 이것을 시험해 볼 수 있는지 알게 될 것이다. AfterInstall에 대한 사용법은 아직 없지만 알아두면 좋습니다. –

0

것은 이것을 사용해, 또한 32/64 비트 병렬 COM 서버 처리 :

 function UnregisterCOMServer(sServerCLSID: String): Boolean; 
var 
    sServerPath: String; 
Begin 
    Result:=False; 
    //search in HKCR (merged view) 
    if RegQueryStringValue(HKEY_CLASSES_ROOT, 'CLSID\'+sServerCLSID+'\InprocServer32', '', sServerPath) then 
    Begin 
     if sServerPath<>'' then 
     Begin 
      Log('Found COM server CLSID:'+ sServerCLSID +', path:'+sServerPath); 
      Result:=UnregisterServer(False, sServerPath, True); 
      if Result then Log('COM server '+ sServerCLSID +' unregistered.') 
      else Log('UnregisterServer on '+ sServerPath +' failed!'); 
     end 
     else Log('No COM server path found.'); 
    end 
    else Log('COM server CLSID:'+ sServerCLSID +' not found!'+sServerPath);

if Is64BitInstallMode then Begin if RegQueryStringValue(HKEY_CLASSES_ROOT, 'Wow6432Node\CLSID\'+sServerCLSID+'\InprocServer32', '', sServerPath) then Begin if sServerPath<>'' then Begin Log('Found COM server (Wow6432) CLSID:'+ sServerCLSID +', path:'+sServerPath); Result:=UnregisterServer(True, sServerPath, True); if Result then Log('COM server (Wow6432) '+ sServerCLSID +' unregistered.') else Log('UnregisterServer (Wow6432) on '+ sServerPath +' failed!'); end else Log('No COM server (Wow6432) path found.'); end else Log('COM server (Wow6432) CLSID:'+ sServerCLSID +' not found!'+sServerPath); end;

단부;