2014-01-13 33 views
0

我使用此代碼來檢查,如果前景是默認郵件客戶端:如何檢查前景是默認郵件客戶端

Function IsOutlookIsDefaultEmailPrg:Boolean; 
var 
    reg: TRegistry; 
    key : string; 
begin 
    Result := False; 
    with TRegistry.Create do 
    TRY 
    RootKey := HKEY_LOCAL_MACHINE; 
    if OpenKeyReadOnly('Software\Clients\Mail') then 
    begin 
     key := Uppercase(ReadString('')); //default value 
    end; 
    result := (Pos('MICROSOFT OUTLOOK',Key) > 0); 
    FINALLY 
    Free; 
    END; 
end; 

它的作品一般,但在某些PC的已報道不工作,我檢查並註冊表鍵在那裏。

是否Pos區分大小寫?任何想法爲什麼這有時無法工作?有什麼更好的建議?

+0

您的程序是32位還是64位?在代碼失敗的機器上運行什麼操作系統?有沒有可能是Vista? –

+0

32位,否Vista – LaBracca

+0

選中此[MSDN鏈接](http://msdn.microsoft.com/en-us/library/dd203067%28VS.85%29.aspx)。它適用於從Windows XP到Windows 7.不知道Windows 8 –

回答

4

我看到您使用HKLM鍵來檢查默認客戶端,但這可以是用戶依賴的,所以您應該確實檢查HKCU條目(如果HKCU沒有條目,則退回到HKLM)。 我也去掉了With聲明和使用的ContainsText(包括StrUtils單元)函數,而不是Pos

function IsOutlookTheDefaultEmailClient:Boolean; 
var 
    Reg : TRegistry;  
begin 
    Result := False; 
    Reg := TRegistry.Create; 
    try 
    // first check HKCU 
    Reg.RootKey := HKEY_CURRENT_USER; 
    if Reg.OpenKeyReadOnly('Software\Clients\Mail') then 
    begin 
     Result := ContainsText(Reg.ReadString(''), 'Microsoft Outlook'); 
     Reg.CloseKey; 
    end 
    // fall back to HKLM 
    else 
    begin 
    Reg.RootKey := HKEY_LOCAL_MACHINE; 
    // this part is susceptible to registry virtualization and my need elevation! 
    if Reg.OpenKeyReadOnly('Software\Clients\Mail') then 
     begin 
     Result := ContainsText(Reg.ReadString(''), 'Microsoft Outlook'); 
     Reg.CloseKey; 
     end; 
    end; 
    finally 
    Reg.Free; 
    end; 
end; 

編輯

唯一的一次,這些代碼可能會失敗時Registry virtualization進場。這在UAC場景中是典型的。 請一個失敗的計算機上檢查,如果該鍵在註冊表編輯器中存在:

HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Clients\Mail 

,如果是這樣的話,你的應用程序將讀取該鍵而不是真正的HKLM關鍵。唯一的解決辦法是請求提升或以管理員身份運行你的應用

+0

感謝您的回覆。你能解釋一下,我修改後的函數如何給出不同的結果,因爲我只是想讀取一個值(而不是寫入)? – LaBracca

+0

在2個win7機器上,我嘗試了兩個函數(我的一個和whosrdaddy修改的),他們都返回True。 – LaBracca

+0

@ user193655密鑰包含什麼? – whosrdaddy

2

這是我對問題的理解:

  1. Pos功能是區分大小寫的。所以如果值是Microsoft Outlook那麼你的測試就不會找到它。你應該改用ContainsText。它不僅可以做你想做的事,而且它比Pos()>0更可讀。
  2. system checks first in HKCU\Software\Clients\Mail。如果沒有找到默認的郵件客戶端,那麼它會檢查HKLM\Software\Clients\Mail。你應該這樣做。
  3. 在Windows 7和更高版本上,HKCU\Software\ClientsHKLM\Software\Clients\Mail都是shared。在早期版本的Windows上,它們是redirected。那裏有錯誤的可能性。您應該使用KEY_WOW64_64KEY來訪問註冊表的64位視圖。
+0

感謝您的回答,其實問題出在Windows XP上。那麼你建議我做什麼? – LaBracca

+0

我建議你找出註冊表在這些機器上的樣子,看看你是否可以想出一個理由 –

相關問題