非常非常感谢 deepblue2004 的反馈!
我主要的系统是 windows xp,家里和公司都没有 98 系统测试,直到昨天才有空用 vmware 搭了个 98 进行详尽的测试。
经过测试发现,这是 FastMM 的一个 BUG(不光是 FastMM 4.62、Rtl Patch 还有官方的 Delphi 2006!)在 GetMem.inc 中为了共享内存管理器创建了一个隐含的 label:
GetMem.inc 的 4424 行:
MMSharingWindow := CreateWindow('STATIC', PChar(@UniqueProcessIDString[1]), WS_POPUP, 0, 0, 0, 0, 0, 0, GetCurrentProcessId, nil);
其中 CreateWindow 的原型(GetMem.inc 进行了封套,在 4317 行定义):
function CreateWindow(lpClassName: PChar
lpWindowName: PChar
dwStyle: DWORD
X, Y, nWidth, nHeight: Integer
hWndParent: HWND
hMenu: HMENU
hInstance: HINST
lpParam: Pointer): HWND;
在 winnt 的系统下 hInstance: HINST
传入 GetCurrentProcessId 没任何问题;而在 98 下出错(创建不成功返回 0)!这个应该修改为:
MMSharingWindow := CreateWindow('STATIC', PChar(@UniqueProcessIDString[1]), WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);