C++ 尝试修改数组时发生写入访问冲突
来自资源的文件被传递到函数Change,该函数应该对每个字节值进行异或运算,但随后我得到了写访问冲突错误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
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
的返回值以确保其不为空?在内存窗口中,我可以看到文件变量包含我文件中的字节。资源位于可执行文件的只读段中。您不能修改该资源占用的内存。实际上,我找到了一种方法来更改似乎已锁定的资源,但我不知道这是否适用于这里。请看这里:事实上,我找到了一种方法来改变似乎被锁定的资源,但我不知道这是否在这里起作用。请看这里: