2011-07-26 114 views
2

我正在使用vs2005用C++編寫的windows服務,我遇到了問題。從服務運行程序

該服務必須啓動其他小型可執行文件並獲取它的輸出。我通過調用CreateProcess來做到這點(一個庫實際上對我來說(libexecstream)),它可以工作。

正在啓動的可執行文件位於磁盤上某處,我不知道它在哪裏,它的目錄位於路徑環境變量中。我的服務只是啓動「theTool.exe」,在這裏我們去。
如果路徑變量如下所示:smting;smthingelse;C:\Program Files\blah\bin;meow它的工作原理。
但是,如果路徑如下所示:smting;smthingelse;%ProgramFiles%\blah\bin;meow它不再有效!

問題是,在一些機器上它看起來像第一個,在其他人像第二個...
有趣的是,如果我在控制檯啓動它(而不是作爲服務)它工作正常!

有沒有辦法避免這個問題?編程? 像手動改變它的解決方案不是一個選項(客戶端不需要它)。在安裝腳本或類似的東西中更改它不是一個選項,因爲之後可能會更改路徑。
修改工具不是一個選項,因爲我們沒有這樣做,我們沒有源代碼。

編輯: 的CreateProcess的行看起來是這樣的:

STARTUPINFO si; 
ZeroMemory(&si, sizeof(si)); 
si.cb=sizeof(si); 
si.hStdError = err.w(); 
si.hStdOutput = out.w(); 
si.hStdInput = in.r(); 
si.dwFlags |= STARTF_USESTDHANDLES; 
PROCESS_INFORMATION pi; 
ZeroMemory(&pi, sizeof(pi)); 
if(!CreateProcess(0, const_cast< char * >(command.c_str()), 0, 0, TRUE, 0, 0, 0, &si, &pi)) { 
throw os_error_t("exec_stream_t::start: CreateProcess failed.\n command line was: "+command); 
} 

其中command是 「theTool」

第二編輯:如果我的程序啓動,因爲它無法服務,如果它是在它可以工作的控制檯中啓動的

+0

你在64位或32位平臺上運行它嗎?所有支持的平臺都是相同的架構嗎? – Chad

+0

@Chad 32bit - 是的 – foke

回答

2

%ProgramFiles%是您的另一個環境變量環境變量值條目。你需要解決它。如果在解析出遇到此模式的路徑時,應該查看它並使用所有部分的UNC路徑指向您的文件。

夫婦的方式對皮膚這裏的貓:

  • 使用GetEnvironmentStrings窗口API得到的一切行動前,把他們的地圖,便於查找您的服務
  • 使用GetEnviromentVariable檢查存在,並得到例如特定的環境變量ProgramFiles
  • 查詢註冊表中的環境變量在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
  • 值設置自己的環境變量,而不是使用PATH應保留給系統的東西,而不是與反正
  • 周圍上當使用具有的功能來處理環境變量
  • 忘記環境變量和使用配置文件中的更強大的文件系統庫(這可以通過一個簡單的陪同GUI程序,允許他們使用一個打開文件對話框,瀏覽並選擇將被存儲路徑爲您服務,拿起和以後使用)
+0

所以你建議手動掃描路徑? (我指的是你的前三個解決方案)聽起來像是一些應該開箱即用的工作的很多工作:至於第四和第六,正如我對亞當說的那樣,我們不控制什麼工具確實。 – foke

+0

因此,如果我正確理解你的服務,你的服務必須使用一個無法更改且無法使用的應用程序?這是一個難題。 – AJG85

+0

它確實有效!該服務在作爲服務運行時未能調用它。從控制檯它工作正常 – foke

3

環境變量的問題可能會非常棘手,尤其是當你正在談論服務。一些想法:

  1. 使用process explorer來驗證進程正在運行的用戶。確保運行該服務的用戶具有適當的環境變量設置(儘管這應該不像%programfiles%那樣是個問題)

  2. 如果以某種方式通過編程方式更改環境變量,有知道緩存environment vars on startup的問題。

只是有些想法。

+0

不涉及所涉及變量的修改:/ – foke

0

除了使用CreateProcess之外,您可以改爲use the App Paths registry key並使用ShellExecute啓動應用程序。這可以避免污染PATH環境變量。

+0

'工具'不是我們的,我們沒有源代碼,我們也沒有選擇使用它。所以路徑解決方案或多或少地強加給我們。我會看看它是否在App Path註冊表項中註冊,但我懷疑它。 – foke