使用COM接口
1. 找到接口描述文件COMAdmin_TLB.pas
还是用了个笨办法,新建一个ActiveX Library,再新建一个COM Object,随便起个名字吧。保存。
然后选菜单View->Type Library,在右边Uses页中点右键,选择查看所有类型库,找到COM+1.0 Admin Type Library,保存。OK,在你的保存目录下有了一个COMAdmin_TLB.pas,拷出来,其它的可以删除啦:)
2. 我们来删除一个COM+应用程序
新建一个Delphi工程,保存。添加我们刚才生成的COMAdmin_TLB.pas,别忘了uses啊:)
在COMAdmin_TLB.pas中一共有三个接口,看名字大概能猜出几分
ICOMAdminCatalog 管理COM+目录的接口
ICatalogObject COM+对象的接口
ICatalogCollection COM+对象集合的接口procedure TForm1.Button1Click(Sender: TObject);
var
temp:IDispatch;
i:integer;
CataColl:ICatalogCollection;
CataObj:ICatalogObject;
COMADminCata:ICOMAdminCatalog;
begin
//先创建一个ICOMAdminCatalog的接口指针,用于
self.COMADminCata := CoCOMAdminCatalog.Create;
//取得ICatalogCollection的接口指针,指向的是COM+应用程序的集合,注意参数是
//字符串,Delphi帮助中有这样一段话:有效的集合依赖于你的COMAdmin Library的
//版本,查看微软的文档来找到在你的COMAdmin Library版本中有效的集合
temp := self.COMADminCata.GetCollection('Applications');
self.CataColl := Iunknown(temp) as ICataLogCollection;
//下一句不可少,执行了它才真正读到的数据
self.CataColl.Populate;
//来个循环查找并删除,你可以新建一个叫aaa的COM+应用程序来进行测试,循环次
//数为COM+应用程序的个数 –1,因为我们在循环中删了一个COM+应用程序
for i := 0 to self.CataColl.Count - 2 do
begin
//这是取第I个应用程序集合中的对象
self.CataObj := Iunknown(self.CataColl.Item[i]) as ICatalogObject;
//你可以打出来名字看看和你在组件服务中的是否一样
showmessage(self.CataObj.Name);
//如果对象名字是aaa,那么我们要进行删除啦
if self.CataObj.Name = 'aaa' then
begin
self.CataColl.Remove(i);
//下一句有点像提交事务,如果你不写,是不会真正删除的
self.CataColl.SaveChanges;
end;
end;
end;使用Delphi控件
无意中点了一下帮助,居然发现Delphi有一个类将这些接口封装了(Delphi就是好,呵呵)。好,我们就用这个控件封装的类来实现删除
类定义在CmAdmCtl中,在主窗体中uses一下即可
对应于前面描述的COM接口,Delphi为我们封装了三个类
TCOMAdminCatalog = class(TOleServer)
TCOMAdminCatalogObject = class(TOleServer)
TCOMAdminCatalogCollection = class(TOleServer)
有了前面的描述,第二个程序好写多了
procedure TForm1.Button2Click(Sender: TObject);
var
CataColl:TCOMAdminCatalogCollection;
CataObj:TCOMAdminCatalogObject;
COMADminCata:TCOMAdminCatalog;
i:integer;
begin
COMADminCata := TCOMAdminCatalog.Create(self);
CataColl := COMADminCata.GetCollection('Applications');
CataColl.Populate;
for i := 0 to CataColl.Count - 2 do
begin
CataObj := CataColl.Get_Item(i);
showmessage(CataObj.Name);
if CataObj.Name = 'aaa' then
begin
CataColl.Remove(i);
CataColl.SaveChanges;
end;
end;
COMADminCata.Free;
end;还有很多功能,比如导出应用程序,安装应用程序等等操作,函数名写的很清楚,具体可以看Delphi的帮助
1. 找到接口描述文件COMAdmin_TLB.pas
还是用了个笨办法,新建一个ActiveX Library,再新建一个COM Object,随便起个名字吧。保存。
然后选菜单View->Type Library,在右边Uses页中点右键,选择查看所有类型库,找到COM+1.0 Admin Type Library,保存。OK,在你的保存目录下有了一个COMAdmin_TLB.pas,拷出来,其它的可以删除啦:)
2. 我们来删除一个COM+应用程序
新建一个Delphi工程,保存。添加我们刚才生成的COMAdmin_TLB.pas,别忘了uses啊:)
在COMAdmin_TLB.pas中一共有三个接口,看名字大概能猜出几分
ICOMAdminCatalog 管理COM+目录的接口
ICatalogObject COM+对象的接口
ICatalogCollection COM+对象集合的接口procedure TForm1.Button1Click(Sender: TObject);
var
temp:IDispatch;
i:integer;
CataColl:ICatalogCollection;
CataObj:ICatalogObject;
COMADminCata:ICOMAdminCatalog;
begin
//先创建一个ICOMAdminCatalog的接口指针,用于
self.COMADminCata := CoCOMAdminCatalog.Create;
//取得ICatalogCollection的接口指针,指向的是COM+应用程序的集合,注意参数是
//字符串,Delphi帮助中有这样一段话:有效的集合依赖于你的COMAdmin Library的
//版本,查看微软的文档来找到在你的COMAdmin Library版本中有效的集合
temp := self.COMADminCata.GetCollection('Applications');
self.CataColl := Iunknown(temp) as ICataLogCollection;
//下一句不可少,执行了它才真正读到的数据
self.CataColl.Populate;
//来个循环查找并删除,你可以新建一个叫aaa的COM+应用程序来进行测试,循环次
//数为COM+应用程序的个数 –1,因为我们在循环中删了一个COM+应用程序
for i := 0 to self.CataColl.Count - 2 do
begin
//这是取第I个应用程序集合中的对象
self.CataObj := Iunknown(self.CataColl.Item[i]) as ICatalogObject;
//你可以打出来名字看看和你在组件服务中的是否一样
showmessage(self.CataObj.Name);
//如果对象名字是aaa,那么我们要进行删除啦
if self.CataObj.Name = 'aaa' then
begin
self.CataColl.Remove(i);
//下一句有点像提交事务,如果你不写,是不会真正删除的
self.CataColl.SaveChanges;
end;
end;
end;使用Delphi控件
无意中点了一下帮助,居然发现Delphi有一个类将这些接口封装了(Delphi就是好,呵呵)。好,我们就用这个控件封装的类来实现删除
类定义在CmAdmCtl中,在主窗体中uses一下即可
对应于前面描述的COM接口,Delphi为我们封装了三个类
TCOMAdminCatalog = class(TOleServer)
TCOMAdminCatalogObject = class(TOleServer)
TCOMAdminCatalogCollection = class(TOleServer)
有了前面的描述,第二个程序好写多了
procedure TForm1.Button2Click(Sender: TObject);
var
CataColl:TCOMAdminCatalogCollection;
CataObj:TCOMAdminCatalogObject;
COMADminCata:TCOMAdminCatalog;
i:integer;
begin
COMADminCata := TCOMAdminCatalog.Create(self);
CataColl := COMADminCata.GetCollection('Applications');
CataColl.Populate;
for i := 0 to CataColl.Count - 2 do
begin
CataObj := CataColl.Get_Item(i);
showmessage(CataObj.Name);
if CataObj.Name = 'aaa' then
begin
CataColl.Remove(i);
CataColl.SaveChanges;
end;
end;
COMADminCata.Free;
end;还有很多功能,比如导出应用程序,安装应用程序等等操作,函数名写的很清楚,具体可以看Delphi的帮助
http://www.5ierp.com/download/comjadmin.exe
欢迎访问我的网站 www.5ierp.com
欢迎访问我的网站 www.5ierp.com
今天从别人机器上导出了个代理程序,注册在自己的机器上,在组件服务里查看COM+应用程序的属性,发现代理程序有一个属性是可以修改的,就是远程服务器名称,在更改了此名称后,程序中不需要用CreateRemote函数,也可以申请到远程接口指针。可是我们应该给用户一个友好的界面,不能总让用户打开组件服务吧,来,我们写个程序吧。
这次我们只用Delphi控件好啦(唉,懒就一个字^_^)
定义三个变量
CataColl:TCOMAdminCatalogCollection;
CataObj:TCOMAdminCatalogObject;
COMADminCata:TCOMAdminCatalog;
begin
COMADminCata := TCOMAdminCatalog.Create(self);
CataColl := COMADminCata.GetCollection('Applications');
CataColl.Populate;
for i := 0 to CataColl.Count - 1 do
begin
CataObj := CataColl.Get_Item(i);
if CataObj.Name = 你的应用程序名 then
begin
CataObj.Set_Value('ApplicationProxyServerName',新服务器名);
CataColl.SaveChanges; //记着保存修改
break;
end;
end;
end;
代码并不长,关键的函数是Set_Value,函数原型如下:
procedure Set_Value(const bstrPropName: WideString; retval: OleVariant);
关键是这个bstrPropName――属性的名称,字符串类型,到底是什么字符串呢?我翻了一通MSDN,还是没找到到底该用什么值,瞎猜了一通也不对。微软就是搞笑,给了一个函数,却不给怎么调用,或许是我笨,没找到。不过笨人也有笨办法,把这些属性值找出来。
TCOMAdminCatalogCollection这个变量保存的是一个集合(Collection),变量通过GetCollection函数来赋值,MSDN中有对这些集合的说明,找到了一个PropertyInfo集合(看着像),于是把它取了出来,用for循环进行遍历,就可以得到相应的属性名了,代码如下:
CataColl := CataColl.GetCollection('PropertyInfo',CataObj.Get_Key);
CataColl.Populate;
for j := 0 to CataColl.Count - 1 do
begin
CataObj := CataColl.Get_Item(j);
self.Memo1.Lines.Add(CataObj.Name);
end;
从Memo中就可以读出各个属性值了。对COM+目录的操作就是一个取集合和遍历集合的过程,大家自己去举一反三吧^_^
以下是PropertyInfo集合的各个属性名称,也就是Set_Value方法的第一个参数bstrPropName的值:
Name
ID
Description
IsSystem
Authentication
ShutdownAfter
RunForever
Identity
Password
Activation
Changeable
Deleteable
CreatedBy
AccessChecksLevel
ApplicationAccessChecksEnabled
CommandLine
ImpersonationLevel
CRMEnabled
AuthenticationCapability
3GigSupportEnabled
QueuingEnabled
QueueListenerEnabled
EventsEnabled
ApplicationProxy
ApplicationProxyServerName
CRMLogFile