2014-10-09 2 views
0

저는 비슷한 질문을했지만 이전에는 아직 내 문제의 해결책을 찾을 수 없었습니다.wx를 사용하여 제거하기 전에 시스템 트레이 응용 프로그램을 닫으십시오.

실행중인 시스템 트레이 응용 프로그램이 있는데 설치 제거가 시작되기 전에 닫고 "FileInUse"대화 상자가 표시되지만 내가하고있는 일은 제대로 작동하지 않습니다. 시스템 트레이 응용 프로그램을 닫으려면 파일이 설치된 폴더에 파일을 만들어야합니다. 그런 다음 응용 프로그램에서 파일을 삭제하고 자체를 닫습니다.

나는 무엇을 시도했다에 따라 다음과 같은 문제를 받고 있어요 :

1) "FileInUse"대화 상자가 표시됩니다. 괜찮음

2) 시스템 트레이 응용 프로그램에 종료해야한다고 알리는 파일을 만드는 사용자 지정 작업 호출에 실패했습니다.

Error 1 ICE77: CloseAgentMonitor is a in-script custom action. It must be 
sequenced in between the InstallInitialize action and the InstallFinalize action in 
the InstallExecuteSequence table 

3) 내가 Immediate 대신 Immediate로 설정하면 CustomAction에에서는 CustomData 매개 변수로 내 응용 프로그램 폴더를 전달하는 데 실패하지만 Deferred 모든 설정하면, 나는 2에서 설명한 오류)

를 얻을 수

4) RemoveFiles, InstallValidate, InstallFinalize 전에 사용자 지정 작업을 호출하는 것과는 다른 시나리오를 시도했습니다.

올바른 순서가 무엇인지 확실하지 않으므로 누군가 내 CustomAction을 호출하는 방법 및시기를 알려 주어 "제거"버튼이 닫히거나 파일이 제거되기 전에 트리거 할 수 있습니까?

파일을 제거 할 때와 FileInUse 대화 상자가 표시되기 전에이 작업을 수행하고 싶습니다.

자동 또는 시각적 제거에서이 문제를 처리 할 수 ​​있다는 점에 유의하십시오.

감사합니다.

UPDATE :

아마 내 윅스 코드를 게시해야

:

<!-- Set variables required by the CloseAgentMonitor CustomAction --> 
<CustomAction Id="CloseAgentMonitorSetProp" 
     Return="check" 
     Property="CloseAgentMonitor" 
     Execute="immediate" 
     Value="APPLICATIONFOLDER=[APPLICATIONFOLDER]" /> 

<!-- Define CustomAction to close the Agent on uninstall --> 
<CustomAction Id="CloseAgentMonitor" 
     Return="check" 
     Execute="immediate" 
     BinaryKey="CustomActions.CA" 
     DllEntry="CloseAgentMonitor" /> 


<InstallExecuteSequence> 
    <!- Make sure to set the props before the CloseAgentMonitor custom action --> 
    <Custom Action="CloseAgentMonitorSetProp" Before="CloseAgentMonitor"> 
    <![CDATA[(Installed AND NOT UPGRADINGPRODUCTCODE)]]> 
    </Custom> 

    <Custom Action="CloseAgentMonitor" Before="InstallValidate"> 
    <![CDATA[(Installed AND NOT UPGRADINGPRODUCTCODE)]]> 
    </Custom> 
    ... 

2에 언급 된 문제를 밖으로 InstallValidate 종류 전에 호출되는 즉시에 CustomAction하고 설정 변경을하지만, 그것은 내 CustomActionData이 설정되지 않고있는 것으로 보이는 지점 3에서 언급 한 오류를 다시 발생시키고 심지어 CustomAction 전에 호출 되었기 때문에 있어야한다고 생각했습니다.

MSI (s) (30:08) [16:22:47:148]: Doing action: CloseAgentMonitorSetProp 
MSI (s) (30:08) [16:22:47:148]: Note: 1: 2205 2: 3: ActionText 
Action 16:22:47: CloseAgentMonitorSetProp. 
Action start 16:22:47: CloseAgentMonitorSetProp. 
MSI (s) (30:08) [16:22:47:148]: PROPERTY CHANGE: Adding CloseAgentMonitor property. 
Its value is 'APPLICATIONFOLDER=C:\Program Files (x86)\Company\Client\'. 
Action ended 16:22:47: CloseAgentMonitorSetProp. Return value 1. 

하지만 내 CustomAction가 호출 될 때 당신이 볼 수 있듯이, 그것은 APPLICATIONFOLDER에 액세스하는 동안 오류가 트리거 : 그것은 내 로그에서 당신은 명확하게 볼 수 있습니다

.

