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

この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での実行時にこのようなことはないので、デバッグ時のみこの部分を機能しないようと思っています。 参照可能な内部変数などご存知ないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#111860
noname#111860
回答No.1

よく使う手法としましては、 「プロジェクト」-[Project1 のプロパティ] で、「実行可能ファイルの作成」のところにある。 「条件付コンパイル引数」に値を設定しておきます。 使い方は、こちらを参考。 http://msdn.microsoft.com/ja-jp/library/x435tkbk(VS.80).aspx

o_jiji
質問者

お礼

すばやい回答ありがとうございます。  下記のコードで期待どおりの動作を確認しました。 思っていたことがそのまま出来たので拍子抜けするくらいです。 #If DEBUG Then   MessageBox.Show("デバッグモードです") #Else   '2重起動の防止   Dim pn As String = Process.GetCurrentProcess.ProcessName   If Process.GetProcessesByName(pn).GetUpperBound(0) > 0 Then     MessageBox.Show("すでに起動しています")     Me.Close()     Exit Sub   End If #End If  オプションチェックボックスのDEBUGをデフォルトのチェックしないままでよかったです。(そうでないと、実行時もDEBUGモードと識別される)  ところで、マイクロソフトのドキュメントページは正確なのですが理解できてない人が読むと、混乱しそうですね。(判っている人がリファレンスとして利用するにはよいのですが・・・)

その他の回答 (1)

noname#111860
noname#111860
回答No.2

>下記のコードで期待どおりの動作を確認しました。  確認できて何よりです。 > ところで、マイクロソフトのドキュメントページは正確なのですが理解できてない人が読むと、混乱しそうですね。 失礼いたしました。 このあたりは、質問内容で使用されている語句から、 経験者であると思い込み、 マイクロソフトのHPを紹介してしまいました。 この点は今後の回答方法にも参考にさせていただきたいと思います。 ご指摘ありがとうございます。

