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을 볼 수 있습니다.