急,怎么获得NT中某机上已注册的应用程序服务器名(100分)

D

dagang

Unregistered / Unconfirmed
GUEST, unregistred user!
急,怎么获得NT中某机上已注册的应用程序服务器名!
拜托
 
补: 在WIN9X机上编程实现.
目的: MIDAS三层结构时,在客呼端改变与应用程序服务器(中间件)的对应,
或者说找到中间件.
 
用一个通信控件如TDcomConnection或TSocketConnection,通过他们的ComputerName或
address,从而可以由的ServerName属性来获得一个应用程序列表,再做出选择。
 
不是在DELPHI IDE 得到,而是在客户端程序远行中 动态获得.
 
可以注册表来获得所有的serverName,具体的方法我忘了,找到之后再回答吧
嘿嘿
 
TO zenger : 从 A 工作站能读 B 工作站的注册表吗?
 
应该是读取本地注册表,下面给出一个具体的方法,其实实现是在mconnect单元:
procedure GetMIDASAppServerList(List: TStringList;
const RegCheck: string);
var
EnumGUID: IEnumGUID;
Fetched: Cardinal;
Guid: TGUID;
Rslt: HResult;
CatInfo: ICatInformation;
I, BufSize: Integer;
ClassIDKey: HKey;
S: string;
Buffer: array[0..255] of Char;
begin
List.Clear;
Rslt := CoCreateInstance(CLSID_StdComponentCategoryMgr, nil,
CLSCTX_INPROC_SERVER, ICatInformation, CatInfo);
if Succeeded(Rslt) then
begin
OleCheck(CatInfo.EnumClassesOfCategories(1, @CATID_MIDASAppServer, 0, nil, EnumGUID));
while EnumGUID.Next(1, Guid, Fetched) = S_OKdo
begin
if RegCheck <> '' then
begin
S := SClsid + GuidToString(Guid) + '/';
if GetRegStringValue(S, RegCheck) <> SFlagOn then
continue;
end;
List.Add(ClassIDToProgID(Guid));
end;
end else
begin
if RegOpenKey(HKEY_CLASSES_ROOT, 'CLSID', ClassIDKey) <> 0 then
try
I := 0;
while RegEnumKey(ClassIDKey, I, Buffer, SizeOf(Buffer)) = 0do
begin
S := Format('%s/Implemented Categories/%s',[Buffer,
GUIDToString(CATID_MIDASAppServer)]);
if RegQueryValue(ClassIDKey, PChar(S), nil, BufSize) = 0 then
if RegCheck <> '' then
begin
BufSize := 256;
SetLength(S, BufSize);
if RegQueryValueEx(ClassIDKey, PChar(RegCheck), nil, nil,
PByte(PChar(S)), @BufSize) = ERROR_SUCCESS then
SetLength(S, BufSize - 1) else
S := '';
if GetRegStringValue(S, RegCheck) <> SFlagOn then
continue;
end;
List.Add(ClassIDToProgID(StringToGUID(Buffer)));
Inc(I);
end;
finally
RegCloseKey(ClassIDKey);
end;
end;
end;
 
必须用到几个单元
use Db, DBClient, MConnect,ActiveX,COMObj,MidConst;
 
对于不同的机器,你可以先获得邻机器名,再使用下边的函数就可以了
uses mconnect;//在程序头部一定要用这个

procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
begin

List := TStringList.Create;
try
GetMIDASAppServerList(List, '');
ComboBox1.items.text := list.Text ;
finally
List.Free;
end;

end;

 
To zengr: 得邻机器名后在哪儿使用?
 
假如说,现在已经得到了运行应用程序服务器的机器名为:Edit1.Text := 'demo'
则在运行时,Dcomconnection1.ComputerName=Edit1.Text;
再使用上面的函数,不就可以获得了。
chat* xixi
 
还是没看懂邻机器名后在哪儿被GetMIDASAppServerList使用... :(
 
你还是认真看一下mconnect单元
 
顶部