2014-02-26 35 views
0

如何獲得Windows服務的'Handle',以便從Windows應用程序傳遞Memory Mapped消息。都是用Delphi編寫的。手柄 - Windows服務

+0

['OpenService'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684330(v = vs.85).aspx)? – TLama

+0

@TLama:'OpenService()'不返回可以發送消息的句柄。但是,如果消息不需要任何參數,它會返回一個可以與'ControlService()'一起使用的句柄。 –

+0

@雷米,我知道它的目的。我已經放棄了該評論,因爲'OpenService'調用返回的'SC_HANDLE'是我在討論Windows服務時唯一能想到的句柄。具體問題是如何獲得服務句柄(儘管這不是一個正確的問題)。 – TLama

回答

2

服務的句柄不是你在這裏需要的。內存映射文件被命名爲內核對象。所以你需要爲你的文件映射確定一個名稱,並使用它來鏈接你的兩個進程。

當您調用CreateFileMapping來創建文件映射或打開由其他進程創建的現有文件映射時,您將該名稱作爲最後一個參數傳遞。您需要使用Global\名稱空間前綴來確保文件映射位於全局名稱空間中,並可在不同會話中訪問。

內存映射文件是IPC在服務和桌面之間的不尋常選擇。人們通常會期望看到命名的管道或套接字。

+0

請注意'CreateFileMapping()'[文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537.aspx)中的以下內容:「在全局中創建文件映射對象來自會話零以外的會話的名稱空間需要「SeCreateGlobalPrivilege」特權。「因此,應該在應用中的服務和'OpenFileMapping()'中使用'CreateFileMapping()',因爲應用不可能具有'SeCreateGlobalPrivilege'特權,除非它作爲管理員運行。 –

+0

我一直在使用TcpIp套接字的IPC,但必須處理防火牆不必要地阻止我的應用程序。命名管道也會有類似的問題。如果我使用內存映射郵件防火牆不會阻止我的應用程序。通訊速度可能非常高,我需要其他應用程序立即響應。 –

+0

使用文件映射在資源上會更重,而且我需要接收應用程序的事件被激活,如wmcopydata() –