2011-08-29 84 views
0

我們開發了一個XP應用程序,它在阻塞模式下使用ConnectNamedPipe()。從XP到Win 7遷移ConnectNamedPipe()的問題

在Win 7上進行測試時,該應用程序的行爲與解除阻塞相同:ConnectNamedPipe()在其VBS客戶端連接之前返回。調用StreamReader.ReadLine()時引發異常(「等待進程打開管道的另一端」)。使用調試器運行時,即使在Win 7中也不會發生這種情況!

這是我們正在使用的功能: [

DllImport("kernel32.dll", SetLastError = true)] 
public static extern SafeFileHandle CreateNamedPipe(
String pipeName, 
uint dwOpenMode, 
uint dwPipeMode, 
uint nMaxInstances, 
uint nOutBufferSize, 
uint nInBufferSize, 
uint nDefaultTimeOut, 
IntPtr lpSecurityAttributes); 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern int ConnectNamedPipe(
SafeFileHandle hNamedPipe, 
IntPtr lpOverlapped); 

我們寫此之後,我們發現,從CodePlex上多功能一站式示例代碼庫示例,這是否一個MS例如:(我們是現在試試這個)

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      public static extern SafePipeHandle CreateNamedPipe(string pipeName, 
       PipeOpenMode openMode, PipeMode pipeMode, int maxInstances, 
       int outBufferSize, int inBufferSize, uint defaultTimeout, 
       SECURITY_ATTRIBUTES securityAttributes); 
      [return: MarshalAs(UnmanagedType.Bool)] 
      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      public static extern bool ConnectNamedPipe(SafePipeHandle hNamedPipe, 
       IntPtr overlapped); 

有沒有人有一個方向的想法?它可能與安全有關嗎?謝謝。

回答

0

MS All-In-One Code Framework(C命名管道#服務器IPC(CSNamedPipeServer))提供的代碼示例顯示了正確的方法如何做到這一點,它工作在Win 7