目前,刚巧我也碰到这个问题,现将我研究得出的一些结果叙述如下,
TO ridle:你的方法在win31(286模式)下是行得通的,但在win95(386模式)下不行.
TO rockboy:据我所知 FPE5.11的Win95程序似乎仍然是DOS程序.
恐怕不能直接编写32位程序访问所有的内存(只有通过VXD),
但可以编写16位程序(win31)或DOS下的程序访问到所有的内存.
原因如下:
在dos或286(保护)模式下对内存的访问是通过段地址(或选择符):偏移量(16:16位)的形式进行的,
他们工作在同一级别上.而Win95是工作386(虚拟86)模式下,对内存的访问是Flat的内存访问也就是
0:32位的形式,而只有工作在ring0级别的程序才能访问到所有内存,在加之叶面内存调度管理使得对内存的访问更复杂化,0-2G的内存地址是系统分配给应用程序的,2G-4G的内存是系统占用.一般工作在win95下的32位程序只是工作在ring3上,因此不能直接访问不属于自己的内存,除非编写一个特殊的DLL---VXD,设备驱动程序(VXD)工作在ring0上,因此可以访问所有内存.用Delphi来编写VXD是可行的,但需要转换大量的头文件,同时必须找资料,学习VXD的特殊编写规则(不知道是不是DDK--VXD的开发工具包for C,听说有for Delphi 的VXD开发工具包,使得在delphi下开发非常轻松,可惜要美元!).李亚平提到的Tvichw32.zip 就是使用了VXD才得以实现的,可惜没有源代码.
如果你只是希望能访问所有的内存,那么你可以使用Tvichw32元件,或则编写16位程序(win31)或DOS下的程序,那里没有级别的限制,方便得多,而我则不得不想法编写32位程序,不光是要解决内存问题,还有中断直接调用问题:-(.
当然,针对你的问题,首先你必须使用WinAPI取出该实例的基址.
附:
编写16位程序访问指定内存的值的函数:
{Access Memory for win31&win95}
{must compile with delphi1.0---16bit App}
{no VXD or DLL need}
{pure native source code here,all include}
{Writen by Xueyu,LEE}
const fMemoryMapped:boolean=false;
var fSelector :word;
fBaseAddr :LongInt;
fMemoryPointer
ointer;
fMemorySize :Word;
function MapPhysMemory(PhAddr:LongInt; Size:Word)
ointer;
{input: }
{ phAddr: physics Address}
{ Size : Alloc Size(bytes)}
{output:}
{ Result: pointer to the physics memory}
{example:}
{ access the address 0:$123}
{ ptr:=MapPhysMemory($123,1)}
begin
Result:=fMemoryPointer;
if fMemoryMapped then UnmapPhysMemory;
fMemorySize:=Size;
fBaseAddr:=PhAddr;
fMemoryMapped:=TRUE;
fSelector:=AllocSelector(DSeg);
SetSelectorBase(fSelector,PhAddr);
SetSelectorLimit(fSelector,Size);
fMemoryPointer:=Ptr(fSelector,0);
Result:=fMemoryPointer;
end;
procedure UnmapPhysMemory;
begin
if fMemoryMapped then FreeSelector(fSelector);
fSelector:=0;
fMemoryMapped:=FALSE;
fBaseAddr:=0;
fMemoryPointer:=NIL;
fMemorySize:=0;
end;