2011-11-09 171 views
3

我使用Delphi 7,在Windows 7 32位操作系统上使用Outlook 2010。Delphi Outlook 2007/2010

我的问题是我无法检测到我的Outlook正在运行或没有运行。 我试过下面的代码。

uses 
    ComObj, ActiveX; 

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; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if IsObjectActive('Outlook.Application') then ShowMessage('Outlook is running !'); 
end; 

使用上面的代码,delphi没有检测到Outlook正在运行。

你能告诉我有没有什么好的替代方法。在我的应用程序中,我使用的是Outlook Redemption,因此在Redemption中有什么,以便我可以检测到Outlook正在运行?

+1

我想你正在运行德尔福(因此你的程序)或Outlook与提升的特权?当以管理员身份运行Delphi时,我可以复制该问题,而不是在正常运行时。 – MGH

+0

如果您没有使用不同的高度/高程水平运行......在上面的示例中,您是否仅使用_start_ Outlook?在没有焦点切换之前,Outlook不会将自己注册到运行对象表中(通过getActiveObject查询)。 Delphi代码中的 –

回答

2

您可以检查outlook.exe进程是否正在运行。

+0

,没有循环,我该怎么做? –

+0

@ VijeshV.Nair:循环出了什么问题? –

0

我希望这有帮助。

library IsCra; 

uses 
    SysUtils, 
    Classes, 
    Windows, 
    TlHelp32; 

{$R *.res} 

function AppIsRunning(AApp: String): Boolean; stdcall; 
var 
    h: THandle; 
    p: TProcessEntry32; 
begin 
    Result := False; 

    p.dwSize := SizeOf(p); 
    h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0); 
    try 
    Process32First(h, p); 
    repeat 
     Result := AnsiUpperCase(AApp) = AnsiUpperCase(p.szExeFile); 
    until Result or (not Process32Next(h, p)); 
    finally 
    CloseHandle(h); 
    end; 
end; 

exports 
    AppIsRunning; 

begin 
end. 
+0

我不认为OP会需要你在这里使用的“dll project”格式。将“库”更改为“单元”,并在结束前立即删除导出和“开始”,并添加接口和实现关键字,并且您将拥有一个可包含在自己的代码中的有效单元。发布独立的可编译的DLL演示可能不太理想。 –

+0

我希望大多数人复制函数并将其放在代码中。我使用这个DLL来进行inno setup,以知道在新安装之前应用程序是否正在运行。 – Ravaut123