• 締切済み

重複起動の抑止

お世話になっています。 Visual Basic.Netにて開発を行っております。 アプリケーションの重複起動を抑止するため、下記のようなコードを作成しました。 '自アプリプロセス名取得 Dim strProcName As String = System.Diagnostics.Process.GetCurrentProcess.ProcessName 'プロセスコンポーネントにリソースを関連付け procName = System.Diagnostics.Process.GetProcessesByName(strProcName) If UBound(procName) > 0 Then '重複起動 End If 上記コードにて重複起動チェックが行えていたのですが、 急に自アプリのプロセス名の取得時にエラーが発生するようになってしまいました。 (1行目で文字列を直接渡した場合、2行目で同様のエラーが発生します) エラーが発生する直前に行っていたことからエラー要因の確定ができると思うのですが、 今回は、まったく思い当たる節がございません。 エラー内容を見るとマシンの設定が変更されてしまっているようにも見えるのですが、 どこの設定値を変更すればよいのかご存知の方、または 他の重複起動チェックをご存知の方がいらっしゃいましたら、 申し訳ないのですがご教授頂けないでしょうか? Message "プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。" StackTrace at System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) at System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName, Boolean isRemoteMachine) at System.Diagnostics.ProcessManager.GetProcessInfos(String machineName) at System.Diagnostics.Process.EnsureState(State state) at System.Diagnostics.Process.get_ProcessName() at Sample.Sample.Main() in *** Windows 2000 Pro SP3

noname#202420
noname#202420

みんなの回答

回答No.1

申し訳ありません。 2行目は Dim procName() As Process = System.Diagnostics.Process.GetProcessesByName(strProcName) の間違えです。 大変、失礼を致しました。

noname#202420
質問者

補足

自己レス レジストリの下記キーを変更することでエラーが発生しなくなりました。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance Disable Performance Counters = 0 また、重複起動のチェック方法にMutexクラスを使用する方法もあります。 (私はこちらにのりかえました)

