2016-05-23 1 views
0

MyApp.exe est installé à l'aide d'un projet InstallScript 2014. Les gens de la fabrication ont récemment essayé de mettre à niveau vers une version de développement plus récente, mais n'ont pas fermé l'instance existante de MyApp. Cela a entraîné de nombreuses erreurs d'autorisation refusées puisque les différentes DLL utilisées par l'application étaient verrouillées et utilisées.InstallScript détecter l'application lors de la mise à niveau?

Je me attendais à l'exécutable InstallScript à faire l'habituel « étape et reboot » chose que tous les gens de Windows sont intimes avec. Il ne l'a pas fait, et je ne vois rien dans l'éditeur de projet InstallShield qui me permet de forcer ce comportement. Je m'attendais également à ce qu'InstallScript me permette de détecter que mon application était déjà en cours d'exécution. Si je peux le faire, je peux afficher une boîte de dialogue pour permettre à l'utilisateur de fermer l'application et de continuer. La seule solution pour cela est InstallSite.org List and Shutdown Running Processes. (Notez que ceci est sans réponse sur un autre S/O question.)

Cela ne détecte pas correctement toutes les tâches en cours, y compris la mienne.

Avant que je passe quelques jours à essayer de corriger ce qui semble être un je pensais que je serais caractéristique de InstallScript manifestement manquant, demandez s'il y a une meilleure approche.

Répondre

0

Voici ce que je suis venu avec. J'espère que cela t'aides.

// defines/protos for finding a process 
#define TH32CS_SNAPPROCESS 0x00000002 

// in Kernel32.dll 
prototype NUMBER Kernel32.CreateToolhelp32Snapshot(NUMBER , NUMBER); 
prototype BOOL  Kernel32.Process32First(HWND , POINTER); 
prototype BOOL  Kernel32.Process32Next(HWND , POINTER); 

// from minwindef.h, windows api 
typedef PROCESSENTRY32 
begin 
    number dwSize; 
    number cntUsage; 
    number th32ProcessID;   // this process 
    number th32DefaultHeapID; 
    number th32ModuleID;   // associated exe 
    number cntThreads; 
    number th32ParentProcessID; // this process's parent process 
    number pcPriClassBase;  // Base priority of process's threads 
    number dwFlags; 
    STRING szExeFile[MAX_PATH];  // Path 
end; 

// ======================================================================================== 
// list all of the running processes, see if Flex is running 
// based on https://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx 
// ======================================================================================== 
function BOOL IsProcessRunning(sProcessName) 
    HWND hProcessSnap; 
    PROCESSENTRY32 pe; 
    POINTER ppe; 
    NUMBER ret; 

begin 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    pe.dwSize = SizeOf(pe); 
    ppe = &pe; 

    ret = Process32First(hProcessSnap, ppe); 

    if (ret == 0) then 
     //printError(TEXT("Process32First")); // show cause of failure 
     CloseHandle(hProcessSnap);   // clean the snapshot object 
     return(FALSE); 
    endif; 

    repeat  
     if (StrCompare(sProcessName, pe.szExeFile) == 0) then 
      CloseHandle(hProcessSnap);   // clean the snapshot object 
      return(TRUE); 
     endif; 
     ret = Process32Next(hProcessSnap, ppe); 
    until (ret == 0); 

    return(FALSE); 
end; 

Vous appelez alors il

if (IsProcessRunning("WORD.EXE")) then 
    blah blah 
endif;