QueryServiceStatusEx - unresolved external symbol



  • Hi,

    Ich glaube ich habe vergessen irgendeine lib zu linken weiss aber leider nicht welche.

    Habe die advapi32 und die kernel32 gelinkt wie auf MSDN beschrieben.

    Vielleicht ist doch ein Fehler im Code oder jmd der das liest möchte Ihn gerne mal testen, deshalb poste ich ihn mal hier.
    ( Das meiste hab ich mir aus der MSDN zusammengeschnippelt )

    #include <stdio.h>
    #include <windows.h>
    #include <tchar.h>
    #include <tlhelp32.h>
    
    #pragma comment (lib,"advapi32")
    #pragma comment (lib,"kernel32")
    
    void grabservices();
    
    int main(int argc, char *argv[]){
    	void grabservices();
    	return 1;
    }
    
    void grabservices(){
    
    	PROCESSENTRY32 pe;
    	DWORD err;
        int i;
    
        SC_HANDLE sc = OpenSCManager (NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
        if (sc != NULL){
    
    		short getprocinfo = 1;
            ENUM_SERVICE_STATUS service_data;
            ENUM_SERVICE_STATUS *lpservice = NULL;
            BOOL retVal;
            DWORD bytesNeeded,srvCount,resumeHandle = 0,srvType, srvState;
    		SERVICE_STATUS_PROCESS ssStatus;
    		SC_HANDLE schService;
    	    HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    	    if ((int)hSnapshot==-1){
    		  getprocinfo  = 0;
    	    }
    
    	    pe.dwSize=sizeof(PROCESSENTRY32);
    
            srvType = SERVICE_WIN32;
            srvState = SERVICE_STATE_ALL;
    
            retVal = EnumServicesStatus (sc,srvType,srvState,&service_data,sizeof(service_data),&bytesNeeded,&srvCount,&resumeHandle);
    
            err = GetLastError();
    
            if ((retVal == FALSE) || err == ERROR_MORE_DATA){
                DWORD dwBytes = bytesNeeded + sizeof(ENUM_SERVICE_STATUS);
                lpservice = calloc(dwBytes, sizeof(dwBytes));
                EnumServicesStatus (sc,srvType,srvState,lpservice,dwBytes,&bytesNeeded,&srvCount,&resumeHandle);
            }
    
            for(i=0;i< (int)srvCount;i++){
       			schService = OpenService(sc,lpservice[i].lpServiceName,SERVICE_ALL_ACCESS);
        		if ( QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssStatus, sizeof(SERVICE_STATUS_PROCESS),&bytesNeeded)==0 ){
    				if(i+1<10) printf("0%i.. <%s> %s", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName);
    				else printf("%i.. <%s> %s", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName);
        	    }
        	    else{
    				if (ssStatus.dwCurrentState == SERVICE_RUNNING){
    					if(getprocinfo==1){
    	    				BOOL retval=Process32First(hSnapshot,&pe);
    	    				while(retval){
    							if(ssStatus.dwProcessId == pe.th32ProcessID){
    								break;
    							}
    							pe.dwSize=sizeof(PROCESSENTRY32);
    							retval=Process32Next(hSnapshot,&pe);
    						}
    						if(i+1<10) printf("0%i.. <%s> %s | %i %s.", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName, ssStatus.dwProcessId,pe.szExeFile);
    						else printf("%i.. <%s> %s | %i .14%s.", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName, ssStatus.dwProcessId,pe.szExeFile);
    					}
    					else{
    						if(i+1<10) printf("0%i.. <%s> %s", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName);
    						else printf("%i.. <%s> %s", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName);
    					}
    				}
    				else{
    					if(i+1<10) printf("0%i.. <%s> %s", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName);
    					else printf("%i.. <%s> %s", i+1,lpservice[i].lpServiceName, lpservice[i].lpDisplayName);
    				}
    			}
    			CloseServiceHandle(schService);
            }
            CloseHandle(hSnapshot);
        }
        else printf("OpenSCManager error()");
        CloseServiceHandle(sc);
        return;
    }
    

    Beim compilen bekomme ich folgenden Fehler:

    linking...
    service2.obj : error LNK2001: unresolved external symbol __imp__QueryServiceStatusEx@20
    Debug/service2.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    

    Ich hoffe irgendjemand kann mir weiterhelfen.

    Vielen Dank fürs Lesen

    MFG c°h°



  • Ein Blick in die Hilfe erleichtert meistens das arbeiten...
    http://msdn2.microsoft.com/en-us/library/ms684941(VS.85).aspx

    #pragma comment (lib, "Advapi32.lib")
    

    Und ich gehe mal davon aus, dass Du kein VC6 verwendest...



  • Danke für deine Antwort.

    Aber die advapi32.lib hatte ich schon gelinkt.

    Doch ich verwende VC6. Ist das zu alt für die Funktion?

    MFG



  • Es geht nur, wenn Du das letzte gültige PSDK für VC6 installierst (Feb 2003):
    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm

    Aber irgendwann wirst Du Funktionen brauchen, die nach Feb 2003 dazugekommen sind und spätestens dann musst Du Dich von VC6 trennen...



  • Vielen Dank

    Hab mir jetzt MS Visual 2008 installiert und siehte da 0 Fehler 0 Warnungen 🙂

    Nochmal Vielen Dank für deine Hilfe und noch einen schönen Sonntag


Anmelden zum Antworten