Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Semplice programmino

    Ho fatto questo programmino.
    Però, il compilatore mi stampa a schermo

    Il pid del processo è 0.
    Invece vorrei che mi stampasse il pid corretto del mio processo
    Cosa sbaglio?!
    codice:
    PROCESS_INFORMATION x;
    PROCESS_INFORMATION*p;                    //Il mio puntatore alla struttura
    p=&x;
    (*p).dwProcessId;
    cout << "Il pid del processo è " << (*p).dwProcessId;
    Ecco il codice della mia struttura PROCESS_INFORMATION
    codice:
    typedef struct _PROCESS_INFORMATION {
      HANDLE hProcess;
      HANDLE hThread;
      DWORD  dwProcessId;
      DWORD  dwThreadId;
    } PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

  2. #2
    Secondo me devi invocare una funzione che, passandogli la struttura, te la riempia con i dati relativi al tuo processo.

  3. #3
    Quando dichiari:
    PROCESS_INFORMATION x;

    Ottieni lo spazio per un mucchio di byte e basta, devi riempirla quella struttura.
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  4. #4
    Rispondo a questo post, pregandoti però di non aprire multipli thread per argomenti simili. Questo tuo post potrebbe essere considerato come fuori dal Regolamento.


    La struct PROCESS_INFORMATION viene "riempita" dalla funzione API CreateProcess, quindi è ovvio che ti restituisca 0 visto che non hai usato tale funzione.
    Dopo aver usato la CreateProcess allora potrai accedere al valore del tuo PID.


    Consiglio personale: non so se sei obbligato a programmare in C++ o se lo fai per passione; in ogni caso è fondamentale conoscere quantomeno la *sintassi* del linguaggio prima di avventurarsi in procedure complicate o di cui non si capisce l'utilità.


    Ciao


    PS : nel titolo devi inserire l'argomento della tua discussione, quindi questo titolo viola il Regolamento.

  5. #5
    Innanzitutto mi scuso immediatamente per la mia postata errata contro il regolamento.

    Nel mio programma completo la funzione createprocess viene utilizzata. Non capisco perchè mi venga restituito il valore 0.

    Ecco il mio codice:

    codice:
    #include <iostream>
    #include <stdlib.h>
    #include <fstream>        
    #include <windows.h>   
    #define MAX 50
    using namespace std;
    char nome_cognome[MAX];
    void nuovoprofilo();
    
    int main()
    	{
    	char ch;
        cout << "Nuovo (n), Salvare (s) Lanciare (r) Uscire (q)" << endl;
        cin >> ch;
    	while (ch!='q')
    		{
    		switch (ch)
    			{
    			case 'n':
    				nuovoprofilo();
    				break;
    			case 's':
    				//salvaprofilo();
    				break;
    			case 'r':
    				//lanciaprofilo();
    				break;
    			default : cout << "Nuovo (n), Salvare (s) Lanciare (r) Uscire (q)" << endl;
    			}
    		cin >> ch;
    		}
        return 0;
    	}
    	
    	
    void nuovoprofilo()
    {
    cout << "Inserire nome e cognome" << endl;
    cin.getline(nome_cognome,MAX);  //perchè non funziona?!
    cin.getline(nome_cognome,MAX);
    system("\"mkdir C:\\cygwin\\home\\Ciucci\\voxforge_2\"");            
    system("\"mkdir C:\\cygwin\\home\\Ciucci\\voxforge_2\\HTK_Scripts\"");                                  
    system("\"xcopy C:\\cygwin\\home\\Ciucci\\voxforge\\HTK_Scripts C:\\cygwin\\home\\Ciucci\\voxforge_2\\HTK_Scripts\""); 
    system("\"mkdir C:\\cygwin\\home\\Ciucci\\voxforge_2\\auto\"");
    ofstream fout ("C:\\cygwin\\home\\Ciucci\\voxforge_2\\auto\\sample.grammar");
    fout << "S : NS_B COMANDO OGGETTO NS_E" << endl << "S : NS_B RICHIESTA NS_E" << endl;
    fout.close();
    ofstream fout2 ("C:\\cygwin\\home\\Ciucci\\voxforge_2\\auto\\sample.voca");
    fout2 << "% NS_B" << endl << "<s>        sil" << endl << endl << "% NS_E" << endl << "</s>        sil" << endl << endl << "% COMANDO" << endl << "ACCENDI      a cc e n d i" << endl << "SPEGNI	     s p e ggn i" << endl << endl << "% OGGETTO" << endl << "LUCE             l u c e" << endl << "TEIERA           t e j e r a" << endl << endl << "% RICHIESTA" << endl << "AIUTO       a j u t o" << endl;
    fout2.close();
    
    BOOL esito;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si)); // serve per azzerrare la struttura si
    si.cb = sizeof(si); // il campo cb deve essere valorizzato alla dimensione
    // della struttura
    si.lpTitle = "Processo figlio Cygwin.bat";
    // crea il processo figlio, ovvero lancia cygwin
    esito = CreateProcess
                         (
                          NULL, // nome dell'eseguibile (viene usata la riga di comando)
                          "C:\\cygwin\\Cygwin.bat", // percorso del programma che voglio eseguire
                          NULL, // indica che il processo non è ereditabile dai processi figli
                          NULL, // indica che il thread associato al processo non è ereditabile
                          FALSE, // i diritti ereditati dal processo non passano ai figli
                          CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS, // opzioni di creazione
                          // (0 per nessuna); in questo caso imposto priorità e creazione
                          // del processo figlio in una nuova finestra console
                          NULL, // puntatore ad un blocco di variabili d’ambiente.
                          // in questo caso vengono usate quelle del padre.
                          NULL, // directory di lavoro per il processo figlio.
                          // In questo caso viene usata la directory corrente del processo padre
                          &si, // puntatore ad una struttura STARTUPINFO
                          &pi // puntatore ad una struttura PROCESS_INFORMATION
                          );
    if (esito == TRUE) 
              {
              cout<<"Processo creato regolarmente"<<endl;
              } 
    else 
         {
         cout<<"CreateProcess fallito!"<<endl;
         }
    //Da controllare
    PROCESS_INFORMATION x;
    PROCESS_INFORMATION*p;                               
    p=&x;
    (*p).dwProcessId;
    cout << "Il PID di cygwin è " << (*p).dwProcessId;  //dovrebbe restituirmi il pid della console cygwin
    
    DWORD WINAPI GetCurrentProcessId(void); 
    //cout << "Il pid del mio file tesi.exe è " << GetCurrentProcessId(void);             //mi dovrebbe restituire il PID del processo chiamante
    }
    Un saluto ringraziandoti per la disponibilità immensa
    P.S. Utilizzo il C++ perchè sono obbligato.

  6. #6
    Il tuo puntatore alla struttura PROCESS_INFORMATION si chiama "pi" (come si vede nella CreateProcess, ultimo argomento della funzione) quindi non devi dichiarare un altro puntatore "p": quello era solo un esempio..


    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.