Inno Setup에서 종속성이있는 DLL을로드하면 "DLL을 가져올 수 없음"이있는 제거 프로그램에서 실패하지만 설치 프로그램에서는 작동합니다

Nov 26 2020

프로그램을 제거 할 때이 오류가 발생합니다.

dll을 가져올 수 없음 : <utf8> c : \ TestProg \ IsStart.dll

내가 여기서 뭘 잘못 했니? 아무도이 문제를 해결하도록 도와 줄 수 있습니까?

CheckO4TaskMngrSvcStopAndUninstall다음을 중지하고 삭제합니다 O4TaskManager Service.

코드는 다음과 같습니다.

[Files]
Source: "IsStartServer.dll"; DestDir: "{tmp}"; DestName: IsStart.dll
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{src}"; DestName: sqlite3.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
Source: "sqlite3x64.dll"; DestDir: "{app}"

[Code]
function TaskMngrInst: LongBool;                                                
external 'CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';

function TaskMngrUninst: LongBool;                                                
external 'CheckO4TaskMngrSvcStopAndUninstall@{app}\IsStart.dll stdcall uninstallonly';

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
    begin
      TaskMngrInst();
    end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
    begin
      TaskMngrUninst();
      DeleteFile(ExpandConstant('{app}\sqlite3.dll'));
      DeleteFile(ExpandConstant('{app}\IsStart.dll'));
      RenameFile('{app}\sqlite3x64.dll)', '{app}\sqlite3.dll');
    end;
end;

답변

1 MartinPrikryl Nov 30 2020 at 16:54

나는 일련의 다른 문제가 있다고 생각합니다 (그 중 일부는 실제로 내 잘못된 제안에 근거한 것입니다).

올바른 코드는 imo입니다.

[Files]
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
[Code]
function TaskMngrInst: LongBool;                                                
  external 'CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';

function TaskMngrUninst: LongBool;                                                
  external 'CheckO4TaskMngrSvcStopAndUninstall@{app}\IsStart.dll stdcall loadwithalteredsearchpath uninstallonly';

요점 :

  • 원래 문제는 제거 프로그램의 가져 오기 선언 에 loadwithalteredsearchpath플래그 가 없다는 것입니다 . 종속성을로드하려면 필요합니다 ( sqlite3.dll).
  • 제거 프로그램에서 사용할 수 있도록에 종속성 ( sqlite3.dll) 을 설치해야합니다 {app}.
  • 설치된 종속성 복사본은 기본 DLL이 찾는 이름 ( sqlite3.dll, 아님 sqlite3x86.dll) 과 일치해야합니다 .
  • external선언 에있는 DLL의 이름은 원래 파일이 아닌 대상 파일 이름 ( DestName: IsStart.dll, DestName: sqlite3.dll) 과 일치해야합니다 .
  • 종속성은 설치 프로그램 내에서 DLL을로드 할 때만 선언에 나열되어야하고 나열 될 수 있습니다 ( files:접두사 포함). 실제 경로 ( {app}\IsStart.dll) 에서 DLL을로드하는 경우에는 해당되지 않습니다 . 종속성을 나열하는 유일한 목적은 설치 프로그램이이를 추출하는 것입니다 (로드하지 않고 기본 DLL이 수행하므로 이전 지점). 모든 파일이 이미 설치되어 있으므로 실제 파일을로드 할 때이를 나열 할 필요가 없습니다. 을 사용 {app}\primary.dll,{app}\dependency.dll하면 제거 프로그램이 실제로 이름이있는 파일을로드하려고 시도합니다 {app}\primary.dll,{app}\dependency.dll. 분명히 실패합니다.
  • {tmp}또는에 아무것도 설치할 필요가 없습니다 {src}.
АндрейА Nov 29 2020 at 06:06

IsStart.dll은 sqlite3.dll에 의존합니까? sqlite3x86.dll이 무엇인지 모를 수 있습니다. 일부 플러그인이있는 totalcmd에서 누락 된 dll을 볼 수 있습니다.