예제 #1
0
        // This is a work around for the STA thread bug.  This will execute the call on a non-sta thread, then return the result
        private static bool IsVirtualKnownFolder(IShellItem2 nativeShellItem2)
        {
            IntPtr pidl = IntPtr.Zero;

            try {
                IKnownFolderNative nativeFolder = null;
                KnownFoldersSafeNativeMethods.NativeFolderDefinition definition = new KnownFoldersSafeNativeMethods.NativeFolderDefinition();

                // We found a bug where the enumeration of shell folders was
                // not reliable when called from a STA thread - it would return
                // different results the first time vs the other times.
                //
                // This is a work around.  We call FindFolderFromIDList on a
                // worker MTA thread instead of the main STA thread.
                //
                // Ultimately, it would be a very good idea to replace the 'getting shell object' logic
                // to get a list of pidl's in 1 step, then look up their information in a 2nd, rather than
                // looking them up as we get them.  This would replace the need for the work around.
                object padlock = new object();
                lock (padlock) {
                    IntPtr unknown = Marshal.GetIUnknownForObject(nativeShellItem2);

                    ThreadPool.QueueUserWorkItem(obj => {
                        lock (padlock) {
                            pidl = ShellHelper.PidlFromUnknown(unknown);

                            new KnownFolderManagerClass().FindFolderFromIDList(pidl, out nativeFolder);

                            if (nativeFolder != null)
                            {
                                nativeFolder.GetFolderDefinition(out definition);
                            }

                            Monitor.Pulse(padlock);
                        }
                    });

                    Monitor.Wait(padlock);
                }

                return(nativeFolder != null && definition.category == FolderCategory.Virtual);
            } finally {
                ShellNativeMethods.ILFree(pidl);
            }
        }
예제 #2
0
		// This is a work around for the STA thread bug.  This will execute the call on a non-sta thread, then return the result
		private static bool IsVirtualKnownFolder(IShellItem2 nativeShellItem2) {
			IntPtr pidl = IntPtr.Zero;
			try {
				IKnownFolderNative nativeFolder = null;
				KnownFoldersSafeNativeMethods.NativeFolderDefinition definition = new KnownFoldersSafeNativeMethods.NativeFolderDefinition();

				// We found a bug where the enumeration of shell folders was
				// not reliable when called from a STA thread - it would return
				// different results the first time vs the other times.
				//
				// This is a work around.  We call FindFolderFromIDList on a
				// worker MTA thread instead of the main STA thread.
				//
				// Ultimately, it would be a very good idea to replace the 'getting shell object' logic
				// to get a list of pidl's in 1 step, then look up their information in a 2nd, rather than
				// looking them up as we get them.  This would replace the need for the work around.
				object padlock = new object();
				lock (padlock) {
					IntPtr unknown = Marshal.GetIUnknownForObject(nativeShellItem2);

					ThreadPool.QueueUserWorkItem(obj => {
						lock (padlock) {
							pidl = ShellHelper.PidlFromUnknown(unknown);

							new KnownFolderManagerClass().FindFolderFromIDList(pidl, out nativeFolder);

							if (nativeFolder != null) {
								nativeFolder.GetFolderDefinition(out definition);
							}

							Monitor.Pulse(padlock);
						}
					});

					Monitor.Wait(padlock);
				}

				return nativeFolder != null && definition.category == FolderCategory.Virtual;
			} finally {
				ShellNativeMethods.ILFree(pidl);
			}
		}
 public virtual extern void RegisterFolder(
     [In, MarshalAs(UnmanagedType.LPStruct)] Guid knownFolderGuid,
     [In] ref KnownFoldersSafeNativeMethods.NativeFolderDefinition knownFolderDefinition);