Caos da prancheta!
Nota: este índice originalmente de http://mygreenpaste.blogspot.com. Se você for leitura ele de algum outro local, faça exame por favor do momento de visitar Minha pasta verde, Inc. Obrigado.
A APROVAÇÃO, assim que talvez caos é um pouco uma palavra áspera aqui. Mas a prancheta dirigia-me recentemente porcas! Tudo que eu estava tentando fazer era lhe copí algum texto, e a operação estava falhando. Naturalmente, porque era um app ad hoc, eu não tive nenhum tipo da manipulação de erro. O app trabalhou a multa justa em um sistema, mas funcionar o app em um outro sistema (uma máquina virtual) resultou consistentemente na falha copí o texto à prancheta.
Finalmente, eu podia determinar que processo impedia que meu app ponha dados na prancheta, mas eu não encontrei ainda um workaround decent para quando o problema acontece. Não é crítico para mim, como o ato de copí o texto à prancheta é mais de um nicety do que uma exigência.
Em todo o caso, usando P/Invoke e System.Diagnostics, Eu encontrei que vmusrvc.exe - o PC virtual “usuário virtual da máquina presta serviços de manutenção” - teve a prancheta aberta. Usando os timestamps de Monitor Process's que perfilam os eventos (gerados em 100 intervalos do ms), e o timestamp da operação falhada de meu app, eu podia determinar a pilha de vmusrvc.exe:
| ntdll.dll | KiFastSystemCallRet |
| vmusrvc.exe | vmusrvc.exe + 0x9a17 |
| vmusrvc.exe | vmusrvc.exe + 0x9c24 |
| vmusrvc.exe | vmusrvc.exe + 0x91f8 |
| vmusrvc.exe | vmusrvc.exe + 0x907f |
| USER32.dll | InternalCallWinProc + 0x28 |
| USER32.dll | UserCallWinProcCheckWow + 0x150 |
| USER32.dll | DispatchClientMessage + 0xa3 |
| USER32.dll | __fnDWORD + 0x24 |
| ntdll.dll | KiUserCallbackDispatcher + 0x13 |
| vmusrvc.exe | vmusrvc.exe + 0x2d29 |
| vmusrvc.exe | vmusrvc.exe + 0xdba6 |
| kernel32.dll | BaseProcessStart + 0x23 |
Nenhum parâmetro, naturalmente, e a informação do símbolo para vmusrvc.exe não parece estar disponível, mas obviamente user32.dll está processando alguma mensagem. Eu posso olhar neste mais em um ponto mais atrasado.
Para encontrar o processo que estava interferindo com meu trabalho da prancheta, eu usei P/Invoke chamar-se GetOpenClipboardWindow() e então GetWindowThreadProcessId(), passando no punho retornado por GetOpenClipboardWindow (). Então, encontrar o nome executável dos processos era apenas uma matéria de usar-se Módulos coleção do Processo o exemplo retornou passando na identificação process recuperada por GetWindowThreadProcessId () a System.Diagnostics.Process.GetProcessById().
O seguinte código:
usando System.Runtime.InteropServices;
usando System.Diagnostics;
...
amarre dados = do “al do kajsdlkj do alkjsdl aasdlkjasdlk”;
tentativa
{
Clipboard.SetData (System.Windows.Forms.DataFormats.Text, dados);
}
prendedor (ee de ExternalException)
{
LogIt (ee.ToString ());
hWnd = GetOpenClipboardWindow de IntPtr ();
se (IntPtr.Zero! = hWnd)
{
pid do uint = 0;
tid do uint = GetWindowThreadProcessId (hWnd, para fora pid);
LogIt (“processo com hWnd {0}, PID {1} ({1: x}), TID {2} ({2: x}),” +
"name {3} has the clipboard", hWnd, pid, tid,
Process.GetProcessById( (int)pid ).Modules[0].FileName );
}
}
Resulted in the following output:
2008-03-25 00:54:45.4938864--> System.Runtime.InteropServices.ExternalException: Requested Clipboard operation did not succeed.
at System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
at System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay)
at System.Windows.Forms.Clipboard.SetData(String format, Object data)
at Clippy.Form1.button1_Click(Object sender, EventArgs e)
2008-03-25 00:54:45.5339440--> Process with hWnd 65716 (65716), PID 1492 (5d4), TID 1496 (5d8), name C:\Program Files\Virtual Machine Additions\vmusrvc.exe has the clipboard
Interestingly, trying an alternative method of the Clipboard to set the content also failed. The Clipboard.SetDataObject() overload that takes a retryTimes and retryDelay parameter failed in the same fashion after roughly ten seconds when invoked as follows:
Clipboard.SetDataObject( data, false, 100, 100 );
I tried variations on retryTimes and retryDelay, to no avail.
Not sure what vmusrvc.exe is doing with the clipboard (probably has to do with monitoring it for host / guest VM interaction), but the act of setting the contents of the clipboard didn't fail 100% of the time in the VM. Often enough to make it extremely unreliable, though. During "normal" system usage, I was not able to cause a failure when running the app on a non-virtual (actual?) system.
Popularity: 2%
Written by «/\/\Ø|ö±ò\/»®©. Read more great feeds at is source WEBSITE
no comments.
Read more articles on P/Invoke and GetOpenClipboardWindow and System.Diagnostics and Clipboard and GetWindowThreadProcessId and Process Monitor and c# and processes and Virtual Machine and otherSoftware and Virtual PC.
- [+] Digg: Feature this article
- [+] Del.icio.us: Bookmark this article
- [+] Furl: Bookmark this article














