var
sizeVirtual: Cardinal = 4000;
lpRound: Pointer;
mbi: MEMORY_BASIC_INFORMATION;
lpAddress: Pointer;
lpStr: PAnsiChar;
dwOldAddr: PDWORD;
begin
lpRound := Pointer($100000FF);
lpAddress := VirtualAlloc(lpRound, sizeVirtual, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
if lpAddress = nil then
begin
WriteLn(format('VirtualAlloc error: %d', [GetLastError()]));
Exit;
end;
lpStr := 'hello';
WriteLn('Alloc:MEM_COMMIT|MEM_RESERVE');
CopyMemory(lpAddress, lpStr, lstrlen(lpStr));
WriteLn(format('分配,复制成功,地址:0x%.8x, 内容:%s', [DWORD(lpAddress), PAnsiChar(lpAddress)]));
VirtualQuery(lpAddress, mbi, SizeOf(mbi));
WriteLn(format('使用 VirtualQuery 获得的信息:'+#13#10+
'BaseAddress:0x%.8x AllocationBase:0x%.8x AlloctionProtect:0x%.8x RegionSize:%u State:0x%.8x Protect:0x%.8x Type:0x%.8x', [DWORD(mbi.BaseAddress), DWORD(mbi.AllocationBase), mbi.AllocationProtect, mbi.RegionSize, mbi.State, mbi.Protect, mbi.Type_9])); if not (VirtualProtect(lpAddress, 0, PAGE_READONLY, nil)) then
begin
WriteLn(format('VirtualProtect error: %d', [GetLastError()]));
Exit;
end;
在翻译一个VC例子,但VirtualProtect无法修改内存页属性,求解释.
VirtualProtect error: 998 (内存分配访问无效。)
sizeVirtual: Cardinal = 4000;
lpRound: Pointer;
mbi: MEMORY_BASIC_INFORMATION;
lpAddress: Pointer;
lpStr: PAnsiChar;
dwOldAddr: PDWORD;
begin
lpRound := Pointer($100000FF);
lpAddress := VirtualAlloc(lpRound, sizeVirtual, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
if lpAddress = nil then
begin
WriteLn(format('VirtualAlloc error: %d', [GetLastError()]));
Exit;
end;
lpStr := 'hello';
WriteLn('Alloc:MEM_COMMIT|MEM_RESERVE');
CopyMemory(lpAddress, lpStr, lstrlen(lpStr));
WriteLn(format('分配,复制成功,地址:0x%.8x, 内容:%s', [DWORD(lpAddress), PAnsiChar(lpAddress)]));
VirtualQuery(lpAddress, mbi, SizeOf(mbi));
WriteLn(format('使用 VirtualQuery 获得的信息:'+#13#10+
'BaseAddress:0x%.8x AllocationBase:0x%.8x AlloctionProtect:0x%.8x RegionSize:%u State:0x%.8x Protect:0x%.8x Type:0x%.8x', [DWORD(mbi.BaseAddress), DWORD(mbi.AllocationBase), mbi.AllocationProtect, mbi.RegionSize, mbi.State, mbi.Protect, mbi.Type_9])); if not (VirtualProtect(lpAddress, 0, PAGE_READONLY, nil)) then
begin
WriteLn(format('VirtualProtect error: %d', [GetLastError()]));
Exit;
end;
在翻译一个VC例子,但VirtualProtect无法修改内存页属性,求解释.
VirtualProtect error: 998 (内存分配访问无效。)
解决方案 »
- 三层开发TClientDataset数据集计算问题!!!!!
- 关于如何用Delphi做自动升级软件? 急!!
- 简单问题,就是不知道该怎么做 [在线等。。。。]
- 关于Delphi中使用微软的TTS技术
- 问一个有关VCL组件在窗体上移动的简单问题哈
- ★★★如果一个窗体的状态为“在任务栏中无显示”,如何在其最小化时不使其标题栏显示在左下角(闪一下再隐藏的方法也不行)?
- 为何删除ADO连接的数据库中的记录系统会报错?
- ##### 20 分#####如何知道CURSOR在当前的STRINGGRID的CELLS的位置
- 50分献上,我的问题可能有点难:我要顺序执行两个exe文件(即第一个exe退出后再调用第二个exe),假如第一个exe的执行被取消,则不执行第二个exe。请问用Delphi如何实现?
- 如何獲得Adoconnect的connectstring.
- 循环求解连加问题、新手上路。
- 请教个问题:panel上的组件free后,是否会触发一个事件或者产生一个消息?
tOldPoint:Cardinal;
VirtualProtect(Pointer(lpRound), sizeVirtual, PAGE_READWRITE, tOldPoint);