Avatar billede george Nybegynder
12. februar 2003 - 21:41 Der er 29 kommentarer og
1 løsning

Flere fejl ved compilering af program

Er der nogen der kan fortælle mig hvad der går galt her.

#include <Psapi.h>


    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.
CString processes;
    for ( i = 0; i < cProcesses; i++ )

    {
   
   
    char szProcessName[MAX_PATH] = "unknown";

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                  PROCESS_VM_READ,
                                  FALSE, aProcesses[i] );

    // Get the process name.

    if ( hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
            &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName,
                              sizeof(szProcessName) );
        }
    }

    // Print the process name and identifier.

    processes += (CString)szProcessName + "," ;
   

    CloseHandle( hProcess );

}

Jeg har under menuen  Project - Settings på fanebladet som hedder 'Link' der hvor der står 'Object/Library modules:' skrevet navnet på psapi.lib, men får følgende fejl:

Compiling...
process1.cpp
c:\program files\microsoft visual studio\jk\process1\process1.cpp(52) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.
Avatar billede arne_v Ekspert
12. februar 2003 - 21:44 #1
Der mangler forhåbentligt lidt kode mellen #include og første
if statement !
Avatar billede arne_v Ekspert
12. februar 2003 - 21:46 #2
Jeg har set den fejl, når jeg har loadet en ikke Visual C++
fil ind i Visual C++ stedetfor at lave en ny fil i Visual C++
og så copy-paste kode fragmenter ind.

Så måske skulle du prøve at bruge den lille workaround.
Avatar billede george Nybegynder
12. februar 2003 - 21:50 #3
Det gør jeg også, har faktisk taget og kopieret fra http://www.eksperten.dk/spm/202097
Avatar billede george Nybegynder
12. februar 2003 - 21:51 #4
Jeg har ændret koden til :

#include <Psapi.h>

HMODULE ModuleArray[100];
  DWORD PIDArray[100];
  DWORD cbNeeded,cbNeeded1;
  char PathBuffer[512];
  int NumOfProcesses,NumOfModules;

      CString processes;
    CString tmp;

    if (EnumProcesses(PIDArray,sizeof(PIDArray),&cbNeeded))
    {
        processes +="EnumProcesses OK\n\n-------------------------\n";
        NumOfProcesses = cbNeeded / sizeof(DWORD);

        tmp.Format("%d Processes Found\n-------------------------\n",NumOfProcesses);
        processes += tmp;

        for (int i=2; i<NumOfProcesses; i++)
        {
           
            tmp.Format("Process ID : %d\n",PIDArray[i]);
            processes += tmp;
            HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS    ,false,PIDArray[i]);
            if (!hProcess)
              continue;
            if (EnumProcessModules(hProcess,ModuleArray,sizeof(ModuleArray),&cbNeeded1))
            {
              processes += "ProcessModules OK\n";
              NumOfModules = cbNeeded1 / sizeof(HMODULE);
              for (int j=0; j<NumOfModules; j++)
              {
                GetModuleFileNameEx(hProcess,ModuleArray[j],PathBuffer,511);
   
                processes += (CString)PathBuffer + ",\n" ;

              }
              processes +="-------------------------\n\n";
            }else
            {
              processes +="ProcessModules Failed\n";
            }
            CloseHandle(hProcess);
        }
      }else
      {
        processes += "EnumProcesses Failed";
      }

Men får samme fejl ??
Avatar billede arne_v Ekspert
12. februar 2003 - 21:52 #5
Det der er ihvertfald ikke et ready-to-compile stykke kode.
Avatar billede george Nybegynder
12. februar 2003 - 21:58 #6
Ok ??

Hvad mangler der, for jeg læser da spørgsmålet som et svar ?
Som de skriver skal man bare huske include filen i starten og linke Psapi.lib som beskrevet i starten af mit spørgsmål.

Er jeg helt galt på den ?
Avatar billede arne_v Ekspert
12. februar 2003 - 22:01 #7
Ja - jeg fortsår heller ikke helt det svar du linkede til.

Der er ingen funktions-erklæring inden den første if statement.

Det skal der være for at det er legalt C/C++ syntax.
Avatar billede george Nybegynder
12. februar 2003 - 22:10 #8
Her er et link til koden som Microsoft foreslår :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/enumerating_all_processes.asp

Den har jeg også prøvet, men får samme fejl.

Har du nogle forslag ?
Avatar billede arne_v Ekspert
12. februar 2003 - 22:18 #9
Det eksempel ser syntaktisk korrekt ud.

Kunne du prøve og få Visual C++ wizarden til at generere et
tomt projekt og du så copy paster denne kode ind uden at slette
det som Visual C++ har genereret.
Avatar billede george Nybegynder
12. februar 2003 - 22:25 #10
Tænker du på File->new->Project ? Hvis ja, hvilken skal jeg vælge ? Win32 Application ? Jeg spørger fordi jeg er ret ny i C/C++ og kan ikke rigtig fatte forskellen på Win32 Application og Win32 Console Application
Avatar billede arne_v Ekspert
12. februar 2003 - 22:29 #11
En Win32 Application er en GUI app.

En Win32 Console Application er en kommando-linie / tekst app.

Da MS eksemplet bruger printf skal det være en Console Application.
Avatar billede george Nybegynder
12. februar 2003 - 22:45 #12
Har prøvet det du siger og valgte "A simple Application" :

// test8.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int main(int argc, char* argv[])
{
    return 0;
}

#include <windows.h>
#include <stdio.h>
#include "psapi.h"

