Prüfen ob Prozess läuft

  • C++/CLI

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Derfuhr.

    Prüfen ob Prozess läuft

    Hi.

    Ich suche schon eine Ewigkeit nach einer funktionierenden Möglichkeit einen Prozess abzufragen.
    In VB.net ist es ja recht einfach, aber in C++ beendet sich mein Programm immer, egal ob bsp. Notepad offen ist oder nicht.
    Code:

    C-Quellcode

    1. #define PROCESS "notepad.exe"
    2. PROCESSENTRY32 pe;
    3. if (strstr((char*)pe.szExeFile, (char*)PROCESS) != NULL){
    4. }
    5. else{
    6. PostQuitMessage(0);
    7. return 0;
    8. }


    Warum beendet sich mein Programm jedes mal beim Start, obwohl Notepad offen ist?
    Das ist nur einer von mehreren Sachen die ich probiert habe, doch jedes mal das selbe.
    Ich hoffe jemand kennt sich aus =)
    MFg. TGS

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Processe() As Process = Process.GetProcessesByName(ComboBox1.Text)
    3. If Processe.Length > 0 Then
    4. MsgBox("Excel läuft bereits!")
    5. Else
    6. MsgBox("Excel noch nicht gestartet.")
    7. End If
    8. End Sub
    9. private void Button1_Click(object sender, EventArgs e) {
    10. Process[] Processe = Process.GetProcessesByName(ComboBox1.Text);
    11. if ((Processe.Length > 0)) {
    12. MsgBox("Excel läuft bereits!");
    13. }
    14. else {
    15. MsgBox("Excel noch nicht gestartet.");
    16. }
    17. }
    Hier ein Snippet mit dem du das machen kannst.

    Original-Code von:
    stackoverflow.com/questions/41…ame-from-process-id-win32

    C-Quellcode

    1. //Quelle: http://stackoverflow.com/questions/4102569/get-process-name-from-process-id-win32
    2. #include "stdafx.h"
    3. #include <windows.h>
    4. #include <stdio.h>
    5. #include <tchar.h>
    6. #include <iostream>
    7. #include <string.h>
    8. #include <mbstring.h>
    9. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
    10. #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
    11. typedef enum _SYSTEM_INFORMATION_CLASS
    12. {
    13. SystemProcessInformation = 5
    14. }
    15. SYSTEM_INFORMATION_CLASS;
    16. typedef struct _UNICODE_STRING
    17. {
    18. USHORT Length;
    19. USHORT MaximumLength;
    20. PWSTR Buffer;
    21. } UNICODE_STRING;
    22. typedef LONG KPRIORITY; // Thread priority
    23. typedef struct _SYSTEM_PROCESS_INFORMATION_DETAILD
    24. {
    25. ULONG NextEntryOffset;
    26. ULONG NumberOfThreads;
    27. LARGE_INTEGER SpareLi1;
    28. LARGE_INTEGER SpareLi2;
    29. LARGE_INTEGER SpareLi3;
    30. LARGE_INTEGER CreateTime;
    31. LARGE_INTEGER UserTime;
    32. LARGE_INTEGER KernelTime;
    33. UNICODE_STRING ImageName;
    34. KPRIORITY BasePriority;
    35. HANDLE UniqueProcessId;
    36. ULONG InheritedFromUniqueProcessId;
    37. ULONG HandleCount;
    38. BYTE Reserved4[4];
    39. PVOID Reserved5[11];
    40. SIZE_T PeakPagefileUsage;
    41. SIZE_T PrivatePageCount;
    42. LARGE_INTEGER Reserved6[6];
    43. }
    44. SYSTEM_PROCESS_INFORMATION_DETAILD, *PSYSTEM_PROCESS_INFORMATION_DETAILD;
    45. typedef NTSTATUS(WINAPI *PFN_NT_QUERY_SYSTEM_INFORMATION)(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    46. IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT OPTIONAL PULONG ReturnLength);
    47. BOOLEAN IsProcessRunning(TCHAR* exe_name)
    48. {
    49. size_t bufferSize = 102400;
    50. PSYSTEM_PROCESS_INFORMATION_DETAILD pspid = (PSYSTEM_PROCESS_INFORMATION_DETAILD)malloc(bufferSize);
    51. ULONG ReturnLength;
    52. PFN_NT_QUERY_SYSTEM_INFORMATION pfnNtQuerySystemInformation = (PFN_NT_QUERY_SYSTEM_INFORMATION)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQuerySystemInformation");
    53. NTSTATUS status;
    54. TCHAR* name;
    55. while (TRUE)
    56. {
    57. status = pfnNtQuerySystemInformation(SystemProcessInformation, (PVOID)pspid, bufferSize, &ReturnLength);
    58. if (status == STATUS_SUCCESS)
    59. break;
    60. else if (status != STATUS_INFO_LENGTH_MISMATCH)
    61. { // 0xC0000004L
    62. _tprintf(_T("ERROR 0x%X\n"), status);
    63. return 1; // error
    64. }
    65. bufferSize *= 2;
    66. pspid = (PSYSTEM_PROCESS_INFORMATION_DETAILD)realloc((PVOID)pspid, bufferSize);
    67. }
    68. for (;; pspid = (PSYSTEM_PROCESS_INFORMATION_DETAILD)(pspid->NextEntryOffset + (PBYTE)pspid))
    69. {
    70. name = (pspid->ImageName.Length && pspid->ImageName.Buffer) ? pspid->ImageName.Buffer : L"";
    71. //_tprintf(_T("P-Id: %d, P-Name: %ls\n"), pspid->UniqueProcessId, name);
    72. int result = wcscmp(exe_name, name);
    73. if (result == 0)
    74. {
    75. return TRUE;
    76. }
    77. if (pspid->NextEntryOffset == 0) break;
    78. }
    79. return FALSE;
    80. }
    81. int _tmain(int argc, _TCHAR* argv[])
    82. {
    83. if (IsProcessRunning(_T("notepad.exe")))
    84. {
    85. _tprintf(_T("Prozess gefunden"));
    86. }
    87. else
    88. {
    89. _tprintf(_T("Prozess nicht gefunden"));
    90. }
    91. int exit;
    92. std::cin >> exit;
    93. return 0;
    94. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Derfuhr“ ()