関連するQ&A

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

     現在、2重起動防止のため下記のようなコードにしています。 Delphiではデバッグ実行時のフォームも2重起動の対象となるため、開発環境があるときは、2重起動のチェックをしないようにしてあります。  これでうまく行くのですが、何だか野暮ったい気がします。 こう少しスマートな解決策はないでしょうか? program Sample; uses  Forms,  Windows, Dialogs,  uFrmSample in 'uFrmSample.pas' {frmSample}; {$R *.res} var  MainWnd: THandle; begin  {Delphi開発環境の存在をチェックする}  MainWnd := FindWindow(nil, 'delphi 6');  if MainWnd = 0 then begin   {間発環境が実行中でなければ2重起動をチェックする}   MainWnd := FindWindow('TFrmSample', nil);   if MainWnd <> 0 then begin    ShowMessage('既に起動しています');    SetForegroundWindow(MainWnd);    Exit;   end;  end;  Application.Initialize;  Application.CreateForm(TfrmSample, frmSample);  Application.Run; end. 以上、よろしくおねがいします。

  • 子プロセスのデバッグ方法について

    VisualStudio2008のVCでデバッグをしています。 Win32のCreateProcess関数で"自分自身"のEXEファイルを実行すると、新プロセスが起動するのですがデバッグができません。 CreateProcessの呼び出し側プロセスと、同じプログラムである新プロセスを同時にデバッグすることはできないものでしょうか。

  • Windowsフォームを思通りにデバッグできない

    こんにちは。Visual Studio 2012を勉強しようとしていますが、さっそくつまずきました。 言語はC#で、Windowsフォームを作成しました。 WindowsフォームでForm1というフォームを作成。 F5のデバッグの開始で正しく実行されました。 次にソリューションエクスプローラーから追加で、Windowsフォームを追加しました。このフォームの名前をForm2にしました。 これでF5のデバッグの開始をクリックしたら、Form1が起動してきました・・・ Form2でデバッグの開始を行いたいのですが、どのように実行すればよいでしょうか?

  • デバッグ終了後、再度デバッグ動作できない

    簡単な電卓のプログラムを組んで、ビルド後デバッグして、一旦デバッグ終了のためにフォームの右上の×ボタンで終了し、再度デバッグ動作を実行するとデバッグに入れなくなります。 一旦Code Gear C++ Builder 2009を終了使用とすると、”デバッグを終了しますか?”というメッセージボックスが出てきます。 そのままIDEの終了動作を行うと”デバッグプロセスを初期化できません のプロセスを終了する際にデバッガで致命的なエラーが発生しました。作業中のファイルを保存し CodeGear C++ Builderを再起動してください。” このようなメッセージボックスが出てきて強制終了してから起動しないかぎり再度デバッグ動作ができないのですが、解決方法ご存じの方いらっしゃいませんでしょうか? 現在使用しているのはCode Gear C++ Builder 2009 です。

  • 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となり「インデックスが配列の境界外です」とエラーになります。 根本的な事で申し訳ありませんが、よろしくお願いいたします。

  • VBA実行時のエラー

    下記のプログラムは私が作った物では無いのですが、作った方と連絡をとる事が出来なくなってしまった為、質問させて頂きます。 このプログラムをシートから実行した所 エラー:400『既にフォームは表示されています。モーダルにできません。』 なるものが表示されてしまいます。 またコードを記述する所から実行しますと 実行時エラー:1004『アプリケーション定義またはオブジェクト定義のエラー』 となってしまいます。 私の努力が足りないのは重々承知ですが、解決する事が出来ません。 皆様のお力を借りることが出来たらと思い投稿しました。 宜しくお願い致します。 Sub syoutotumen() Dim i As Long Dim j As Long Dim k As Long Dim kyori As Long Dim n As Integer n = 1 i = 1 j = 1 k = 1 Const cnsYEN = "\" Dim xlAPP As Application Dim objWBK As Workbook Dim strPATHNAME As String Dim strFILENAME As String strPATHNAME = "C:\Documents and Settings\tata41\デスクトップ\画像処理\" If strPATHNAME = "" Then Exit Sub strFILENAME = Dir(strPATHNAME & "dem******", vbNormal) If strFILENAME = "" Then MsgBox "このフォルダにはExcelワークブックは存在しません" Exit Sub End If Set xlAPP = Application With xlAPP .ScreenUpdating = False .EnableEvents = Fales .EnableCancelKey = xlErrorHandler .Cursor = xlWait End With Set WS1 = Worksheets("sheet1") Range("A1") = "0" Range("A2") = "1" Range("A1:A2").Select Selection.AutoFill Destinaton:=Range("A1:A512") Do While strFILENAME <> "" DoEvents If swESC = True Then If MsgBox("ESCが押されました。ここで終了しますか?", vbInformation + vbYesNo) = vbYes Then GoTo Button1_Click_Exit Else swESC = False End If End If xlAPP.StatusBar = trFILENAME & "処理中..." Set objWBK = Workbooks.Open(Filename:=strPATHNAME & cnsYEN & strFILENAME, UpdateLinks:=False, ReadOnly:=True) Do If Cells(i, 2) = 255 Then Exit Do i = i + 1 Loop Do If Cells(j, 3) = 255 Then Exit Do j = j + 1 Loop Do If Cells(k, 4) = 255 Then Exit Do k = k + 1 Loop kyori = (i + j + k - 21) / 3 WS1.Cells(n, 2) = kyori n = n + 1 i = 1 j = 1 k = 1 objWBK.Close savechanges:=False strFILENAME = Dir Loop GoTo Button1_Click_Exit Button1_Click_ESC: If Err.Number = 18 Then swESC = True Resume ElseIf Err.Number = 1004 Then Resume Next Else MsgBox Err.Description End If Button1_Click_Exit: With xlAPP .StatusBar = False .ScreenUpdating = True .EnableEvents = True .EnableCancelKey = xlInterrupt .Cursur = xlDefault Set objWBK = Nothing Set xlAPP = Nothing End With End Sub

  • ls | sort を実行するプログラム

    以下のプログラムはls | sortを実行するプログラムなのですが、出力が2回ずつ出てしまい困っております。以下に実行結果も載せましたので参照ください。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> main(int argc,char **argv){ int a[2],b[2]; int cint,status; char n; pid_t pid1,pid2; if(pipe(a)==-1){ perror("pipe"); exit(EXIT_FAILURE); } if(pipe(b)==-1){ perror("pipe"); exit(EXIT_FAILURE); } if((pid1 = fork())==-1){ perror("fork"); exit(EXIT_FAILURE); } if((pid2 = fork())==-1){ perror("fork"); exit(EXIT_FAILURE); } //子1 else if(pid1==0){ close(a[0]); close(b[0]); close(b[1]); dup2(a[1],1); close(a[1]); execlp(argv[1],argv[1],(char *)0); } //子2 else if(pid2==0){ close(a[1]); close(b[0]); dup2(a[0],0); dup2(b[1],1); close(a[0]); close(b[1]); execlp(argv[2],argv[2],(char *)0); } //親 else { close(a[0]); close(a[1]); close(b[1]); wait(&status); while((read(b[0],&n,1))==1){ putchar(n); } close(a[0]); } exit(EXIT_SUCCESS); } /*実行結果 $ ./pipesort ls sort 2^31-1.c~ 2^31-1.c~ a*b.c~ a*b.c~ a-z.c a-z.c a-z.c~ a-z.c~ a-z1.c a-z1.c a-z1.c~ a-z1.c~ a.c a.c a.c~ a.c~ a.out a.out a.sp~ a.sp~ a10 a10 */ というように同じファイル名が二度ずつ出力されるのです。これを出力は一度ずつにしたいのですがどのようにすればよいですか?

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • 実行時エラー49 DLLが正しく呼び出せません。

    アクセス2010です。 今まで問題なく動いてたファイルなのですが Call マクロ1(str1, str2) Sub マクロ1(str1, str2) If ○○ Then If Form_F_Form.ck_OK.Value = 0 Then Exit Sub End If と言うところのExit Subで 実行時エラー49 DLLが正しく呼び出せません。 となります。 これはファイルが壊れているのでしょうか?

  • 実行速度に差があります

    画面に線を引くプログラムですが、実行する時により、線が引かれるスピードが違います。 パソコンを起動直後などは、結構早く動くのですが、デバッグ後は遅くなります。再起動後は、デバッグ前のように結構早く動きます。 何か対策はありませんでしょうか

専門家に質問してみよう