2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// CustomAction.cpp : Defines the entry point for the custom action.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "pch.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <strutil.h> 
  
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <shellapi.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								UINT  __stdcall  CustomActionHello (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    __in  MSIHANDLE  hInstall 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HRESULT  hr  =  S_OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DWORD  er  =  ERROR_SUCCESS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    hr  =  WcaInitialize ( hInstall ,  " CustomActionHello " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ExitOnFailure ( hr ,  " Failed to initialize " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    WcaLog ( LOGMSG_STANDARD ,  " Initialized. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // TODO: Add your custom action code here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    WcaLog ( LOGMSG_STANDARD ,  " ================= Example CustomAction Hello " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LExit :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    er  =  SUCCEEDED ( hr )  ?  ERROR_SUCCESS  :  ERROR_INSTALL_FAILURE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  WcaFinalize ( er ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								UINT  __stdcall  RemoveInstallFolder (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    __in  MSIHANDLE  hInstall 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HRESULT  hr  =  S_OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DWORD  er  =  ERROR_SUCCESS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  nResult  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    LPWSTR  installFolder  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LPWSTR  pwz  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LPWSTR  pwzData  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    hr  =  WcaInitialize ( hInstall ,  " RemoveInstallFolder " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ExitOnFailure ( hr ,  " Failed to initialize " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    hr  =  WcaGetProperty ( L " CustomActionData " ,  & pwzData ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ExitOnFailure ( hr ,  " failed to get CustomActionData " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pwz  =  pwzData ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    hr  =  WcaReadStringFromCaData ( & pwz ,  & installFolder ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ExitOnFailure ( hr ,  " failed to read database key from custom action data: %ls " ,  pwz ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SHFILEOPSTRUCTW  fileOp ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ZeroMemory ( & fileOp ,  sizeof ( SHFILEOPSTRUCT ) ) ;  
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fileOp . wFunc  =  FO_DELETE ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    fileOp . pFrom  =  installFolder ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    fileOp . fFlags  =  FOF_NOCONFIRMATION  |  FOF_SILENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    nResult  =  SHFileOperation ( & fileOp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( nResult  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        WcaLog ( LOGMSG_STANDARD ,  " The directory  \" %ls \"  has been deleted. " ,  installFolder ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        WcaLog ( LOGMSG_STANDARD ,  " The directory  \" %ls \"  has not been deleted, error code: 0X%02X. Please refer to https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shfileoperationa for the error codes. " ,  installFolder ,  nResult ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LExit :  
						 
					
						
							
								
									
										
										
										
											2024-04-06 16:30:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ReleaseStr ( installFolder ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 14:27:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    er  =  SUCCEEDED ( hr )  ?  ERROR_SUCCESS  :  ERROR_INSTALL_FAILURE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  WcaFinalize ( er ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}