저는 비슷한 질문을했지만 이전에는 아직 내 문제의 해결책을 찾을 수 없었습니다.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.
시도해 보겠습니다. .exit 파일을 만드는 이유는 내 응용 프로그램을 닫는 것입니다. 왜냐하면 WM_CLOSE 메시지가 나를 위해 작동하지 않는 것처럼 보이고 CloseApp도 작동하지 않기 때문입니다. 나는 이것이 잘 풀릴 수있는 빠르고 쉬운 해결책이라고 생각 했으므로 나는 그걸로 갈 것이라고 생각했다. 어쨌든, 나는 당신의 제안을 시도하고 되돌릴 것입니다. 감사. – Thierry
트레이 응용 프로그램이 닫을 때 멋지게 반응하지 않으면 코드가 너 또는 회사 일 때 고칠 수 있습니다. 그러면 코드를 고치면 고치기 만하면 더 빨리 해결할 수 있습니다. – PhilDW
나는 동의하지만이 시스템 트레이 응용 프로그램은 많은 클라이언트에 의해 사용되지 않으며 옵션이며 우선 순위가 매우 낮습니다. 나는 그것을 더 자주 사용하게 될 것이므로 그것을 포함하려고 노력하고 있지만 그것은 불행히도 나의 우선 순위를 바꾸지 않을 것이다. 결국 나는 그것을 조사하여 적절한 WM_CLOSE 메시지로 가깝게하려고 노력할 것이다. – Thierry