将托管线程上的模拟令牌传递给非托管线程

时间:2008-09-15 14:24:49

标签: c# vb.net multithreading unmanaged managed

我有一个案例,VB.Net winforms应用程序需要从网络上播放WMV文件。无法直接访问运行应用程序的用户访问网络共享。通过模拟,我可以看到文件存在(没有模拟,File.Exists为网络共享上的文件返回false)。当我尝试将文件加载到Windows Media Player控件时,控件只保持黑色。我推断当Windows Media Player控件加载到内存中时,它运行在一个单独的非托管线程上,而不是.Net托管线程。有没有办法将该安全令牌从托管线程传递到非托管线程?我完全错过了什么吗?

4 个答案:

答案 0 :(得分:1)

您是否尝试过使用AppDomain关闭IPrinicipal userPrincipal = new MyCustomPrincipal();方法?

示例:

AppDomain currentDomain = AppDomain.CurrentDomain;

currentDomain.SetThreadPrincipal(userPrincipal);

{{1}}

你在问题​​中提到,WMV似乎运行不受管理,所以如果这个前提是正确的,那么这真的不行(参见我的第二个回答)。

答案 1 :(得分:0)

我想您尝试使用

[DllImport("advapi32.dll", SetLastError=true)]
public static extern int LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);  

登录网络共享。

根据我的经验,它并不关心线程。

如果您认为它可能有用,我可以向您展示一个用法示例。在这里提一下它的远景。

答案 2 :(得分:0)

WMP很可能正在启动它自己的继承自您的进程令牌的线程,这是:: CreateThread()的默认行为。我很确定不可能从外部更改线程令牌,除非控件接受令牌作为参数,否则你可以做很多事情。

我不确定除了将它放入另一个进程并使用:: CreateProcessAsUser()创建该进程以及您拥有的令牌或将文件缓冲到本地某处之外,我不确定答案。

答案 3 :(得分:0)

假设WMV播放器在AppDomain之外运行,我会尝试托管WPF / Silverlight媒体播放器以通过网络访问该文件。