2016-05-23 4 views
0

MyApp.exeは、InstallScript 2014プロジェクトを使用してインストールされます。製造業の人々は最近、より最近の開発版にアップグレードしようとしましたが、MyAppの既存のインスタンスを閉じることはできませんでした。これは、アプリケーションによって使用されているさまざまなdllがロックされて使用されているため、多くの権限拒否エラーが発生しました。アップグレード中にInstallScriptがアプリケーションを検出しましたか?

私は、InstallScript実行可能ファイルが、すべてのWindowsユーザーが親しみやすい通常の「ステージと再起動」を行うことを期待していました。それはそうしなかったし、InstallShieldプロジェクトエディタでは、明らかにその動作を強制することはできません。

また、私のアプリがすでに実行中であることを何とか検出できるようにInstallScriptが期待しています。これを行うことができれば、アプリケーションを終了して続行するダイアログを表示できます。このための唯一の解決策は、(これは別のS/O questionに未回答であることに注意してください。)適切に私自身を含め、実行中のタスクのすべてを検出しない

InstallSite.org List and Shutdown Running Processes.です。

InstallScriptの明らかに欠けている機能を修正するために2,3日を費やす前に、よりよいアプローチがあるかどうか尋ねると思いました。

答えて

0

これは私が思いついたものです。お役に立てれば。

// 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; 

あなたはそれ

if (IsProcessRunning("WORD.EXE")) then 
    blah blah 
endif; 
を呼び出します
関連する問題