2011-07-20 35 views
1

我剛剛添加了這個函數,它決定了要使用哪個mailmerge方法。它似乎可以在XP和Windows 2000上運行。有什麼理由不能在NT,Vista,7和其他Windows版本上運行?我想在註冊表中會有問題嗎?Delphi通過註冊表檢測Word版本

function GetMSOfficeVersion: String; 
var Reg: TRegistry; 
begin 
Result := 'Office Version Not Found'; 
// create the registry object 
Reg := TRegistry.Create; 
try 
// set the root key 
Reg.RootKey := HKEY_LOCAL_MACHINE; 
// check for Office97 
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\8.0', False) then 
begin 
Result := 'Microsoft Office97'; 
end; 
// check for Office2000 
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\9.0', False) then 
begin 
Result := 'Microsoft Office2000'; 
end; 
// check for OfficeXP -- not sure if this is correct 
// you have to verify the key on a machine with OfficeXP 
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\10.0', False) then 
begin 
Result := 'Microsoft OfficeXP(regkey10)'; 
end; 
// check for 11.0 
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\11.0', False) then 
begin 
Result := 'Microsoft OfficeXP(regkey11)'; 
end; 
// check for 12 
if Reg.OpenKey('\SOFTWARE\Microsoft\Office\12.0', False) then 
begin 
Result := 'Microsoft Office2010'; 
end; 
finally 
// make sure we free the object we created 
Reg.Free; 
end; 
end; 
+0

嘗試在Vista/Win7上以管理員身份運行您的應用程序。 – Jeff

+1

另外 - 即使它可能不是必需的,你可以在Result:= ...後添加'Exit;',它會跳到最後,而不執行所有其他檢查。 :) – Jeff

+0

你得到的錯誤信息是什麼?這是一個安全/用戶相關的錯誤?此外,Office \ 14.0是Office2010我認爲Office \ 12.0是2007. –

回答

2

除了確保您創建只讀模式註冊表,像TOndrej建議,你也想修復的版本匹配的代碼,因爲它是錯誤

這裏是哪裏的東西變得黑幕在你的代碼片段中的部分正確的數字:

10.0 = Office XP 
11.0 = Office 2003 
12.0 = Office 2007 
13.0 - doesn't exist, obvious Microsoft/US numbering standards. 
14.0 = Office 2010 
+0

版本13因爲某些建築物沒有13樓的原因而不存在。 –

+0

是的。十三恐懼症。 –

+0

非常感謝ALOT的故障,因爲該程序只對Word2010做出反應,我從未注意到該錯誤。我從這裏複製了這段代碼:http://www.delphipages.com/forum/showthread.php?t = 55296你能解釋爲什麼它對Word2010的安裝有正確的反應嗎?即使根據你的指導,它應該認爲我有Word2007 – notidaho

6

可能沒有足夠的權限。嘗試使用OpenKeyReadOnly而不是OpenKey

+0

OpenKeyReadOnly更改Access標誌,渲染Create(KEY_READ)無用。只需使用一種方法。 –

+0

@The_Fox謝謝,修正。 –

+0

'OpenKey'將打開寫入權限的密鑰。在基於NT的系統上,您沒有作爲標準用戶的寫入權限。這個答案是唯一的答案。 –

1

「沒有任何理由爲什麼它不會工作」

是,個別產品可能會創建一個Software\Office\#.0項,您應該檢查特定版本密鑰中的Word子項。即使如此,f.i. 'Word Viewer'可能創建了不會進行郵件合併的Word子項。如果你真的想在註冊表中更好地尋找HKEY_CLASSES_ROOT中的Word.Application鍵。除了Word.Application.#密鑰外,Word.Application密鑰本身還有一個CurVer子密鑰。


(以前我提出以下,但福克斯對問題的意見要好得多,我認爲)。

我會直接嘗試創建自動化對象,如果失敗,那麼該版本不可用,回退到較低的版本。或者某事。如:

function IsWord14: Boolean; 
begin 
    Result := True; 
    try 
    CreateOleObject('Word.Application.14'); 
    except on E:EOleSysError do 
    if E.ErrorCode = HRESULT($800401F3) then // invalid class string 
     Result := False 
    else 
     raise; 
    end; 
end; 
+0

感謝Sertac我不敢相信我對Application.Version不瞭解!但顯然這意味着在確定操作之前創建OleObject。實際上,我只需要測試它是否是Word2010,並且可能會在出現新版本時嘗試運行。有趣的是,我可能不需要該版本,但感謝所有提示:) – notidaho

+0

@notidaho - 如果您有首選版本並嘗試創建ole對象,如果類字符串無效,則創建失敗會很快。沒有傷害完成。如果沒有失敗,您可以使用它。 :)無論如何,不​​要因爲我所說的原因檢查'辦公室'鍵,而是閱讀'Word.Application'下的'CurVer'。 –

+0

所以我想我需要一個函數getMSOfficeVersion:String,它只是返回版本。我不完全理解OleObjects ...我可以創建一個Word.Application來獲取版本,然後簡單地保留它?或者我必須在某種程度上殺死它?當我以後需要Windows.Application的oleobject時,我必須重新創建它嗎? – notidaho