void PrintProcessNameAndID( DWORD processID )
{
    char szProcessName[MAX_PATH] = "unknown";

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                  PROCESS_VM_READ,
                                  FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
            &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName,
                              sizeof(szProcessName) );
        }
        else return;
    }
    else return;

    // Print the process name and identifier.

    printf( "%s (Process ID: %u)\n", szProcessName, processID );

    CloseHandle( hProcess );
}

void main( )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
        PrintProcessNameAndID( aProcesses[i] );
}

Får fejlen :
Compiling...
test10.cpp
c:\program files\microsoft visual studio\jk\test10\test10.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/test10.pch': No such file or directory
Error executing cl.exe.
Avatar billede george Nybegynder
12. februar 2003 - 22:49 #13
Når jeg kigger i c:\program files\microsoft visual studio\jk\test10\debug så findes der ingen fil der hedder test10.pch ??
Avatar billede arne_v Ekspert
12. februar 2003 - 22:52 #14
Har du en test10.h i dit projekt ?
Avatar billede george Nybegynder
12. februar 2003 - 22:54 #15
Nej kun en StdAfx.h
Avatar billede arne_v Ekspert
12. februar 2003 - 22:57 #16
Jeg er løbet tør for ideer nu.

Og jeg kan desværre ikke teste det selv, fordi jeg 2500 km fra
min PC'er med Visual C++.

:-(
Avatar billede george Nybegynder
12. februar 2003 - 23:00 #17
Du får de 100 points for indsatsen. Tak for forsøget.

Er der andre de har nogle bud er der stadig 100 points at tjene.
Avatar billede jpk Nybegynder
13. februar 2003 - 09:01 #18
Det er fordi dit projekt bruger pre-compiled headers!
Dette gør kompileringen hurtigere, men kræver at du includer "stdafx.h" øverst på din .cpp-fil.

altså:
#include "stdafx.h"


Du kan også slå det fra eller lade compileren styre det automatisk.
Det gøres under Project->Settings, fanebladet C++, Category=Precompiled Headers.
Her skal du vælge "Not using precompiled headers" eller "Automatic use of precompiled headers"
Avatar billede miknil Nybegynder
13. februar 2003 - 09:37 #19
jpk har ret, du skal enten fravælge precompiled headers på den enkelte fil / hele projektet, eller tilføje #include "stdafx.h"

miknil
Avatar billede george Nybegynder
13. februar 2003 - 17:36 #20
hmm...

#include "stdafx.h" i starten virker ikke, det gør det derimod med :

"Det gøres under Project->Settings, fanebladet C++, Category=Precompiled Headers. Her skal du vælge "Not using precompiled headers" eller "Automatic use of precompiled headers" så får jeg ingen compileringsfejl, men jeg får følgende fejl når jeg prøver at lave en .exe fil :

Compiling...
StdAfx.cpp
Linking...
test20.obj : error LNK2001: unresolved external symbol _GetModuleBaseNameA@16
test20.obj : error LNK2001: unresolved external symbol _EnumProcessModules@16
test20.obj : error LNK2001: unresolved external symbol _EnumProcesses@12
Debug/test20.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

test20.exe - 4 error(s), 0 warning(s)
Avatar billede arne_v Ekspert
13. februar 2003 - 17:41 #21
Så linker du ikke mod psapi.lib !
Avatar billede george Nybegynder
13. februar 2003 - 17:56 #22
Næh det har du ret i, nu virker det. Hvordan får jeg "dos vinduet" til at forblive åbent efter afvikling ? Jeg kan ikke nå at se hvad der står i dos vinduet da det lukker med det samme.
Avatar billede arne_v Ekspert
13. februar 2003 - 18:01 #23
Du kan enten åbne en DOS box manuelt og CD'e ned i det rigtige
directory og køre programmet.

Ellers så kan du sætte:

system("PAUSE");

ind sidst i dit main program.

(kræver en #include <stdlib.h> hvis ikke du har den i forvejen)
Avatar billede george Nybegynder
13. februar 2003 - 18:01 #24
Åhh, jeg kan se det ved at "kører programmet" inde fra C++. Det er kun når jeg prøver at afvikle filen fra "run" eller explorer det lukker.
Avatar billede george Nybegynder
13. februar 2003 - 18:03 #25
Ok, det prøver jeg.

Jeg bliver lige nødt til at løbe en ½ time, så må vi finde ud af det med pointsfordeling.
Avatar billede george Nybegynder
13. februar 2003 - 20:34 #26
Er der nogen af jer der er intereseret i point som tak for hjælpen. så meld lige i ud så jeg kan få oprettet et spørgsmål.

Tak for hjælpen under alle omstændigheder.
Avatar billede arne_v Ekspert
13. februar 2003 - 20:47 #27
Jeg har fået point en gang.

Og dem er jeg helt tilfreds med.

Jeg vil selvfølgelig ikke protestere, hvis du absolut vil give
mig nogle point !  :-)

Men jpk kunne godt fortjene nogle point.
Avatar billede jpk Nybegynder
14. februar 2003 - 14:29 #28
george >> hvis du har kunnet bruge min information til noget, vil jeg da heller ikke protestere mod at få et par point kastet efter mig...
Avatar billede george Nybegynder
14. februar 2003 - 15:40 #29
Det var faktisk dit og Arne_v's svar der fik det til at funke. så jeg opretter lige et spørgsmål som du kan svarer på.

Er du interesseret i at tjene 500 points ?
Avatar billede george Nybegynder
14. februar 2003 - 16:10 #30
Point kan du få ved at svarer på :http://www.eksperten.dk/spm/317412
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester