windows - Fejl C2059 og C2061 på C sprog

Indlæg af Hanne Mølgaard Plasc

Problem




   Mulig duplikat:

  Hvorfor giver VS2010 syntaksfejl, når syntaksen er korrekt?





Jeg forsøger at udvikle en slags Windows 32-tjeneste på C-sprog ved hjælp af Visual Studio 2010.


Jeg oprettede et nyt projekt og indsatte .c filer:



  • flaget

  • service.c

  • misc.c



Jeg har også to header-filer:



  • myerrors.h

  • my.h



Her er koden jeg har (vær opmærksom på at det er bare et udkast).


main.c:


#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "stdafx.h"
#include "my.h"
#include "myerrors.h"

static int parse\_args(int ac, char **av)
{
    int i = 0;

    while (++i < ac)
        if (strcmp(av[i], "-i") && !InstallMyService())
            return false;
        else if (strcmp(av[i], "-d") && !UninstallMyService())
            return false;
        else if (strcmp(av[i], "-p"))
            if (!av[i + 1])
                return false;
            else
            {
                if (!InsertPathInRegistry(av[i + 1]))
                    return false;
                i++;
            }
        else
            return false;
    return true;
}

int main(int ac, char **av)
{
    HANDLE hLogFile;

    if ((hLogFile = CreateFile(LOG\_FILE\_PATH, GENERIC\_WRITE, 0, NULL, CREATE\_NEW, FILE\_ATTRIBUTE\_NORMAL, NULL)) == INVALID\_HANDLE\_VALUE)
        aff\_error(CANT\_CREATE\_FILE);    
    if (ac > 1)
    {
        if (!parse\_args(ac, av))
        {
            aff\_error(BAD\_ARGUMENTS);
            return EXIT\_FAILURE;
        }
    }
    else
    {
        SERVICE\_TABLE\_ENTRY DispatchTable[] = {{DC\_SERVICE\_NAME, ServiceMain}, {NULL, NULL}};
        StartServiceCtrlDispatcher(DispatchTable);
    }
    getchar();
    if (!CloseHandle(hLogFile))
        aff\_error(CLOSE\_FILE\_FAILED);
    return EXIT\_SUCCESS;
}


misc.c:


#include <Windows.h>
#include <stdio.h>
#include "my.h"
#include "myerrors.h"

void aff\_error(char *error\_str)
{
    fprintf(stderr, "ERROR: \%s
", error\_str);
}

bool InsertPathInRegistry(char *path)
{
    printf("LOG: Inserting \%s as ", path);
}

void WriteInLogFile(HANDLE hLogFile, char *log\_string)
{
    printf("WriteInLogFile function");
}


service.c:


#include <Windows.h>
#include "my.h"

bool InstallMyService()
{
    return true;
}

bool UninstallMyService()
{
    return true;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{

}

void WINAPI ServiceMain(DWORD ac, LPTSTR *av)
{

}


Mine overskrifter er blot nogle funktionserklæringer og makroer som:


# define DC\_SERVICE\_NAME    "MyService"

/* MISC functions */

void aff\_error(char *error\_str);


my.h


#ifndef \_MY\_H\_
# define \_MY\_H\_

#include <Windows.h>
#include <strsafe.h>

/* Macros */

# define LOG\_FILE\_PATH      "c:\my\_log\_file.txt"
# define DC\_SERVICE\_NAME    "MyService"

/* MISC functions */

void aff\_error(char *error\_str);

/* SERVICE functions */

void WINAPI ServiceMain(DWORD ac, LPTSTR *av);
bool InstallMyService();
bool UninstallMyService();
bool InsertPathInRegistry(char *path);
void WINAPI ServiceCtrlHandler(DWORD Opcode);

#endif /*!MY\_H\_ */


Mens jeg forsøgte at kompilere projektet, fik jeg nogle underlige fejl:


my.h(19): error C2061: syntax error : identifier 'InstallMyService'
my.h(19): error C2059: syntax error : ';'
my.h(19): error C2059: syntax error : ')'


Eller:


my.h(21): error C2061: syntax error : identifier 'InsertPathInRegistry'
my.h(21): error C2059: syntax error : ';'
my.h(21): error C2059: syntax error : 'type'


Jeg kontrollerede på nogle fora, der siger, at disse fejl er almindeligvis fejl med, indeholder dårligt placeret, men jeg ved ikke rigtigt i dette tilfælde, jeg tror ikke, jeg lavede fejl med omfatter ...


Kan nogen oplyse mig?


Tak.

Bedste reference


bool er ikke en datatype i ANSI C. Det er en datatype i C99-versionen af ​​sproget, , kun hvis <stdbool.h> er inkluderet , men Visual Studio understøtter ikke C99, kun C89 (C99 tilføjer også \_Bool datatypen, som kan bruges uden at indeholde overskrifter).


Jeg foreslår, at du erstatter bool med en anden type som int, eller brug en typedef til at aliasere den med int eller unsigned char eller noget.