Delphi 如何找到BDE';s共享内存区';以编程方式显示的实际位置和大小?
Borland数据库引擎使用共享内存区域,该区域必须在同一Windows工作站上同时运行的所有BDE应用程序进程中映射到同一地址。区域的位置和大小由两个名为SHAREDMEMLOCATION和SHAREDMEMSIZE的设置引导。尤其是位置设置只是一个起点,实际位置可能会完全不同。我不确定尺寸 设置的副本似乎存储在几个地方。它们中的每一个都可能包含不同的值,尤其是到达该位置的值,其中没有一个可能是正在运行的BDE应用程序所使用的实际值Delphi 如何找到BDE';s共享内存区';以编程方式显示的实际位置和大小?,delphi,bde,Delphi,Bde,Borland数据库引擎使用共享内存区域,该区域必须在同一Windows工作站上同时运行的所有BDE应用程序进程中映射到同一地址。区域的位置和大小由两个名为SHAREDMEMLOCATION和SHAREDMEMSIZE的设置引导。尤其是位置设置只是一个起点,实际位置可能会完全不同。我不确定尺寸 设置的副本似乎存储在几个地方。它们中的每一个都可能包含不同的值,尤其是到达该位置的值,其中没有一个可能是正在运行的BDE应用程序所使用的实际值 工作站范围的BDE配置文件,例如C:\Program Fil
C:\Program Files\Common Files\Borland Shared\BDE\idapi32.cfg
(BDE管理员应用程序在“以管理员身份运行”时使用该文件)C:\Users\user name\AppData\Local\Temp\\u ISTMP1.DIR\\u ISTMP0.DIR\idapi32.cfg
(安装程序显然将其放置在InstallShield临时文件夹中,但无论如何,如果由普通用户启动,BDE管理员会使用该文件)HKEY\U LOCAL\U MACHINE\SOFTWARE\Borland\Database Engine\Settings\SYSTEM\INIT
- 案例A)如果我是第一个BDE应用程序,且共享内存区域尚未分配:
- 尝试在SHAREDMEMLOCATION分配SHAREDMEMSIZE字节的内存
- 如果那个空间现在对我来说不是免费的,那么看看。。。任何其他地方,使用某种算法,并把它放在任何有SHAREDMEMSIZE字节的自由连续地址空间范围的地方!哇
- 案例B)如果我不是第一个运行BDE应用程序进程,并且此工作站上已存在共享内存区域
- 尝试绘制该区域的地图(无论它在哪里)
- 如果我无法将其映射到此进程,因为已经存在某些内容(代码、数据或任何内容),则给出“$210D”错误,“共享内存冲突”
编辑:如果每个人都可以试着避免解释诸如天空通常是什么颜色,或者Delphi应用程序有什么样的数据库选项之类的事情。谢谢。:) 似乎我不会很快得到任何答案,我逆向设计了它的工作原理。我查看了idapi32.dll中的函数名,发现了一些int
type PCardinal = ^Cardinal;
type
TOsGetSharedPtrFunc = function (Par1 : Cardinal; Par2 : PCardinal) : Cardinal; stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
OsGetSharedPtrFunc : TOsGetSharedPtrFunc;
base, size : Cardinal;
lib : HMODULE;
begin
lib := LoadLibrary('idapi32.dll');
if lib = 0 then
ShowMessage('Could not LoadLibrary().')
else
try
OsGetSharedPtrFunc := GetProcAddress(lib, 'OsGetSharedPtr');
if @OsGetSharedPtrFunc <> nil then
begin
OsGetSharedPtrFunc(9, @base);
OsGetSharedPtrFunc($A, @size);
ShowMessageFmt('%x %x', [base, size]);
end
else
ShowMessage('Could not GetProcAddress().');
finally
FreeLibrary(lib);
end;
end;