Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误C2712无法在需要对象展开的函数中使用_try 我编写了一个简单的C++ Win32 API程序,安装并启动Windows服务。我在代码中使用SEH\uu try&\uu。不幸的是,我得到一个已知错误,如下所示:_C++_Winapi_Visual C++_Stack Unwinding_Structured Exception - Fatal编程技术网

错误C2712无法在需要对象展开的函数中使用_try 我编写了一个简单的C++ Win32 API程序,安装并启动Windows服务。我在代码中使用SEH\uu try&\uu。不幸的是,我得到一个已知错误,如下所示:

错误C2712无法在需要对象展开的函数中使用_try 我编写了一个简单的C++ Win32 API程序,安装并启动Windows服务。我在代码中使用SEH\uu try&\uu。不幸的是,我得到一个已知错误,如下所示:,c++,winapi,visual-c++,stack-unwinding,structured-exception,C++,Winapi,Visual C++,Stack Unwinding,Structured Exception,错误C2712无法在需要对象展开的函数中使用try。\u 我试图用一些熟悉的方法来解决它,比如将SEH代码从main函数移到另一个函数,或者用Project属性来播放错误:启用C++异常。 但什么都没用。 无论如何,这就是来源: #include "stdafx.h" #include <iostream> #include <Windows.h> using namespace std; #define ERROR -1 #define SUCCESS 0; str

错误C2712无法在需要对象展开的函数中使用try。\u

我试图用一些熟悉的方法来解决它,比如将SEH代码从main函数移到另一个函数,或者用Project属性来播放错误:启用C++异常。 但什么都没用。 无论如何,这就是来源:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;

#define ERROR -1
#define SUCCESS 0;

string GetLastErrorAsString(DWORD errorMessageID);
DWORD Service();
int WINAPI main(void)
{
    wcout << "STARTING THE SERVICE INSTALLATION PROCESS..." << endl;
    Service();
    wcout << "FINISHED !" << endl;
    wcout << "ENTER ANYTHING TO EXIT..." << endl;
    getchar();
    return 0;
}

**DWORD Service() {** << the line that the error is pointing at
    SC_HANDLE hSCManager = NULL;
    SC_HANDLE hService = NULL;
    DWORD start_service = 0;
    LPCTSTR ExePath = TEXT("C:\Program Files\WinSecurityCheck.exe");
    __try { //guarded code here 

        hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
        if (hSCManager == NULL) {
            __leave;
        }
        hService = CreateService(hSCManager, TEXT("WinSecurityCheck"),
        TEXT("WinSeurityCheck"),
        SERVICE_START | DELETE | SERVICE_STOP,
        SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START,
        SERVICE_ERROR_IGNORE,
        ExePath, NULL, NULL, NULL, NULL, NULL);
        if (hService == NULL) {
            __leave;
        }
        start_service = StartService(hService, 0, NULL);
        if (start_service == 0) {
            __leave;
        }
    }
    __finally { //termination code
        if (!AbnormalTermination()) {
            wcout << TEXT("Successfully Created & Started The Desired     Service") << endl;
            CloseServiceHandle(hSCManager);
            CloseServiceHandle(hService);
            return SUCCESS;
        }
        if (hSCManager == NULL) {

            wcout << TEXT("Error Open SC Manager") << endl;
            GetLastErrorAsString(GetLastError());
            return ERROR;
        }
        if (hService)
        {
            wcout << TEXT("Error Creating Service") << endl;
            GetLastErrorAsString(GetLastError());

            CloseServiceHandle(hSCManager);
            return ERROR;
        }
        if (start_service == 0)
        {
            wcout << TEXT("Error Starting Service") << endl;
            GetLastErrorAsString(GetLastError());
            CloseServiceHandle(hService);
            CloseServiceHandle(hSCManager);
            return ERROR;
        }
    }
}

string GetLastErrorAsString(DWORD errorMessageID) {
    LPTSTR formatMessage;
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS     | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, errorMessageID, NULL, formatMessage, 64,       NULL);
    wcout << formatMessage << endl;
    LocalFree(formatMessage);
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
#定义错误-1
#定义成功0;
字符串GetLastErrorAsString(DWORD errorMessageID);
DWORD服务();
int WINAPI主(无效)
{

WCUT基本上不混合结构化异常处理和C++。大多数调用到代码> STD< /Cord>会引发异常,需要堆栈展开。为什么您需要SEH?不清楚,为什么您在C++应用中使用SEH。这完全不是您想要的。如果您这样做是因为您需要<代码>最后的<代码>语义,SIMP。LY切换到C++异常处理,使用RAII类型包装清理。另外,您调用的是代码> GETLASTOrror错误/代码>太晚。返回的值不再保证在该点有效。您要在到达文档状态返回有效信息后立即调用它,而不散布任何COD。E(像你一样)。只要你不混合SEH异常处理和C++异常处理,就可以使用SEH。这就是你正在做的。你的<代码> CUT/<代码>流运算符可以在这里抛出C++异常,但是代码被包裹在SEH处理程序中。这是行不通的。C++ C++异常(如果你喜欢的话,也没有例外)重要的是,SEH不执行自动堆栈解卷来运行相应的DATR来清除。SEH异常有时也被称为C异常。在C.中没有DR,所以在C++应用中使用SEH异常是可能的,但很大程度上是无用的:您没有得到C++异常处理的好处,特别是自动的。IC堆栈展开。这就是错误消息试图说的。不能将SEH异常处理与依赖RAII的任何C++对象混合来调用它们的析构函数。编译器必须简单地附带编译Seh代码来实现RAII,而不知道如何将它与已经使用的代码可靠地结合。在代码中没有看到任何明显的候选,它不会提供注释。尝试通过对代码块进行注释来在实际代码中进行搜索。一旦找到它,就将该代码移到它自己的函数中。基本上不混合结构化异常处理和C++。大多数调用到代码> STD< /Code >可以引发异常,并要求堆栈展开。为什么你需要SEH?不清楚,为什么你在C++应用中使用SEH。这完全不是你想要的。如果你这样做是因为你需要<代码>最后一个/Cuth>语义,只需切换到C++异常处理,并使用RAII类型包装来清理。此外,你调用的是<代码> GETLASTORMUSTOR> /COD>太晚了。返回的不再保证在该点有效。您希望在达到一个条件后立即调用它,在该条件下,它被记录为返回有效信息,而不插入任何代码(就像您一样)只要你不混合SEH异常处理和C++异常处理,就可以使用SEH。这就是你正在做的。你的<代码> CUT/<代码>流运算符可以在这里抛出C++异常,但是代码被包裹在SEH处理程序中。这是行不通的。C++ C++异常(如果你喜欢的话,也没有例外)重要的是,SEH不执行自动堆栈解卷来运行相应的DATR来清除。SEH异常有时也被称为C异常。在C.中没有DR,所以在C++应用中使用SEH异常是可能的,但很大程度上是无用的:您没有得到C++异常处理的好处,特别是自动的。IC堆栈展开。这就是错误消息试图说的。不能将SEH异常处理与依赖RAII的任何C++对象混合来调用它们的析构函数。编译器必须简单地附带编译Seh代码来实现RAII,而不知道如何将它与已经使用的代码可靠地结合。在代码段中看不到任何明显的候选代码,而且它也不提供复制。请尝试通过注释代码块在真实代码中查找它。一旦找到它,请将该代码移到它自己的函数中。