関連するQ&A

  • デバッグ時と実行時の識別はできますか?

     多重起動の防止のため、WEBページを参考にしてメインFormのLoad時に、下記のコードで2個目以降起動しないようにしています。 '2重起動の防止 Dim pn As String = Process.GetCurrentProcess.ProcessName If Process.GetProcessesByName(pn).GetUpperBound(0) > 0 Then   MessageBox.Show("すでに起動しています")   Me.Close()   Exit Sub End If  これはうまく行くのですが、デバッグ実行のときに時々起動しないことがあります。 EXEでの実行時にこのようなことはないので、デバッグ時のみこの部分を機能しないようと思っています。 参照可能な内部変数などご存知ないでしょうか。

  • 起動したIEのウインドウタイトルを取得する方法

    こんばんは。WindowsXP+VB.NET環境です。 IE = CreateObject("InternetExplorer.Application") IE.Navigate("http://www.yahoo.co.jp") でインターネットエクスプローラを起動した場合に IEのウインドウの上の部分に表示されている 「Yahoo! JAPAN - Microsoft Internet Explorer」という文字と プロセスIDとプロセス名を取得したいのですが どのようなコードを書けば良いでしょうか? WEBサイトで調べていたら起動中の全プロセスのものを全て表示する 方法はあったのですが、起動したIE限定で取得したいです。 IE.IdとかIE.ProcessName、IE.MainWindowTitleのようにしてみたのですが エラーになってしまいました。 あと、別の方法で Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start("iexplore") hProcess.WaitForInputIdle() Dim pName As String = hProcess.MainWindowTitle としたら出来るようになったのですが、 起動した後に上の方法でやった時のようにIE.Navigate("http://****")で 移動したりしたいのですが、この方法で起動した場合の 方法が分からなくなってしまいました。 IE = CreateObject("InternetExplorer.Application")で起動したIEのように 操作できるようにする方法を教えて頂きたいです。よろしくお願い致します。

  • Process.Startで起動したアプリを最大化したいです。VB.NET

    こんにちは、お世話になっております。 下記のようなコードでアプリケーションを起動して ウィンドウを最大化したいのですが、 どのようにしたら良いでしょうか。 3行目のように大きさを画面いっぱいに設定する方法は 出来たのですが、最大化の方法がわかりません。 申し訳ありませんが、教えて頂きたくお願いいたします。 Dim p As System.Diagnostics.Process p = System.Diagnostics.Process.Start("***") MoveWindow(p.MainWindowHandle, 0, 0, 1024, 768, 1)

  • processコンポーネントの使用方法

    VB.NET2003/1.1FrameWork 現在MSDNライブラリ(プロセスが応答しているかどうかを確認する)を実際に動作させてみようと思っていますが、波線が2箇所にでて困っています。 ご存知の型がいればご教授下さい。 http://msdn2.microsoft.com/ja-jp/library/aykwfbdh(VS.80).aspx 手順:破線部は「」でくくりました 1、フォームにButton1を作成 2、processコンポーネントをForm1に貼付け(process1) 3、Button1_Click(...) ~ 内に以下を記述 Dim myProcesses() As 「process」 myProcesses = 「Process.GetProcessesByName」("notepad.exe") If myProcesses(0).Responding Then myProcesses(0).CloseMainWindow() Else myProcesses(0).Kill() End If ?? 一つ目が"型が必要です。" 二つ目が"'Process.GetProcessesByName'は'プロセス'のメンバーではありません" process を System.Diagnostics.process に変えると波線はでなくなりますが、違うような気がするのです。 メモ帳(notepad.exe)を起動している状態で本プログラムを実行すればmyProcesses(0)に値が入ると想像しているのですが、length=0となり「インデックスが配列の境界外です」とエラーになります。 根本的な事で申し訳ありませんが、よろしくお願いいたします。

  • C#で別プロセスを起動

    C#で開発をしています。 デバックモードで別プロセスを起動したいのですが可能でしょうか? System.Diagnostics.Process.Startを使うと別のexeを起動することは できるようですが、デバックモードで呼び出すにはどうしたらいいのでしょうか? 教えてください。 よろしくお願いします。

  • InternetExplolerで開いているページ

    C++で、 (1)IEのプロセスを全て取得する。 (2)そのIEの各タブで、「任意のドメインの含むページ(例えばhttps://www.google.co.jp)」を開いているかをチェックする ということを、「ActiveXを使わずに」行いたいです。 System.Diagnostics に属するProcessクラスで、 Process.GetProcessesByName でプロセスの配列を掴むことはできるようなのですが、 このプロセスを、「GetURL」のようなインタフェースを持ったクラスのインスタンスとして、 代入して、表示しているページのアドレスを取得したいのです。 ブラウザの操作を行うには、 System.Windows.Forms.WebBrowser というクラスを使うのが良さそうだというのまでは調べてわかったのですが、 Process のインスタンスを、WebBrowser のインスタンスに代入するには、 どうすればよいのでしょうか?

  • ウィンドウを最前面にできません

    VB.NETでSetForegroundWindowでウインドウを最前面に出来ないため、AllowSetForegroundWindowを使用するようにしましたが、解決できません。 コードは大体次のようになっています。 Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess() AllowSetForegroundWindow(hProcess.Id) Dim hWnd As IntPtr = FindWindow("XXX", "YYYYY") SetForegroundWindow(hWnd) 環境は次のとおりです。  OS: Windows 7 Pro. 64bit SP1  VB.NET: 2010 Express 解決方法をご教示頂きたく、よろしくお願いします。

  • vb.net2003で困っています。

    vb.net2003で困っています。 プログラムの二重起動をチェックするため、process.getprocessesbynameを使用し実行すると プログラムがprocess.getprocessesbynameのところで固まります。 (CPUの使用率が100%になっていました。) イベントビューアを確認すると、プログラムを強制終了した時刻にperflibのエラー(イベントID 2002) が発生しています。 記述は色々なサイトで掲載されていたものを、そのままコピー&ペーストしてますのでおかしくないと思うのですが...。 同じような経験をされたかたはいませんでしょうか?

  • C#でiniファイルの書き込みがうまくいきません。

    C#初心者です。今回INIファイルを生成→書き込みを行うためのソースコードを書いたのですが、空ファイルの生成はうまくいくのにINIファイルへの書き込みがうまくいかず、空ファイルのままになってしまいます。なぜでしょうか? 以下ソースコード using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; namespace Loei_Server_ { /* ネットで公開されていたINIファイルに関するクラス。 難しいことは考えちゃアカン。 */ class IniFileHandler { [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName); [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA")] public static extern uint GetPrivateProfileStringByByteArray(string lpAppName, string lpKeyName, string lpDefault, byte[] lpReturnedString, uint nSize, string lpFileName); [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileInt(string lpAppName, string lpKeyName, int nDefault, string lpFileName); [DllImport("KERNEL32.DLL")] public static extern uint WritePrivateProfileString( string lpAppName, string lpKeyName, string lpString, string lpFileName); } class Program { static void Main(string[] args) { /* 日付を取得。 */ DateTime this_time = DateTime.Now; /* 多重起動するとマズイので多重起動していたら強制的に終了する。*/ if (System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1) { Console.WriteLine(" [Error] " + "[" + this_time.ToString() + "] Application already has started. This program is on the nature, you can not multi-boot."); return; } /* コンフィグデータの確認。なかったら勝手に生成する。 */ if (!File.Exists("Config.ini")) { Console.WriteLine(" [Warning] " + "[" + this_time.ToString() + "] Config.ini file could not be found. I created you."); /* 空のINIファイルを生成。 */ StreamWriter writer = new StreamWriter("Config.ini", true); /* 生成したINIファイルにいろいろ書き込む。 */ IniFileHandler.WritePrivateProfileString("Loei_Server_", "TCP_IP", "localhost", "Config.ini"); IniFileHandler.WritePrivateProfileString("Loei_Server_", "TCP_HOST", "25565", "Config.ini"); Console.WriteLine(" [Info] " + "[" + this_time.ToString() + "] It has generated an Config.ini file!"); }

  • C# 他のアプリケーションを優先度「高」で起動したい

    例えば、notepadを起動したいなら、以下のようにやればいいと思います。 System.Diagnostics.Process.Start("notepad.exe"); このnotepadを優先度「高」で起動させるにはどのようにすれば良いのでしょうか?

専門家に質問してみよう