Pergunta

Estou executando o seguinte scenerio:

SafeFileHandle handle = Win32API.CreateFile((deviceName + "\\" + pipeName),
                           DesiredAccess.GENERIC_WRITE | DesiredAccess.GENERIC_READ,
                           ShareMode.FILE_SHARE_WRITE | ShareMode.FILE_SHARE_READ,
                           IntPtr.Zero,
                           CreationDisposition.OPEN_EXISTING,
                           FlagsAndAttributes.FILE_ATTRIBUTE_NORMAL | FlagsAndAttributes.FILE_FLAG_OVERLAPPED,
                           IntPtr.Zero); // Marshal.GetLastWin32Error() returns 0 (success)

bool pass = Win32API.WriteFile(writeHandle, message.ToArray(), (uint)message.Count, ref bytes_written, ref over_lapped);

passe é falsa mas que se espera desde im funcionando sobrepostas.
O problema é Marshal.GetLastWin32Error () does not return ERROR_IO_PENDING ele retorna ERROR_ALREADY_EXISTS. O que é estranho para mim, porque o erro não mostrou que, quando eu criei o arquivo, mas quando eu escrevo ele aparece. Agora eu estou tentando descobrir como fechar o identificador que eu não parecem ter acesso a ou pelo menos obter uma explicação de por que isso está acontecendo.

EDIT:. Ok, eu norrowed o problema para baixo e eu sei o que está causando o problema

  private void ErrorOccurred(string detailedError)
  {
     lock (mLogLock)
     {
        try
        {
           System.IO.File.AppendAllText("Device" + mDeviceHandle + "Log.txt",
           DateTime.Now.ToLongTimeString() + ": " + detailedError + Environment.NewLine);
        }
        catch (Exception ex)
        {
           System.Windows.Forms.MessageBox.Show(ex.Message);
        }
     }
  }

Aparentemente, internamente a chamada AppendAllText é a criação de um erro. Devo redefinir o erro após esta chamada log? Eu acho que isso teria sido útil saber que o quadro does not repor chamadas de baixo nível nos trabalhos internos de suas funções. Ahh, você aprende algo novo a cada dia.

Eu acho que a nova pergunta que eu tenho é, eu deveria redefinir o erro de baixo nível depois desta chamada, ou se há alguma outra maneira de registrar a saída (sem uso de ferramentas de 3 como log4net ou obter fantasia com a saída Debug.Trace) ? Bascially alguma maneira de abrir um arquivo para acrescentar isso não afeta a Marshal.GetLastWin32Error (); saída.

Foi útil?

Solução 2

Eu determinados utilizando Marshal.GetLastWin32Error para a depuração não é o melhor caminho a percorrer.

Outras dicas

Marshal.GetLastWin32Error () deve ser a primeira coisa que você faz após a chamada Win32API.WriteFile (). Não faça qualquer outra coisa, por exemplo, qualquer exploração madeireira etc, entre o WriteFile () e GetLastWin32Error () chamadas.

Use SetLastError = True na declaração DllImport.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top