Programm stürzt bei zweiten Funktionsaufruf ab

Von: , Frage gestellt am Mo, 18. Jan 2010

Hallo,

Ich habe eine mir zwei Funktion zusammengesucht, leider eine dieser 2 beim zweiten Aufruf löst Windows eine Haltepunkt aus, was beim starten ohne Debugger das bekannte "Problembericht senden" Fenster anzeigen lässt.
Der Code der ersten Funktion:

int GetProcess(Prozess *Prozesse, int Max)
{
PROCESSENTRY32 pe32 = { 0 }; 
HANDLE hSnapshot    = NULL; 
HINSTANCE hDll = LoadLibrary("kernel32.dll"); 
pProcess32First=(TH32_PROCESS)GetProcAddress(hDll,"Process32First"); 
pProcess32Next=(TH32_PROCESS)GetProcAddress(hDll,"Process32Next"); 
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
int proc_cnt=0,thrd_cnt=0; 
if(Max == 0)
{         
if (hSnapshot != (HANDLE) -1) 
{ 
pe32.dwSize = sizeof (PROCESSENTRY32); 
if (pProcess32First (hSnapshot, &pe32)) 
{ 
do 
{ 
proc_cnt++;
} 
while(pProcess32Next (hSnapshot, &pe32)); 
} 
CloseHandle (hSnapshot);  
}
return proc_cnt;
}
else
{              
if (hSnapshot != (HANDLE) -1) 
{ 
pe32.dwSize = sizeof (PROCESSENTRY32); 
int proc_cnt=0,thrd_cnt=0; 
if (pProcess32First (hSnapshot, &pe32)) 
{ 
do 
{ 
proc_cnt++;
sprintf(Prozesse[proc_cnt].Name, "%s\0", pe32.szExeFile);
Prozesse[proc_cnt].Process = ::OpenProcess(PROCESS_TERMINATE, 0, pe32.th32ProcessID);
Prozesse[proc_cnt].ID = proc_cnt;
Prozesse[proc_cnt].LengthName = strlen(Prozesse[proc_cnt].Name);
cout<<pe32.szExeFile<<endl;
} 
while(pProcess32Next (hSnapshot, &pe32)); 
} 
CloseHandle (hSnapshot);  
}
return 0;
}
}

und die Zweite:
bool SendProcess(int socket)
{
Prozess *Prozesse=0;
int size=0;
int rec=0;
void *Buffer=malloc(sizeof(int));
int Anzahl = GetProcess(NULL, 0);
int buf=0;
char *cBuffer=(char*)malloc(sizeof(char)*256);
if(Anzahl > 0)
{
size = Anzahl*sizeof(Prozess);
cout << size << "\n" << Anzahl << "\n";
Prozesse = (Prozess*)malloc(size);
}
send(socket, (char*)&size, sizeof(int), 0);
rec = recv(socket, (char*)Buffer, sizeof(int), 0);
memcpy(&buf, Buffer, sizeof(int));
if(rec <= SOCKET_ERROR || buf != 1)
{
return false;
}
else
{
GetProcess(Prozesse, Anzahl);
for(int i=0; i<=Anzahl; i++)
{
cout << Prozesse[i].Name << endl;
sprintf(cBuffer, "%s\0", Prozesse[i].Name);
send(socket, cBuffer, sizeof(char)*256, 0);
cout << "senden\n";
ZeroMemory(Buffer, sizeof(int));
rec = recv(socket, (char*)Buffer, sizeof(int), 0);
memcpy(&buf, Buffer, sizeof(int));
cout << buf << "\n";
if(rec <= SOCKET_ERROR || buf != 1)
{
return false;
}
}
Prozesse = NULL;
cBuffer  = NULL;
Buffer   = NULL;
return true;
}
}


Hoffe mir kann jemand helfen, den ich kapiert nicht was da nicht funktioniert.

Gruß Michael

