2017-05-18 68 views
0

我正在嘗試使用內存映射文件爲IPC編寫簡單的發送者/接收者類。 在我的代碼的問題,但我不明白我在做什麼錯在這裏:C#內存映射文件,應用程序掛起。怎麼了?

[Serializable] 
public struct MessageData 
{ 
    public int PID; 
    public IntPtr HWND; 
    public string ProcessName; 
    public string ProcessTitle; 
} 

.... 

public static class MMF 
{ 
    private const int MMF_MAX_SIZE = 4096; // allocated memory for this memory mapped file (bytes) 
    private const int MMF_VIEW_SIZE = 4096; // how many bytes of the allocated memory can this process access 

    public static void Write() 
    { 
     var security = new MemoryMappedFileSecurity(); 
     // Create a SecurityIdentifier object for "everyone". 
     SecurityIdentifier everyoneSid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
     security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(everyoneSid, MemoryMappedFileRights.FullControl, AccessControlType.Allow)); 

     using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("Global\\mmf1", MMF_MAX_SIZE, MemoryMappedFileAccess.ReadWrite)) 
     { 
      using (MemoryMappedViewStream mStream = mmf.CreateViewStream(0, MMF_VIEW_SIZE)) 
      { 

       var p = Process.GetCurrentProcess(); 
       MessageData msgData = new MessageData(); 
       msgData.HWND = p.MainWindowHandle; 
       msgData.PID = p.Id; 
       msgData.ProcessName = p.ProcessName; 
       msgData.ProcessTitle = p.MainWindowTitle; 

       // serialize the msgData and write it to the memory mapped file 
       BinaryFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(mStream, msgData); 
       mStream.Flush(); 
       mStream.Seek(0, SeekOrigin.Begin); // sets the current position back to the beginning of the stream 

       //MessageBox.Show("Done"); 
      } 
     } 
    } 
} 

現在,我嘗試測試從主應用程序的形式驗證碼:在Visual

... 
    private void button1_Click(object sender, EventArgs e) 
    { 
     MMF.Write(); 
    } 

而且過程Studio 2015社區掛起。進程運行,但表單界面沒有響應。我只能暫停或停止進程。這是在using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("Global\\mmf1", ...字符串上停止。

我假設應用程序無法創建文件,但沒有任何例外。

所以,如果我將地圖名稱更改爲「mmf1」(不帶「全局」前綴),一切正常,應用程序工作正常。但是就如我從this answerMSDN知道:

添加前綴「全球\」文件映射對象名稱允許進程相互即使它們在不同的終端服務器會話通信。

如果我理解正確,則需要在我的內存映射文件與任何應用程序交互時使用前綴「Global \」,而不管它們運行的​​權限如何。

特別是因爲我試圖設置「everyone」的文件訪問權限。

UPD。此代碼在Win 7/Win 8.1 x64上測試。結果是一樣的。

+1

禁用您的反惡意軟件產品,然後重試。 –

+0

感謝您的回覆,但我在開發人員的PC上沒有任何反郵件軟件。此程序的用戶是否也必須關閉防病毒軟件,才能使用此應用程序? – BlackWitcher

回答

1

您必須以管理員身份運行Visual Studio,才能使用「全局」前綴創建內存映射文件。