为什么GetActiveObject无法检测到正在运行的Outlook实例?

时间:2011-12-23 07:54:32

标签: delphi windows-7 outlook delphi-7

我在windows7 32bit Pc(在i3上)遇到问题。我有Outlook 2010和Delphi 7。 我正在使用以下代码来检测Outlook是否正在运行。

ClassID := ProgIDToClassID(ClassName);
Result  := (GetActiveObject(ClassID, nil, Unknown) = S_OK);

这失败了,即结果变得虚假,但在其他PC中这种工作正常。

我得到的错误是MK_E_Unavailable。

更新

可能只是和我一起发生。

procedure TForm1.Button1Click(Sender: TObject);
function IsObjectActive(ClassName: string): Boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  try
    ClassID := ProgIDToClassID(ClassName);
    Result  := (GetActiveObject(ClassID, nil, Unknown) =S_OK );
  except
      Result := False;
    end;
end;
begin
  if IsObjectActive('Outlook.Application') Then
    ShowMessage('OutLook is there.')
  else
    ShowMessage('OutLook is not there.')
end;

Plz note OL正在运行并且

  • 当我运行创建的exe时,我收到消息" OutLook就在那里"。
  • 当我从Delphi IDE运行时,我收到消息' OutLook不存在。'

这种情况总是发生,我在Windows 7上使用Delphi 7,以Run as Admin运行。请告诉我为什么会这样,以及如何解决这个问题。

Windows 7上的Delphi 7问题是什么。

请建议。

3 个答案:

答案 0 :(得分:0)

这是GetActiveObject的条目 http://msdn.microsoft.com/en-us/library/a276e30c-6a7f-4cde-9639-21a9f5170b62%28VS.85%29

如果您想解码错误,您需要找出HResult的含义 Wikipedia有一个指向MS的 ERR.EXE utility 的链接,它会将HResult代码转换为错误说明。对于COM HResults,请参阅:http://matthewbass.com/2005/11/15/decoding-com-hresult-error-codes/ 注意文章中的下载链接已损坏,这是一个有用的链接:http://www.softlookup.com/display.asp?id=7113 一旦知道错误是什么,请更新问题。

如果您想知道某个进程是否在不使用OLE的情况下运行,请参阅:How to check if a process is running using Delphi?

另一个选项可能是使用FindWindowEx来检查Outlook 2010特定的窗口 您可以使用WinID (a spy++ clone)查看Outlook 2010使用的窗口。

答案 1 :(得分:0)

我遇到了同样的问题,我找到了解决方案。

很简单,如果Outlook已经运行,必须与尝试使用它的进程具有相同的权限。

简单来说,如果您使用管理员权限运行Outlook,则必须使用管理员权限执行您的应用程序。

您的问题必须是您在没有管理员权限的情况下运行Outlook,以及具有管理员权限的Delphi IDE。因此,当您从IDE中启动应用程序时,权限不匹配,并且您收到错误。这就是为什么在IDE外部运行您的应用程序时,它按预期工作。因为在IDE之外,您的应用程序无需管理员权限即可运行。

尝试匹配权限。这也是最终用户环境需要考虑的因素。

此外,已知Windows Vista及更高版本下的UAC会导致这些类型的问题出现多个问题。如果其他一切都失败了,请禁用UAC(用户帐户控制,您将在帐户选项下找到它),看看会发生什么。

答案 2 :(得分:-2)

尝试使用rctrl_renwnd32

尝试一下:

(FindWindow('rctrl_renwnd32', nil) <> 0)

http://users.skynet.be/am044448/Programmeren/VBA/vba_class_names.htm