2011-11-09 116 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