WinApi bei Vista anders als bei XP?



  • Hey,
    ich habe Heute meinen Laptop neu aufgesetzt (vorher XP jetzt Vista). Vorher hab ich meine Projekte gesichert und möchte diese nun wieder compielen. Doch wenn ich sie compiele tritt folgender Fehler auf (vorher ging es natürlich :D) :

    Fehler 3 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl GetProcessID(char const *,class std::vector<unsigned long,class std::allocator<unsigned long> > &)" (?GetProcessID@@YAXPBDAAV?vector@KV?vector@KV?allocator@K@std@@@std@@@Z)" in Funktion "_main".

    Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup". MSVCRTD.lib

    Fehler 5 fatal error LNK1120: 2 nicht aufgelöste externe Verweise.

    Der Code:

    //GetProcessID.h
    #include <vector>
    #include <windows.h>
    //
    // prototypes
    //
    void GetProcessID(LPCTSTR pProcessName, std::vector<DWORD>& SetOfPID);
    
    // stdafx.h : include file for standard system include files,
    //  or project specific include files that are used frequently, but
    //      are changed infrequently
    //
    
    #if !defined(AFX_STDAFX_H__42C36E0B_A30F_11D6_96D1_000347A347FE__INCLUDED_)
    #define AFX_STDAFX_H__42C36E0B_A30F_11D6_96D1_000347A347FE__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    // TODO: reference additional headers your program requires here
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_STDAFX_H__42C36E0B_A30F_11D6_96D1_000347A347FE__INCLUDED_)
    
    //WinApiMain.cpp
    // WinApiMain.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <windows.h>
    #include "GetProcessID.h"
    
    int main(int argc, char* argv[])
    {
    	std::vector<DWORD> SetOfPID;
    	GetProcessID("msnmsgr",SetOfPID);
    	if (SetOfPID.empty())		// Process is not running
    	{
    		MessageBox(NULL, "Process 'msnmsgr' is not running", "Information", MB_OK);
    	}
    	else					// Process is running
    	{
    		for (int i=0;i < SetOfPID.size(); i++)
    		{
    			char szText[256];
    			sprintf(szText,"Process ID of 'msnmsgr' is %d\n", SetOfPID[i]);
    			MessageBox(NULL, szText, "Information", MB_OK);
    			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,SetOfPID[i]);
    			// some code...
    			CloseHandle(hProcess);
    		}
    	}
    	return 0;
    }
    

    Danke schonmal im Vorraus 🙂

    PS : sry für mein schlechtes Deutsch ich bin Engländer. Halte es für ne gute Übung hier im Forum zu fragen 😃



  • Hi Zerohero,
    ich glaube nicht, daß es an Deinem Quellcode liegt.

    Aufgrund Deiner Beschreibung müssen wir davon ausgehen, daß Du die gleiche Entwicklungsumgebung auf Vista wieder verwendet hast.
    Oder hast Du vielleicht tatsächlich eine neuere Version genommen?

    Du hast uns leider die wichtigste Information vorenthalten:
    Welche Entwicklungsumgebung IDE (Version/Jahrgang) und welches SDK verwendest Du?

    Ich behaupte mal, daß es völlig egal ist, auf welcher Windows-Version Du Deinen Quellcode schreibst und compilierst.
    Jedenfalls solange Du die gleiche IDE und die gleiche SDK verwendest.

    Martin



  • Hallo,

    du hast offensichtlich die Datei, die GetProcessID enthält, dem Projekt nicht hinzugefügt (nur die GetProcessID.h, das reicht aber nicht, es muss noch eine .cpp-Datei geben). Ausserdem solltest du als neues Projekt ein Win32-Konsolenprojekt wählen (und deinen Code in main einfügen):

    http://www.replaydebugging.com/images/shots/Screenshot2.gif

    oder du stellst das (Sub-)System um, wie hier:

    http://kipirvine.com/asm/gettingStarted/p7.gif

    MfG,

    Probe-Nutzer



  • Danke für die schnelle Antwort. Ich benutze Visual Studio 2008 Professionel.

    Ahh die .cpp vergessen zu Posten sry

    #include "stdafx.h"
    #include "GetProcessID.h"
    #include <comdef.h>		// for using bstr_t class
    /*****************************************************************
     *                                                               *
     * Functions used to navigate through the performance data.      *
     *                                                               *
     *****************************************************************/
    
    PPERF_OBJECT_TYPE FirstObject( PPERF_DATA_BLOCK PerfData )
    {
        return( (PPERF_OBJECT_TYPE)((PBYTE)PerfData + 
            PerfData->HeaderLength) );
    }
    
    PPERF_OBJECT_TYPE NextObject( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_OBJECT_TYPE)((PBYTE)PerfObj + 
            PerfObj->TotalByteLength) );
    }
    
    PPERF_INSTANCE_DEFINITION FirstInstance( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfObj + 
            PerfObj->DefinitionLength) );
    }
    
    PPERF_INSTANCE_DEFINITION NextInstance( 
        PPERF_INSTANCE_DEFINITION PerfInst )
    {
        PPERF_COUNTER_BLOCK PerfCntrBlk;
    
        PerfCntrBlk = (PPERF_COUNTER_BLOCK)((PBYTE)PerfInst + 
            PerfInst->ByteLength);
    
        return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfCntrBlk + 
            PerfCntrBlk->ByteLength) );
    }
    
    PPERF_COUNTER_DEFINITION FirstCounter( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_COUNTER_DEFINITION) ((PBYTE)PerfObj + 
            PerfObj->HeaderLength) );
    }
    
    PPERF_COUNTER_DEFINITION NextCounter( 
        PPERF_COUNTER_DEFINITION PerfCntr )
    {
        return( (PPERF_COUNTER_DEFINITION)((PBYTE)PerfCntr + 
            PerfCntr->ByteLength) );
    }
    
    PPERF_COUNTER_BLOCK CounterBlock(PPERF_INSTANCE_DEFINITION PerfInst)
    {
    	return (PPERF_COUNTER_BLOCK) ((LPBYTE) PerfInst + PerfInst->ByteLength);
    }
    
    #define TOTALBYTES    64*1024
    #define BYTEINCREMENT 1024
    
    #define PROCESS_OBJECT_INDEX	230
    #define PROC_ID_COUNTER			784
    
    void GetProcessID(LPCTSTR pProcessName, std::vector<DWORD>& SetOfPID)
    {
        PPERF_DATA_BLOCK pPerfData = NULL;
        PPERF_OBJECT_TYPE pPerfObj;
        PPERF_INSTANCE_DEFINITION pPerfInst;
        PPERF_COUNTER_DEFINITION pPerfCntr, pCurCntr;
        PPERF_COUNTER_BLOCK PtrToCntr;
        DWORD BufferSize = TOTALBYTES;
        DWORD i, j;
    	LONG k;
    
    // Allocate the buffer for the performance data.
    
        pPerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
    
    	char szKey[32];
    	sprintf(szKey,"%d %d",PROCESS_OBJECT_INDEX, PROC_ID_COUNTER);
    	LONG lRes;
        while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                                   szKey,
                                   NULL,
                                   NULL,
                                   (LPBYTE) pPerfData,
                                   &BufferSize )) == ERROR_MORE_DATA )
        {
    		// Get a buffer that is big enough.
    
            BufferSize += BYTEINCREMENT;
            pPerfData = (PPERF_DATA_BLOCK) realloc( pPerfData, BufferSize );
        }
    
    	// Get the first object type.
    
        pPerfObj = FirstObject( pPerfData );
    
    	// Process all objects.
    
        for( i=0; i < pPerfData->NumObjectTypes; i++ )
        {
    
    		if (pPerfObj->ObjectNameTitleIndex != PROCESS_OBJECT_INDEX)
    		{
    			pPerfObj = NextObject( pPerfObj );
    			continue;
    		}
    
    		SetOfPID.clear();
    
    		// Get the first counter.
    
            pPerfCntr = FirstCounter( pPerfObj );
    
    		// Get the first instance.
    
            pPerfInst = FirstInstance( pPerfObj );
    
    		_bstr_t bstrProcessName,bstrInput;
    
    		// Retrieve all instances.
    
            for( k=0; k < pPerfObj->NumInstances; k++ )
            {
    			pCurCntr = pPerfCntr;
    			bstrInput = pProcessName;
    			bstrProcessName = (wchar_t *)((PBYTE)pPerfInst + pPerfInst->NameOffset);
    			if (!stricmp((LPCTSTR)bstrProcessName, (LPCTSTR) bstrInput))
    			{
    
    				// Retrieve all counters.
    
    				for( j=0; j < pPerfObj->NumCounters; j++ )
    				{
    					if (pCurCntr->CounterNameTitleIndex == PROC_ID_COUNTER)
    					{
    						PtrToCntr = CounterBlock(pPerfInst);
    						DWORD *pdwValue = (DWORD*)((LPBYTE) PtrToCntr + pCurCntr->CounterOffset);
    						SetOfPID.push_back(*pdwValue);
    						break;
    					}
    
    					// Get the next counter.
    
    					pCurCntr = NextCounter( pCurCntr );
    				}
    			}
    
    			// Get the next instance.
    
                pPerfInst = NextInstance( pPerfInst );
            }
        }
    	free(pPerfData);
    	RegCloseKey(HKEY_PERFORMANCE_DATA);
    }
    


  • Vielen vielen Dank 🙂

    http://kipirvine.com/asm/gettingStarted/p7.gif perfekt ! 🙂

    Problem gelöst.


Anmelden zum Antworten