MSI (s) (30:08) [16:22:47:148]: Doing action: CloseAgentMonitor 
MSI (s) (30:08) [16:22:47:148]: Note: 1: 2205 2: 3: ActionText 
Action 16:22:47: CloseAgentMonitor. 
Action start 16:22:47: CloseAgentMonitor. 
MSI (s) (30:1C) [16:22:47:148]: Invoking remote custom action. DLL: 
C:\Windows\Installer\MSI57B2.tmp, Entrypoint: CloseAgentMonitor 
MSI (s) (30:C0) [16:22:47:148]: Generating random cookie. 
MSI (s) (30:C0) [16:22:47:148]: Created Custom Action Server with PID 2528 (0x9E0). 
MSI (s) (30:F4) [16:22:47:195]: Running as a service. 
MSI (s) (30:F4) [16:22:47:195]: Hello, I'm your 32bit Impersonated custom action server. 
SFXCA: Extracting custom action to temporary directory: C:\Windows\Installer\MSI57B2.tmp-\ 
SFXCA: Binding to CLR version v4.0.30319 
Calling custom action CustomActions!CustomActions.CustomActions.CloseAgentMonitor 
CloseAgentMonitor - Start 
IsAgentMonitorRunning - Start 
Checking if Agent Monitor is running. 
Agent Monitor running: True 
IsAgentMonitorRunning - End 
Checking CustomActionData - Start 
Checking CustomActionData - End 
Exception thrown by custom action: 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of 
an invocation. ---> System.Collections.Generic.KeyNotFoundException: The given key was 
not present in the dictionary. at System.Collections.Generic.Dictionary`2.get_Item(TKey key) 
at Microsoft.Deployment.WindowsInstaller.CustomActionData.get_Item(String key) 
at CustomActions.CustomActions.CloseAgentMonitor(Session session) 
--- End of inner exception stack trace --- 
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object arguments, Signature sig, 
Boolean constructor) 
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object parameters, 
Object arguments) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder 
binder, Object parameters, CultureInfo culture) 
at Microsoft.Deployment.WindowsInstaller.CustomActionProxy.InvokeCustomAction(Int32 
sessionHandle, String entryPoint, IntPtr remotingDelegatePtr) 
CustomAction CloseAgentMonitor returned actual error code 1603 (note this may not be 100% 
accurate if translation happened inside sandbox) 
Action ended 16:22:47: CloseAgentMonitor. Return value 3. 
Action ended 16:22:47: INSTALL. Return value 3. 

답변

0

사용중인 파일은 InstallInitialize 이전의 InstallValidate 작업에 의해 수행됩니다. 코드가 정상적으로 작동한다고 가정하고 즉각적인 사용자 지정 작업으로 실행하면 InstallValidate가 정상이되어야합니다.

왜 같은 폴더에 파일을 만들어야합니까? 파일 사용 중 문제와 관련이없는 것처럼 보입니다. 실행중인 앱을 종료하는 일반적인 방법은 닫기 메시지를 보내는 것입니다. WiX에는이를 수행 할 CloseApp 사용자 지정 작업이 있습니다.

그리고 비슷한 일을 말한다 이는이있다 :

WiX close application before uninstall - close open applications message

+0

시도해 보겠습니다. .exit 파일을 만드는 이유는 내 응용 프로그램을 닫는 것입니다. 왜냐하면 WM_CLOSE 메시지가 나를 위해 작동하지 않는 것처럼 보이고 CloseApp도 작동하지 않기 때문입니다. 나는 이것이 잘 풀릴 수있는 빠르고 쉬운 해결책이라고 생각 했으므로 나는 그걸로 갈 것이라고 생각했다. 어쨌든, 나는 당신의 제안을 시도하고 되돌릴 것입니다. 감사. – Thierry

+0

트레이 응용 프로그램이 닫을 때 멋지게 반응하지 않으면 코드가 너 또는 회사 일 때 고칠 수 있습니다. 그러면 코드를 고치면 고치기 만하면 더 빨리 해결할 수 있습니다. – PhilDW

+0

나는 동의하지만이 시스템 트레이 응용 프로그램은 많은 클라이언트에 의해 사용되지 않으며 옵션이며 우선 순위가 매우 낮습니다. 나는 그것을 더 자주 사용하게 될 것이므로 그것을 포함하려고 노력하고 있지만 그것은 불행히도 나의 우선 순위를 바꾸지 않을 것이다. 결국 나는 그것을 조사하여 적절한 WM_CLOSE 메시지로 가깝게하려고 노력할 것이다. – Thierry

2

내가 그것을 알아 냈어!

나는 그게 그렇게 간단하다고 믿을 수 없다! 내가해야 할 일이있을 때마다 시간을 보냈다. session.CustomActionData["APPLICATIONFOLDER"]session["APPLICATIONFOLDER"]으로 변경했다.

원래 세션 변수를 사용하기 시작했지만 다양한 문제가 발생하여 CustomActionData을 사용했지만 결국 사용자 지정 작업이 지연되었습니다.

그래서 Wix가 올바로 수신되면 CustomAction에서 CustomActionData을 사용해야하고 즉시 CustomAction에서 세션의 변수를 사용해야합니다.

그래서 당신의 사용자 지정 작업 코드는 다음과 같아야합니다

string applicationFolder = session["APPLICATIONFOLDER"]; 

대신

이 다른 사람이 도움이
string applicationFolder = session.CustomActionData["APPLICATIONFOLDER"]; 

희망!