Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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
C++ c++;奇怪的c0000005错误_C++_Winapi - Fatal编程技术网

C++ c++;奇怪的c0000005错误

C++ c++;奇怪的c0000005错误,c++,winapi,C++,Winapi,我正在做一个可以在winlogon桌面上启动程序的项目。该程序在调试时运行良好,但当我在ide外部启动它时,它会以臭名昭著的c0000005错误彻底失败。但最奇怪的是,它似乎没有发生在任何特定的线路上。代码如下: #include "stdafx.h" #include <windows.h> #include "BinRes.h" #include <string> #include <iostream> int main(int argc, char*

我正在做一个可以在winlogon桌面上启动程序的项目。该程序在调试时运行良好,但当我在ide外部启动它时,它会以臭名昭著的c0000005错误彻底失败。但最奇怪的是,它似乎没有发生在任何特定的线路上。代码如下:

#include "stdafx.h"
#include <windows.h>
#include "BinRes.h"
#include <string>
#include <iostream>

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        return 0;
    }

std::string a;
a.append(BinRes::getAppLocation());
a.append("\\wls.exe");
BinRes::ExtractBinResource("EXE",102,"wls.exe");
Sleep(500);
SC_HANDLE schsm;
schsm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE schs;
schs = CreateService(schsm,"WLS","WLS",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,SERVICE_DEMAND_START,NULL,a.c_str(),0,0,0,0,0);
char* cd = argv[1];
LPCSTR* arg = (LPCSTR*)&cd;
StartService(schs,1,arg);
HANDLE endevent;
endevent = OpenEvent(EVENT_ALL_ACCESS,TRUE,"ENDWLS");
WaitForSingleObject(endevent,INFINITE);
SERVICE_STATUS ss;
QueryServiceStatus(schs,&ss);
if(ss.dwCurrentState != SERVICE_STOPPED)
{
    LPSERVICE_STATUS xyz = (LPSERVICE_STATUS)malloc(sizeof(LPSERVICE_STATUS));
    ControlService(schs,SERVICE_CONTROL_STOP,xyz);
}
DeleteService(schs);
//error occurs right here
DeleteFile(a.c_str());
return 0;
}
#包括“stdafx.h”
#包括
#包括“BinRes.h”
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=2)
{
返回0;
}
std::字符串a;
a、 追加(BinRes::getAppLocation());
a、 追加(\\wls.exe);
BinRes::ExtractBinResource(“EXE”,102,“wls.EXE”);
睡眠(500);
SC_HANDLE schsm;
schsm=OpenSCManager(NULL,NULL,SC\u MANAGER\u ALL\u ACCESS);
SC_HANDLE schs;
schs=CreateService(SCSM,“WLS”,“WLS”,服务所有访问,服务WIN32自有进程,服务交互进程,服务需求启动,NULL,a.c_str(),0,0,0,0);
char*cd=argv[1];
LPCSTR*参数=(LPCSTR*)和cd;
StartService(schs,1,arg);
处理endevent;
endevent=OpenEvent(事件所有访问,真,“ENDWLS”);
WaitForSingleObject(endevent,无限);
服务状态;
查询服务状态(SCH和ss);
如果(ss.dwCurrentState!=服务已停止)
{
LPSERVICE_STATUS xyz=(LPSERVICE_STATUS)malloc(sizeof(LPSERVICE_STATUS));
控制服务(SCH、服务、控制、停止、xyz);
}
删除服务(SCS);
//错误就发生在这里
删除文件(a.c_str());
返回0;
}

错误总是发生在DeleteService之后和下一行之前,但我确信它不是DeleteService,因为服务已被删除。我尝试注释DeleteService和DeleteFile,但它仍然崩溃。我肯定我犯了一些愚蠢的错误,我快要失明了。提前感谢您的帮助

我认为问题在于

LPSERVICE_STATUS xyz = (LPSERVICE_STATUS)malloc(sizeof(LPSERVICE_STATUS));
ControlService(schs,SERVICE_CONTROL_STOP,xyz);
部分。ControlService的最后一个参数xyz由该API用于返回有关服务的状态信息。实际上,您正在传递一个指向指针大小的内存区域的指针,该内存区域太小,无法容纳ControlService要填充的所有值。因为执行ControlService调用将直接覆盖malloc分配的指针空间之后的随机内存,所以在运行时您会被咬

试一试

相反。这里不需要动态分配结构。根据,ControlService将仅使用它返回状态信息;它不会存储在Windows内部数据结构中的某个位置


有关结构内容的更多信息,请参阅。不知道,为什么它在调试期间会工作。可能,与windows API中的生产版本malloc?

相比,用于调试的链接的malloc的行为稍有不同,以
LP
开头的类型是指针,因此LPSERVICE\u STATUS是指向
SERVICE\u STATUS
的指针。因此
sizeof(LPSERVICE\u STATUS)
返回指针的大小,而不是
SERVICE\u STATUS的大小,并且此malloc没有分配足够的内存:

LPSERVICE_STATUS xyz = (LPSERVICE_STATUS)malloc(sizeof(LPSERVICE_STATUS));
ControlService(schs,SERVICE_CONTROL_STOP,xyz);
正确的大小应该是
sizeof(服务状态)
。此外,您似乎并不需要动态分配内存,指向局部变量的指针也应该起作用:

SERVICE_STATUS xyz;
ControlService(schs,SERVICE_CONTROL_STOP,&xyz);

通常不会失败的原因是:

只有当ControlService返回以下错误代码之一时,服务控制管理器才会填充结构:无错误、错误无效、错误服务无法接受或错误服务未激活。否则,不会填充结构

所以它只会在出现故障时使用指针。。。
:)

无论如何,c0000005是一种访问违规。也许你应该插入一些返回值检查,然后调用GetLastError()来查看旅途中是否发生了意外情况。我同意Fredrik的观点,在调用API时,总是检查返回代码!这似乎是正确的,但DeleteService仍然被调用。是的。错误覆盖的内存不需要立即导致崩溃。崩溃可能发生在下一次调用free时(例如,可能发生在调用c_str()的过程中,或者实际上发生在任何地方)。这种错误是无法判断的。
SERVICE_STATUS xyz;
ControlService(schs,SERVICE_CONTROL_STOP,&xyz);