Service创建的COM对象与一般应用程序创建的COM对象有何不同! (100分)

  • 主题发起人 主题发起人 浦欣
  • 开始时间 开始时间

浦欣

Unregistered / Unconfirmed
GUEST, unregistred user!
如题!
(我还有一个问题没有找到答案-其实是一个问题,加起来共400分,谁帮忙解决此问题,分全给他)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=989623

也就是说,如何让应用程序调用Service创建的COM对象,或让Service调用应用程序创建的COM
对象?
 
>>如何取得当前已经创建的COM对象的接口并使用?
自己创建COM对象,然后使用就可以了,需要管这么多吗?
 
我需要不同程序之间通过COM通讯!
 
关注一下,TCOMObject 对象的共享可能有点问题,但是TAutoObject就肯定可以,用
CreateOLEObject 建立 Automation Variant
GetActiveOleObject 可以得到已经创建的 AutoObject Instance

对于服务程序创建的Auto对象可否被应用程序获取object instance就不是很清楚了

 
是TAutoObject,是用GetActiveObject取COM对象的实例,而且在Delphi中测试是成功的,但我
的目的是在Service中实现,在Service中用GetActiveObject老是找不到COM对象的实例!
 
我对COM不熟,我不知道GetActiveObject,CoGetClassObject,GetActiveOleObject, CoGetInstanceFromIStorage
有什么不同,在Service中调用又应该用哪个?
 
其实就是一个接口的问题!
 
不太明白!
 
请介绍一些Windows Service下编程的书籍或资料?(编写Service的)
 
呵呵 Sorry!近视,没看清楚问题
 
http://www.techvanguards.com/com/tutorials/tips.asp
第九个tip,明确说明,这里面有一个权限的问题,下面的帖子讨论了一点关于权限的皮毛,
我会考虑一下如何将你使用SYSTEM创建的Service COM Object能够被Administrator使用
http://www.delphibbs.com/delphibbs/dispq.asp?lid=862030
 
谢谢DragonPC_??? !
 
是这个意思吗?
var
ServerIf: I接口;
begin
try
ServerIf := CreateComObject(ProgIDToClassID('Project1.DataAccess')) as I接口;
//'Project1.DataAccess'是你的ServerName
except
ServerIf := nil;
end;
if Assigned(ServerIf) then
begin
Showmessage('Connected server');
end
else begin
Showmessage('Unable to connect to server');
end;
end;
 
我先用GetActiveObject取对象,如果取不到就用CreateComObject创建对象,在普通程序可以
取到对象,但在Service中就取不到了.
 
我没有做过COM方面的东东,但Service做过,我猜你是权限问题....
Application是以Administrator或其它的用户身份运行的,而Service是以System身份运行。
你可以试一下将Service的身份切换到当前用户...再试那个COM,也许就OK了...
贴一段代码...这是我的Service中使用的....其目的是在用户登录后...能在Tray显示Service的图标
这是其中的部份:
procedure TfLog.wndproc(var message: Tmessage);
var
processHandle, userToken : THandle;
begin
inherited;
if Message.Msg=WM_iMessagerShowTrayIcon then begin
//== ÊÇÍⲿ³ÌÐòÒªÇóÏÔʾTrayIcon
RevertToSelf; // »Ö¸´µ½×Ô¼ºµÄÉí·Ý
processHandle := OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, Message.LParam);
if processHandle=0 then
exit; //ÎÞ·¨´ò¿ª½ø³Ì

if (not OpenProcessToken(processHandle, TOKEN_QUERY or TOKEN_DUPLICATE or TOKEN_IMPERSONATE, userToken)) then begin
CloseHandle(processHandle);
exit; // ´ò¿ª½ø³ÌTokenʧ°Ü
end;
CloseHandle(processHandle);

if (not ImpersonateLoggedOnUser(userToken)) then begin
CloseHandle(userToken);
exit; // Ä£·ÂÓû§Ê§°Ü
end;
CloseHandle(userToken);
......

在使用时,你的Application发个Message给Service,让Service知道现在有用户登录了...然后
Service就执行这段代码,将自己的身份切换到当前用户....
 
谢谢Primer我马上试试
 
问题已解决,谢谢各位!
 
后退
顶部