1 Antworten zu dieser Frage

  1. Antwort von nach 2 Stunden 0 hilfreich
    Re: Teil eins gelöst

    Hallo,

    Hab jetzt gelöst das es nicht mehr abstürzt, nutze jetzt statt malloc new und delete, jetzt hab ich das Problem das wenn ich die Funktion 2 nochmal aufrufe kommen nur 2 Symbole raus, bei der ersten Funktion zeigt er mit das pe32.szExeFile, aber das Prozesse.Name wird nicht beschrieben, warum?

    Nochmal der aktueller Code:
    Hab die Variable Prozesse als Global Variable erstellt.

    int GetProcess(int Max)
    {
    PROCESSENTRY32 pe32 = { 0 }; 
    HANDLE hSnapshot    = NULL; 
    pProcess32First=0;
    pProcess32Next=0;
    HINSTANCE hDll = LoadLibrary("kernel32.dll"); 
    pProcess32First=(TH32_PROCESS)GetProcAddress(hDll,"Process32First"); 
    pProcess32Next=(TH32_PROCESS)GetProcAddress(hDll,"Process32Next"); 
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    int proc_cnt=0,thrd_cnt=0; 
    if(Max == 0)
    {         
    if (hSnapshot != (HANDLE) -1) 
    { 
    pe32.dwSize = sizeof (PROCESSENTRY32); 
    if (pProcess32First (hSnapshot, &pe32)) 
    { 
    do 
    { 
    proc_cnt++;
    } 
    while(pProcess32Next (hSnapshot, &pe32)); 
    } 
    CloseHandle (hSnapshot);  
    }
    return proc_cnt-2;
    }
    else
    {              
    if (hSnapshot != (HANDLE) -1) 
    { 
    pe32.dwSize = sizeof (PROCESSENTRY32); 
    int proc_cnt=0,thrd_cnt=0; 
    if (pProcess32First (hSnapshot, &pe32)) 
    { 
    do 
    { 
    sprintf(Prozesse[proc_cnt].Name, "%s\0", pe32.szExeFile);
    Prozesse[proc_cnt].Process = ::OpenProcess(PROCESS_TERMINATE, 0, pe32.th32ProcessID);
    Prozesse[proc_cnt].ID = proc_cnt;
    Prozesse[proc_cnt].LengthName = strlen(Prozesse[proc_cnt].Name);
    //cout<<pe32.szExeFile<<endl;
    proc_cnt++;
    } 
    while(pProcess32Next (hSnapshot, &pe32)); 
    } 
    CloseHandle (hSnapshot);  
    }
    return 0;
    }
    }
    bool SendProcess(int socket, int *Anz)
    {
    //Prozesse=NULL;
    int size=0;
    int rec=0;
    void *Buffer=new int [sizeof(int)];
    int Anzahl = GetProcess(0);
    int buf=0;
    char *cBuffer=new char [256];
    if(Anzahl > 0)
    {
    size = Anzahl*sizeof(Prozess);
    *Anz=Anzahl;
    cout << size << "\n" << Anzahl << "\n";
    Prozesse = new Prozess [size];
    }
    send(socket, (char*)&size, sizeof(int), 0);
    rec = recv(socket, (char*)Buffer, sizeof(int), 0);
    memcpy(&buf, Buffer, sizeof(int));
    if(rec <= SOCKET_ERROR || buf != 1)
    {
    return false;
    }
    else
    {
    GetProcess(Anzahl);
    for(int i=0; i<=Anzahl; i++)
    {
    cout << Prozesse[i].Name << endl;
    sprintf(cBuffer, "%s\t\t\t%d\0", Prozesse[i].Name, Prozesse[i].ID);
    send(socket, cBuffer, sizeof(char)*256, 0);
    cout << "senden     ";
    ZeroMemory(Buffer, sizeof(int));
    rec = recv(socket, (char*)Buffer, sizeof(int), 0);
    memcpy(&buf, Buffer, sizeof(int));
    cout << buf << "\n";
    if(rec <= SOCKET_ERROR || buf != 1)
    {
    return false;
    }
    }
    delete [] cBuffer;
    delete [] Buffer;
    cBuffer = NULL;
    Buffer = NULL;
    return true;
    }
    }
    


    Gruß Michael

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!