我在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正在运行并且
这种情况总是发生,我在Windows 7上使用Delphi 7,以Run as Admin运行。请告诉我为什么会这样,以及如何解决这个问题。
Windows 7上的Delphi 7问题是什么。
请建议。
答案 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