Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++_Winapi_Visual C++ - Fatal编程技术网

C++ 尝试修改数组时发生写入访问冲突

C++ 尝试修改数组时发生写入访问冲突,c++,winapi,visual-c++,C++,Winapi,Visual C++,来自资源的文件被传递到函数Change,该函数应该对每个字节值进行异或运算,但随后我得到了写访问冲突错误 INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow) { HRSRC hRes = FindResource(NULL, L"FILE", RT_RCDATA); if (hRes == NULL) { // p

来自资源的文件被传递到函数Change,该函数应该对每个字节值进行异或运算,但随后我得到了写访问冲突错误

INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, INT nCmdShow)
{
    HRSRC hRes = FindResource(NULL, L"FILE", RT_RCDATA);

    if (hRes == NULL)
    {
        // print error
    }

    DWORD resSize = SizeofResource(NULL, hRes);
    HGLOBAL resData = LoadResource(NULL, hRes);
    byte *file = reinterpret_cast<byte*>(LockResource(resData));

    Change(file, resSize);

    return 0;
}

void Change(byte *data, int size)
{
    for (int i = 0; i < size; ++i)
    {
        data[i] ^= 2;
    }
}
INT回调WinMain(HINSTANCE HINSTANCE,HINSTANCE hPrevInstance,
PSTR lpCmdLine,INT nCmdShow)
{
HRSRC hRes=FindResource(NULL,L“FILE”,RT_RCDATA);
如果(hRes==NULL)
{
//打印错误
}
DWORD RESISZE=SizeofResource(空,hRes);
HGLOBAL resData=LoadResource(NULL,hRes);
字节*file=reinterpret_cast(锁资源(resData));
更改(文件、文件);
返回0;
}
无效更改(字节*数据,整数大小)
{
对于(int i=0;i
资源存在于只读内存中,无法直接写入

修改资源内容的唯一方法是使用
UpdateResource()
(除非直接将
WriteFile()
写入磁盘上的可执行文件),但不能在属于活动运行进程的资源上使用这两种方法,因为可执行文件被操作系统锁定

因此,您尝试的唯一方法是在可写内存中分配资源数据的单独副本,然后您可以使用该副本执行任何操作,例如:

INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
{
    HRSRC hRes = FindResource(NULL, L"FILE", RT_RCDATA);
    if (hRes == NULL)
    {
        // print error
    }
    else
    {
        DWORD resSize = SizeofResource(NULL, hRes);
        HGLOBAL resData = LoadResource(NULL, hRes);
        LPVOID resDataPtr = LockResource(resData);

        byte *copy = new byte[resSize];
        memcpy(copy, resDataPtr, resSize);
        Change(copy, resSize);
        delete[] copy;
    }

    return 0;
}

资源存在于只读内存中,不能直接写入

修改资源内容的唯一方法是使用
UpdateResource()
(除非直接将
WriteFile()
写入磁盘上的可执行文件),但不能在属于活动运行进程的资源上使用这两种方法,因为可执行文件被操作系统锁定

因此,您尝试的唯一方法是在可写内存中分配资源数据的单独副本,然后您可以使用该副本执行任何操作,例如:

INT CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
{
    HRSRC hRes = FindResource(NULL, L"FILE", RT_RCDATA);
    if (hRes == NULL)
    {
        // print error
    }
    else
    {
        DWORD resSize = SizeofResource(NULL, hRes);
        HGLOBAL resData = LoadResource(NULL, hRes);
        LPVOID resDataPtr = LockResource(resData);

        byte *copy = new byte[resSize];
        memcpy(copy, resDataPtr, resSize);
        Change(copy, resSize);
        delete[] copy;
    }

    return 0;
}

您是否检查了
LockResource
的返回值以确保它不为空?在内存窗口中,我可以看到文件变量包含我文件中的字节。资源位于可执行文件的只读段中。您无法修改资源占用的内存。是否检查了
LockResource
的返回值以确保其不为空?在内存窗口中,我可以看到文件变量包含我文件中的字节。资源位于可执行文件的只读段中。您不能修改该资源占用的内存。实际上,我找到了一种方法来更改似乎已锁定的资源,但我不知道这是否适用于这里。请看这里:事实上,我找到了一种方法来改变似乎被锁定的资源,但我不知道这是否在这里起作用。请看这里: