读取BDE配置信息的动态库
来源:互联网 发布:武林外传电影版 知乎 编辑:程序博客网 时间:2024/06/05 03:56
代码贴出来,有兴趣的可以研究一下
library BDEExplorer;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Windows,
BDE;
type
PrecBDEEntry = ^TrecBDEEntry;
TrecBDEEntry = Record
sNodeName: string;
sDescription: string;
sValue: string;
bHasSubnodes: Boolean;
sPath: string;
end;
{$R *.res}
var
AList: TList;
sList: TStringList;
procedure ClearList(var AList: TList);
var
i: Integer;
p: PrecBDEEntry;
begin
for i:=0 to AList.Count-1 do
begin
p := AList[i];
if p <> nil then Dispose(p);
end;
AList.Clear;
sList.Clear;
end;
procedure DllEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
if not Assigned(AList) then
begin
AList := TList.Create;
sList := TStringList.Create;
end
else
begin
ClearList(AList);
AList.Free;
sList.Free;
end;
end;
DLL_PROCESS_DETACH:
begin
ClearList(AList);
end;
end;
end;
function CheckReadAll(var Index: Integer): Boolean;
var
sPath: string;
i: Integer;
p: PrecBDEEntry;
bFlag: Boolean;
begin
Result := False;
if (sList.Count = 1) and (sList[0] = '-1') then
begin
Index := -1;
Exit;
end;
if sList.Count >= 1 then
begin
Index := StrToInt(sList[0]);
Exit;
end
else
Result := True;
end;
procedure ReadNode(Index: Integer);
var
sPath: string;
p: PrecBDEEntry;
Cursor: HDBICur;
ConfigDesc: CFGDesc;
begin
if Index = -1 then
sPath := ''
else
begin
p := AList[Index];
sPath := p^.sPath;
end;
dbiOpenCfgInfoList(nil, dbiREADONLY, cfgPERSISTENT, PChar(sPath), Cursor);
While DbiGetNextRecord(Cursor, dbiWRITELOCK, @ConfigDesc, nil) = 0 do
begin
New(p);
p.sNodeName := ConfigDesc.szNodeName;
p.sDescription := ConfigDesc.szDescription;
p.sValue := ConfigDesc.szValue;
p.bHasSubnodes := ConfigDesc.bHasSubnodes;
p.sPath := sPath + p.sNodeName + '';
AList.Add(p);
if p.bHasSubnodes then sList.Add(IntToStr(AList.Count - 1));
end;
dbiCloseCursor(Cursor);
sList.Delete(sList.IndexOf(IntToStr(Index)));
end;
function ReadBDESettings: Integer;
var
pv: SysVersion;
i: Integer;
begin
try
Result := -1;
dbiInit(nil);
dbiGetSysVersion(pv);
sList.Add('-1');
while not CheckReadAll(i) do ReadNode(i);
dbiExit;
Result := 0;
finally
end;
end;
function GetDatabaseInfo(DatabaseName: PChar; var Info: PChar): Integer; cdecl;
var
sDatabaseName: string;
sInfo: string;
i: Integer;
p: PrecBDEEntry;
begin
Result := -1;
try
sDatabaseName := 'DATABASES' + Databasename + 'DB INFO';
if ReadBDESettings <> 0 then Exit;
sInfo := '';
for i := 0 to AList.Count - 1 do
begin
p := AList[i];
if (AnsiUpperCase(sDatabaseName) <> AnsiUpperCase(p.sPath)) and
(Pos(AnsiUpperCase(sDatabaseName), AnsiUpperCase(p.sPath)) = 1) then
begin
sInfo := sInfo + AnsiUpperCase(p^.sNodeName) + '=' + AnsiUpperCase(p^.sValue) + ';';
end;
end;
Info := PChar(sInfo);
Result := 0;
finally
end;
end;
exports
GetDatabaseInfo;
begin
DllProc := @DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end.
{ p: PrecBDEEntry;
pv: SYSVersion ;
Node: TTreeNode;
begin
dbiInit(NIL);
Label1.Caption := '';
Label2.Caption := '';
Label3.Caption := '';
dbiGetSysVersion(pv);}
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Windows,
BDE;
type
PrecBDEEntry = ^TrecBDEEntry;
TrecBDEEntry = Record
sNodeName: string;
sDescription: string;
sValue: string;
bHasSubnodes: Boolean;
sPath: string;
end;
{$R *.res}
var
AList: TList;
sList: TStringList;
procedure ClearList(var AList: TList);
var
i: Integer;
p: PrecBDEEntry;
begin
for i:=0 to AList.Count-1 do
begin
p := AList[i];
if p <> nil then Dispose(p);
end;
AList.Clear;
sList.Clear;
end;
procedure DllEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
if not Assigned(AList) then
begin
AList := TList.Create;
sList := TStringList.Create;
end
else
begin
ClearList(AList);
AList.Free;
sList.Free;
end;
end;
DLL_PROCESS_DETACH:
begin
ClearList(AList);
end;
end;
end;
function CheckReadAll(var Index: Integer): Boolean;
var
sPath: string;
i: Integer;
p: PrecBDEEntry;
bFlag: Boolean;
begin
Result := False;
if (sList.Count = 1) and (sList[0] = '-1') then
begin
Index := -1;
Exit;
end;
if sList.Count >= 1 then
begin
Index := StrToInt(sList[0]);
Exit;
end
else
Result := True;
end;
procedure ReadNode(Index: Integer);
var
sPath: string;
p: PrecBDEEntry;
Cursor: HDBICur;
ConfigDesc: CFGDesc;
begin
if Index = -1 then
sPath := ''
else
begin
p := AList[Index];
sPath := p^.sPath;
end;
dbiOpenCfgInfoList(nil, dbiREADONLY, cfgPERSISTENT, PChar(sPath), Cursor);
While DbiGetNextRecord(Cursor, dbiWRITELOCK, @ConfigDesc, nil) = 0 do
begin
New(p);
p.sNodeName := ConfigDesc.szNodeName;
p.sDescription := ConfigDesc.szDescription;
p.sValue := ConfigDesc.szValue;
p.bHasSubnodes := ConfigDesc.bHasSubnodes;
p.sPath := sPath + p.sNodeName + '';
AList.Add(p);
if p.bHasSubnodes then sList.Add(IntToStr(AList.Count - 1));
end;
dbiCloseCursor(Cursor);
sList.Delete(sList.IndexOf(IntToStr(Index)));
end;
function ReadBDESettings: Integer;
var
pv: SysVersion;
i: Integer;
begin
try
Result := -1;
dbiInit(nil);
dbiGetSysVersion(pv);
sList.Add('-1');
while not CheckReadAll(i) do ReadNode(i);
dbiExit;
Result := 0;
finally
end;
end;
function GetDatabaseInfo(DatabaseName: PChar; var Info: PChar): Integer; cdecl;
var
sDatabaseName: string;
sInfo: string;
i: Integer;
p: PrecBDEEntry;
begin
Result := -1;
try
sDatabaseName := 'DATABASES' + Databasename + 'DB INFO';
if ReadBDESettings <> 0 then Exit;
sInfo := '';
for i := 0 to AList.Count - 1 do
begin
p := AList[i];
if (AnsiUpperCase(sDatabaseName) <> AnsiUpperCase(p.sPath)) and
(Pos(AnsiUpperCase(sDatabaseName), AnsiUpperCase(p.sPath)) = 1) then
begin
sInfo := sInfo + AnsiUpperCase(p^.sNodeName) + '=' + AnsiUpperCase(p^.sValue) + ';';
end;
end;
Info := PChar(sInfo);
Result := 0;
finally
end;
end;
exports
GetDatabaseInfo;
begin
DllProc := @DllEntryPoint;
DllEntryPoint(DLL_PROCESS_ATTACH);
end.
{ p: PrecBDEEntry;
pv: SYSVersion ;
Node: TTreeNode;
begin
dbiInit(NIL);
Label1.Caption := '';
Label2.Caption := '';
Label3.Caption := '';
dbiGetSysVersion(pv);}
- 读取BDE配置信息的动态库
- DELPHI中BDE、ODBC的配置注意
- ThinkPHP 读取配置信息与动态配置(C方法)
- BDE动态连接Oracle数据库
- 读取任一web.config的配置信息
- 四种读取配置信息的方式
- C# 配置信息读取
- camel读取配置信息
- 读取配置信息方式
- ASP.NET Core的配置(1):读取配置信息
- BDE与ADO的比较
- php简单实现基本库件的调用和配置信息的读取
- 配置数据库引擎BDE(Borland DataBase Engine)
- 手动读取spring配置信息
- 读取文本文件,获取配置信息
- NameValueCollection类读取配置信息
- JavaWEB中读取配置信息
- JavaWEB中读取配置信息
- 太小看了XXXX和XXXX
- 一个硕士生的“技术” 生涯--转载
- Excel常见错误信息
- 常用的正则
- 堆和栈的比较
- 读取BDE配置信息的动态库
- 嵌入式软件设计中查找缺陷的几个技巧
- C经典书籍
- SIP SAP及SDP协议组合应用的研究
- System.Web.UI.MasterPage 一点理解
- 编写的第一个网络程序
- C#不规则窗体制作(已经解决24位色以上不能正常显示问题)
- Java中的四舍五入
- Eclipse 3.2.1汉化