错误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,而不知道如何将它与已经使用的代码可靠地结合。在代码段中看不到任何明显的候选代码,而且它也不提供复制。请尝试通过注释代码块在真实代码中查找它。一旦找到它,请将该代码移到它自己的函数中。