2012-02-10 64 views
1

我正在運行Windows 7 Ultimate 64位。使用Windows服務進行數據執行保護

我有一個Windows服務(用C#編寫)調用由南非一家大型電信服務提供商(TELKOM)發佈的dll。該DLL被稱爲MPIEst.dll,我相信它是用C++編寫的。鏈接中的人(http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/a7e5aafc-bb52-42c3-a3e7-19cb4cfbf6d5/)有一樣的問題,我有。

經過一番研究,我發現DEP(數據執行保護)是由於錯誤「無法加載DLL'MPIest.dll':內存位置無效訪問(來自HRESULT的異常:0x800703E6)」。所以我想「好吧,這很簡單......讓我們關閉整個電腦的DEP,看看會發生什麼」。所以我這樣做,結果變得更加怪異...... Windows服務成功運行,沒有任何反應,但所有對DLL的調用都不做任何事情。

我知道這一點,因爲當我編寫使用DLL的正常C#控制檯應用程序時,DLL方法返回值並正常工作,但是當從Windows服務中運行時,DLL方法返回一個非零結果,表明出了點問題。問題是沒有說明返回代碼含義的文檔。

無論如何,底線是以某種方式關閉整個系統的DEP不會影響Windows服務。 有沒有人遇到過這個? Windows服務和控制檯應用程序調用完全相同的代碼並執行完全相同的操作,但控制檯應用程序正常工作,而Windows服務默默無聞,但DEP關閉整個系統。

在此先感謝。

回答

2

找到解決方案。解決方案實際上是雙重的。 首先是DEP,您需要關閉整個計算機,然後重新啓動計算機(這是因爲無法通過控制面板關閉Windows服務的DEP)。

然後,其次,我使用「ProcessMonitor」應用程序來查看Windows服務和「MPIEst.dll」在幕後操作系統。事實證明,即使該文件與Windows服務可執行文件位於同一目錄中,該DLL仍在搜索它所依賴的文件(client.mpi)在系統目錄文件夾中。 因此,我添加了代碼,將必要的文件複製到系統目錄,一切正常。