2017-12-08 9 views
0

Visual Studio 설치 프로젝트를 사용하여 MSI를 만들었습니다. Orca에서 MSI를 편집하여 사용자 지정 작업이 처음 열릴 때 DLL을 통해 수행되도록했습니다. 나는 MSI를 실행하면, msiexec는 다음과 같은 기록합니다 The installer was interrupted before MyProduct could be installed. You need to restart the installer to try again.MSI 설치가 사용자 지정 작업 DLL에 의해 중단되었습니다.

사용자 정의 DLL은 C++로 작성되었습니다 :

MSI (c) (E4:BC) [15:28:14:453]: Doing action: CustomAction1 
Action 15:28:14: CustomAction1. 
Action start 15:28:14: CustomAction1. 
MSI (c) (E4:BC) [15:28:14:453]: Note: 1: 2235 2: 3: ExtendedType 4: SELECT `Action`,`Type`,`Source`,`Target`, NULL, `ExtendedType` FROM `CustomAction` WHERE `Action` = 'CustomAction1' 
MSI (c) (E4:BC) [15:28:14:453]: Creating MSIHANDLE (13) of type 790542 for thread 3260 
MSI (c) (E4:B4) [15:28:14:453]: Invoking remote custom action. DLL: C:\DOCUME~1\USERNA~1\LOCALS~1\Temp\MSIA3.tmp, Entrypoint: SampleFunction 
MSI (c) (E4:B4) [15:28:14:453]: Closing MSIHANDLE (13) of type 790542 for thread 3260 
Action ended 15:28:14: CustomAction1. Return value 3. 
MSI (c) (E4:BC) [15:28:14:468]: Doing action: FatalErrorForm 
Action 15:28:14: FatalErrorForm. 
Action start 15:28:14: FatalErrorForm. 
MSI (c) (E4:BC) [15:28:14:468]: Note: 1: 2235 2: 3: ExtendedType 4: SELECT `Action`,`Type`,`Source`,`Target`, NULL, `ExtendedType` FROM `CustomAction` WHERE `Action` = 'FatalErrorForm' 

설치 마법사가 다음 오류 메시지를 표시합니다. 여기에 소스 코드 :

MyCustomAction.cpp :

// MyCustomAction.cpp : Defines the entry point for the DLL application. 
#include "stdafx.h" 

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    return TRUE; 
} 

UINT __stdcall SampleFunction(MSIHANDLE hModule) 
{ 
     //This is the function that is called by the MSI 
     //It is empty because I just want to check that it can be called without interrupting the installer, then I will add the actual functionality 
} 

MyCustomAction.def : 나는 또한 DLL의 추가 종속성에서 msi.lib을 참조한

; MyCustomAction.def 
; 
; defines the exported functions which will be available to the MSI engine 

LIBRARY  "MyCustomAction" 
DESCRIPTION 'Custom Action DLL' 

EXPORTS 
    SampleFunction 

. 현재 사용자 지정 작업이 설치 작업을 방해하는 이유는 무엇입니까? 어떤 도움을 주시면 감사하겠습니다.

UPDATE :

오카에서 사용자 지정 작업이 Binary 테이블에 있고 CustomAction 테이블에 1을 입력합니다. 사용자 지정 작업은 Immediate이며 IsolateComponents 이후이고 WelcomeForm 전에 InstallUISequence 테이블에서 발생합니다.

+0

함수가 아무 것도 반환하지 않습니다. VS가 경고를 생성하지 않습니까? – tkausl

+0

@tkausl 경고가 없습니다. 그것은 성공적으로 구축됩니다. – Ben

+0

경고 수준이 충분히 높지는 않습니다. 함수는 무언가를 반환해야합니다. – tkausl

답변

0

코드와 게시물을 업데이트하여 실제로 ERROR_SUCCESS을 (를) 반환하고 있음을 나타내야합니다. 그것이 문제를 해결하든 그렇지 않든, 그것이 올바른 일이라는 것이 요점입니다. 값을 반환하지 않으면 호출 시퀀스가 ​​실패하고 오류가 발생합니다.

당신의 DLL은 아마도 의존성이 없어서 로딩되지 않을 것입니다. 코드에 간단한 messagebox 호출을 넣으면 실제로 코드가 실행되기 시작했는지 확인할 수 있습니다. C++은 시스템에 이미없는 런타임 지원 DLL이 필요합니다.

C++ 런타임에 의존성이있는 것으로 판명되면 MSI를 실행하기 전에 설치해야합니다. 이것이 선행 조건 선택 사항입니다. 종속 파일을 설치하기 위해 setup.exe를 생성 한 다음 MSI를 설치합니다.

+0

나는 그가 어떤 의존성 문제를 방지하기 위해 ** 정적 링크 **를 시도 할 수 있다고 생각한다 - 나는 설치 dll이 모든 경우에 최소한의 의존성을 가져야 만하는 몇 가지 유형의 바이너리 중 하나라고 생각한다. (대부분의 다른 경우에는 정적 링크가 잘못된). 전반적으로 그는 그가 진보 된 무엇인가 대신에 WiX에 가야한다고 생각하니?더 큰 문제는 사용자 지정 작업을위한 것입니다. –

+0

Visual Studio 2017 커뮤니티 버전 (가정용 PC)을 선택했습니다. 정적으로 프로젝트의 속성 페이지에서 MFC를 연결할 수있는 옵션을 볼 수 있지만 모두 정적 링크를위한 하나 (표준 라이브러리 너무)에 대한 생각. 수년 동안이 기능을 사용하지 않았기 때문에 확신이 없으며 커뮤니티 버전에서 적절한 정적 연결을 허용하지 않을 수 있습니다. Phil,이 정보를 확인해 주시겠습니까 (webJose의 답변) : http://www.cplusplus.com/forum/general/18397/ ("이 매니페스트는 반드시 가야합니다"라는 질문이 나에게 약간의 걱정이되지만, 나는 MFC, ATL, CRT는 모두 정적으로 링크되었거나 CA dll에 대해 더 잘 피할 수 있음). –

+0

매니페스트 주석이 관련이 없다고 생각하지 않습니다. 정적 링크를 사용하여 런타임 DLL을 포함하거나 VC_runtime 전제 조건을 먼저 실행하십시오. – PhilDW