22. februar 2003 - 12:47Der er
112 kommentarer og 2 løsninger
Program til at lukke Win98
Jeg har brug for sourcekode til et lille program som kan "føle" om et program kører. Gør det ikke det skal Windows lukke ned.
Jeg har den kode der undersøger om et program kører, men mangler resten. Programmet skal kører i baggrunden og skal løbendede checke om programmet er lukket ned. Det skal virke på en Win98 platform.
Er der nogen der kan og vil lave det?
Kan desværre kun give max 200 point her så der er 300 mere til den der løser opgaven og 500 mere hvis opgaven er løst inden mandag morgen. Det haster meget og jeg skal bruge koden hurtigst muligt.
Jeg har kigget lidt på koden, men er ikke i stand til at strikke noget kode sammen på så kort tid.
Håber der er nogen der har mod på at lave koden for mig. Jeg prøver dog selv at se om jeg kan finde ud af det, men har ikke de store forhåbninger da jeg ikke er en C++ haj.
int main( ) { // Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; int fnd;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 1;
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the name and process identifier for each process. fnd = 0; for ( i = 0; i < cProcesses; i++ ) fnd = fnd || PrintProcessNameAndID( aProcesses[i] );
Det er absolut ikke køn kode, men fnd angiver hvorvidt xxxxx.exe kører, så hvis du: - erstatter den printf med shutdown kaldet - erstattet xxxxx.exe med den rigtige exe så burde det faktisk virke.
Koden kunne struktures betydeligt bedre, men det må være en anden gang.
Jeg får en fejl når jeg compiler : c:\program files\microsoft visual studio\jk\test21\test21.cpp(68) : fatal error C1010: unexpected end of file while looking for precompiled header directive Error executing cl.exe.
int main( ) { // Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; int fnd;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 1;
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the name and process identifier for each process. fnd = 0; for ( i = 0; i < cProcesses; i++ ) fnd = fnd || PrintProcessNameAndID( aProcesses[i] );
Efter at have lavet en .exe fil og kopieret over på min win98 maskine får jeg fejlen "Filen PSAPI.DLL er sammenkædet med en manglende exportfil NTDLL.DLL:_stricmp" når jeg tester mit program. ??
Ja du har ret. Jeg har kigget lidt på det andet link og får følgende fejl når jeg kompiler :
c:\program files\microsoft visual studio\jk\test23\test23.cpp(17) : fatal error C1083: Cannot open include file: 'EnumProc.h': No such file or directory Error executing cl.exe.
test23.obj - 1 error(s), 0 warning(s)
og det er jo fordi jeg ikke har funktionerne med, altså de 4 føste linjer før sample koden, men skal de i en sep. fil eller hvor skal de placeres i koden ?
Stop Stop Stop, det er mig der ikke læser hvad der står. De første 9 linjer er jo EnumProc.h filen og så kan man jo som du selv skriver selv bestemme om man vil lægge den i en sep. fil kaldet EnumProc.h eller o sourcekoden.
Får nu kun en fejl :
Compiling... test23.cpp c:\program files\microsoft visual studio\jk\test23\test23.cpp(130) : error C2440: '=' : cannot convert from 'void *' to 'unsigned long *' Conversion from 'void*' to pointer to non-'void' requires an explicit cast Error executing cl.exe.
Det betyder at i linie 130 har du en void pointer som bliver assignet til en unsigned long pointer og du skal explicit typecaste med: (unsigned long *)
Får nu følgende fejl : Compiling... test23.cpp c:\program files\microsoft visual studio\jk\test23\test23.cpp(302) : error C2664: 'EnumProcs' : cannot convert parameter 1 from 'int (unsigned long,const char *,long)' to 'int (__stdcall *)(unsigned long,unsigned short,char *,long)' None of the functions with this name in scope match the target type c:\program files\microsoft visual studio\jk\test23\test23.cpp(303) : error C2143: syntax error : missing ';' before 'if' Error executing cl.exe.
Jeg ville være glad hvis du havde lidt tid i morgen, men du behøver ikke rode mere med det nu.
Vi skal måske lige kigge på xxxxxx.exe da det kun er i NT ( prosessorne der kører ) der ender på .exe. Det eranderledes i Win98. Der ser man kun navnet f.eks i en dansk Win98 hedder den "ikke-navngivet - Notesblok" og ikke Notesblok.exe
Jeg kan kompile og lave en .exe fil, men det virker ikke som det skal.
Har lige checket det i Win98 og der virker det ikke. Husk at det kun er i NT det processerne der ender på .exe.
Hvad skal der så stå mellem "", for det hjælper ikke at skrive "Lommeregner" ( Dansk Win98 ) selvom det er det der står når man trykker ctrl+alt+del samtidig ?
Nu får jeg en liste over de programmer der kører og kan se at hvis jeg har Lommeregneren åben så hedder den c:\windows\calc.exe.
så har jeg sat calc.exe ind mellem "", men når jeg afvikler min test23.exe så vil programmet afslutte windows med det samme. Jeg får et popupvindue hvor der står "Du skal afslutte dette program før du afslutter Windows" og så kan jeg vælge at klikke på "ok" eller "annuler".
Måden jeg tester det på er at jeg starter lommeregneren og dobbeltklikker på en genvej til test23.exe, som min fil hedder, så afvikles test23.exe og "dos" vinduet lukker ( det gjorde det ikke før ), så prøver jeg at lukket lommeregneren ned, men Windows lukker ikke ned som det skal.
Det er menningen at test23.exe skal ligge i startup mappen når det kommer til at virke. Test23.exe skal så holde øje med hvornår jeg lukker lommeregneren og skal herefter lukke Windows. Det er selvfølgelig ikke lommeregneren jeg vil holde øje med, men et program der launcher en session ( i et Citrixmiljø )
Til Arne: Ja jeg havde lavet den sidste ændring og det var den der fik "dos" vinduet til at lukke med det samme. Det ville det jo ikke før denne ændring.
Når jeg tester har jeg to vinduer åbne det ene med A: og det andet med C: ( når jeg kopiere test23.exe ) samt min lommeregner. Når jeg afvikler test23.exe lukke vindue A: og C:, lommerenger forbliver som den er og når jeg lukker den sker der ikke en pind, andet end at lommeregneren lukker. Windows lukkes ikke ned.
Får 3 fejl : Compiling... test24.cpp c:\program files\microsoft visual studio\jk\test24\test24.cpp(302) : error C2601: 'Proc' : local function definitions are illegal c:\program files\microsoft visual studio\jk\test24\test24.cpp(308) : error C2601: 'main' : local function definitions are illegal c:\program files\microsoft visual studio\jk\test24\test24.cpp(322) : fatal error C1004: unexpected end of file found Error executing cl.exe.
Koden ser således ud :
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. int fnd = 0;
Får 3 fejl : Compiling... test24.cpp c:\program files\microsoft visual studio\jk\test24\test24.cpp(302) : error C2601: 'Proc' : local function definitions are illegal c:\program files\microsoft visual studio\jk\test24\test24.cpp(308) : error C2601: 'main' : local function definitions are illegal c:\program files\microsoft visual studio\jk\test24\test24.cpp(322) : fatal error C1004: unexpected end of file found Error executing cl.exe.
Loaded 'C:\WINNT\System32\ntdll.dll', no matching symbolic information found. Loaded 'C:\WINNT\system32\KERNEL32.DLL', no matching symbolic information found. Loaded 'C:\WINNT\system32\USER32.DLL', no matching symbolic information found. Loaded 'C:\WINNT\system32\GDI32.DLL', no matching symbolic information found. Loaded 'C:\WINNT\system32\psapi.dll', no matching symbolic information found. Loaded 'C:\WINNT\system32\vdmdbg.dll', no matching symbolic information found. Loaded 'C:\WINNT\system32\ADVAPI32.DLL', no matching symbolic information found. Loaded 'C:\WINNT\system32\rpcrt4.dll', no matching symbolic information found. The thread 0x708 has exited with code 3 (0x3). The program 'C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\JK\test24\Debug\test24.exe' has exited with code 3 (0x3).
Ja jeg kan godt forstå du er forvirret med C:\WINNT. Det var bare fordi jeg prøvede at debugge gennem VS, men den kom med samme fejl som jeg skrev kl. 15:02:24
Jeg har lavet c:\\windows\\calc.exe med små bogstaver og de skal være med store, så det er den føste fejl.
Nu kører løkken næsten d.v.s. der går 2 sek. mellem hver gang løkken starter på ny, men den springer ikke ud af løkken og lukker Windows ned når jeg aflsutter lommeregneren.
Jeg kan se at C:\WINDOWS\CALC.EXE er væk fra listen over den række af programmer der stadig kører.
BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16, PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined ) ;
// The EnumProcs function takes a pointer to a callback function // that will be called once per process in the system providing // process EXE filename and process ID. // Callback function definition: // BOOL CALLBACK Proc( DWORD dw, LPCSTR lpstr, LPARAM lParam ) ; // // lpProc -- Address of callback routine. // // lParam -- A user-defined LPARAM value to be passed to // the callback routine. BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam ) { OSVERSIONINFO osver ; HINSTANCE hInstLib ; HINSTANCE hInstLib2 ; HANDLE hSnapShot ; PROCESSENTRY32 procentry ; BOOL bFlag ; LPDWORD lpdwPIDs ; DWORD dwSize, dwSize2, dwIndex ; HMODULE hMod ; HANDLE hProcess ; char szFileName[ MAX_PATH ] ; EnumInfoStruct sInfo ;
// VDMDBG Function Pointers. INT (WINAPI *lpfVDMEnumTaskWOWEx)( DWORD, TASKENUMPROCEX fp, LPARAM );
// Check to see if were running under Windows95 or // Windows NT. osver.dwOSVersionInfoSize = sizeof( osver ) ; if( !GetVersionEx( &osver ) ) { return FALSE ; }
// If Windows NT: if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT ) {
// Load library and get the procedures explicitly. We do // this so that we don't have to worry about modules using // this code failing to load under Windows 95, because // it can't resolve references to the PSAPI.DLL. hInstLib = LoadLibraryA( "PSAPI.DLL" ) ; if( hInstLib == NULL ) return FALSE ;
// Call the PSAPI function EnumProcesses to get all of the // ProcID's currently in the system. // NOTE: In the documentation, the third parameter of // EnumProcesses is named cbNeeded, which implies that you // can call the function once to find out how much space to // allocate for a buffer and again to fill the buffer. // This is not the case. The cbNeeded parameter returns // the number of PIDs returned, so if your buffer size is // zero cbNeeded returns zero. // NOTE: The "HeapAlloc" loop here ensures that we // actually allocate a buffer large enough for all the // PIDs in the system. dwSize2 = 256 * sizeof( DWORD ) ; lpdwPIDs = NULL ; do { if( lpdwPIDs ) { HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ; dwSize2 *= 2 ; } lpdwPIDs = (unsigned long *) HeapAlloc( GetProcessHeap(), 0, dwSize2 ); if( lpdwPIDs == NULL ) { FreeLibrary( hInstLib ) ; FreeLibrary( hInstLib2 ) ; return FALSE ; } if( !lpfEnumProcesses( lpdwPIDs, dwSize2, &dwSize ) ) { HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ; FreeLibrary( hInstLib ) ; FreeLibrary( hInstLib2 ) ; return FALSE ; } }while( dwSize == dwSize2 ) ;
// How many ProcID's did we get? dwSize /= sizeof( DWORD ) ;
// Loop through each ProcID. for( dwIndex = 0 ; dwIndex < dwSize ; dwIndex++ ) { szFileName[0] = 0 ; // Open the process (if we can... security does not // permit every process in the system). hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, lpdwPIDs[ dwIndex ] ) ; if( hProcess != NULL ) { // Here we call EnumProcessModules to get only the // first module in the process this is important, // because this will be the .EXE module for which we // will retrieve the full path name in a second. if( lpfEnumProcessModules( hProcess, &hMod, sizeof( hMod ), &dwSize2 ) ) { // Get Full pathname: if( !lpfGetModuleFileNameEx( hProcess, hMod, szFileName, sizeof( szFileName ) ) ) { szFileName[0] = 0 ; } } CloseHandle( hProcess ) ; } // Regardless of OpenProcess success or failure, we // still call the enum func with the ProcID. if(!lpProc( lpdwPIDs[dwIndex], 0, szFileName, lParam)) break ;
// Did we just bump into an NTVDM? if( _stricmp( szFileName+(strlen(szFileName)-9), "NTVDM.EXE")==0) { // Fill in some info for the 16-bit enum proc. sInfo.dwPID = lpdwPIDs[dwIndex] ; sInfo.lpProc = lpProc ; sInfo.lParam = lParam ; sInfo.bEnd = FALSE ; // Enum the 16-bit stuff. lpfVDMEnumTaskWOWEx( lpdwPIDs[dwIndex], (TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
// Did our main enum func say quit? if(sInfo.bEnd) break ; } }
// Get procedure addresses. // We are linking to these functions of Kernel32 // explicitly, because otherwise a module using // this code would fail to load under Windows NT, // which does not have the Toolhelp32 // functions in the Kernel 32. lpfCreateToolhelp32Snapshot= (HANDLE(WINAPI *)(DWORD,DWORD)) GetProcAddress( hInstLib, "CreateToolhelp32Snapshot" ) ; lpfProcess32First= (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) GetProcAddress( hInstLib, "Process32First" ) ; lpfProcess32Next= (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) GetProcAddress( hInstLib, "Process32Next" ) ; if( lpfProcess32Next == NULL || lpfProcess32First == NULL || lpfCreateToolhelp32Snapshot == NULL ) { FreeLibrary( hInstLib ) ; return FALSE ; }
// Get a handle to a Toolhelp snapshot of the systems // processes. hSnapShot = lpfCreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ; if( hSnapShot == INVALID_HANDLE_VALUE ) { FreeLibrary( hInstLib ) ; return FALSE ; }
// Get the first process' information. procentry.dwSize = sizeof(PROCESSENTRY32) ; bFlag = lpfProcess32First( hSnapShot, &procentry ) ;
// While there are processes, keep looping. while( bFlag ) { // Call the enum func with the filename and ProcID. if(lpProc( procentry.th32ProcessID, 0, procentry.szExeFile, lParam )) { procentry.dwSize = sizeof(PROCESSENTRY32) ; bFlag = lpfProcess32Next( hSnapShot, &procentry ); }else bFlag = FALSE ; }
}else return FALSE ;
// Free the library. FreeLibrary( hInstLib ) ;
return TRUE ; }
BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16, PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined ) { BOOL bRet ;
Og husk at psapi.lib skal kopieres ind samme sted som EnumProc.h
I Visual Studio skal du under project->settings->C/C++ fanebladet sætte Category=Precompiled Headers og under fanebladet "Link" tilføje psapi.lib i Objects/Library modules til sidst i linjen.(Husk at lave et mellemrum mellem psapi.lib og den forrige)
Det er jeg klar over, derfor har jeg også lavet 4 nye spørgsmål på hver 200 points til arne_v da han har brugt det meste af sin weekend på at hjælpe mig. Så jeg mener han fortjæner disse points.
Hvad er dit problem i at jeg får løst en opgave her og nu ved at give mere end 200 points for at få en mand til at bruge en hel weekend på at få løst en opgave ?
george > jeg har nu point nok.... og hvis han har hjulpet dig så meget, så få hans kontonummer, og indbetal 200kr. til ham - det kan han bruge til noget. De point herinde er ikke noget værd..
Georg>> Problemet er at reglerne siger at det ikke er tilladt. Det er da yderst venligt at arne_v bruger så meget tid på opgaven, men reglerne siger nu engang at 200 point er det maksimale. Dette vidste arne_v formentlig også inden han gik i gang med opgaven. Derfor bedes du lukke de andre spørgsmål du har oprettet med point til arne_v hurtigst muligt.
Og jeg havde iøvrigt ikke forventet mere end de 200 point jævnfør min allerførste kommentar.
hsloth kom så nok lidt nemmere til hans halvdel af pointene, men ce la vie.
Man kan så undre sig over hvor mange der kan nå at svare på en point sag på 10 minutter sammenlignet med hvor mange der svarer på et vanskeligt problem i løbet af en helt weekend.
Folk vågner lige pludselig op når der deles point ud, og så bliver det et problem når de ikke kan nå at få fat i dem, men som jeg skrev før "typisk dansk".
Har stadig ikke forstået hvad det her pointsystem skal til for. Men det er jeg nok for dum til at forstå.
200 point = røvtur.... Som der også siges her er det først når der kommer point på bordet at folk vågner op.... Når der nu hele tiden er fokus på at det hele blot er for sjov her på eksperten (pointene altså...), hvorfor så ikke bare lave en limit der ligger på 1000 eller lign. I "gamle dage" gav et spørgsmål af denne karakter op mod 1000 - 1500 point...
Det var der da ingen der fik ondt i røven af....
Jeg smider af og til 100 til 200 spir på et sikkert latterligt spørgsmål, men ved at hvis dette ikke gøres er der ingen reaktion...!!! Mine spørgsmål står dog slet ikke i relief til denne her opgave og de kræfter der anvendt på denne.
Penge på kontoen....fis og ballade ! sporten er jo også at løse en svær opgave, og fortjenesten burde være at man kunne give 1000 "sportpoint" for dette.
Synes godt om
Ny brugerNybegynder
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.