2012-08-22 17 views
8

estoy usando el siguiente código para hacer referencia a un archivo DLL cáscarahacer referencia a una interfaz de shell de Windows utilizando .NET 4.0

  Type t = Type.GetTypeFromProgID("Shell.Application"); 

      Shell s = (Shell)Activator.CreateInstance(t); 


      Console.WriteLine("success"); 
      Console.ReadLine(); 

Funciona bien en mi Windows 7 machine.But desarrollo, cuando trato de ejecutar el exe en Windows 2003 servidor consigo esta excepción

Unable to cast COM object of type 'System.__ComObject' to interface type 'Shell3 
2.Shell'. This operation failed because the QueryInterface call on the COM compo 
nent for the interface with IID '{866738B9-6CF2-4DE8-8767-F794EBE74F4E}' failed 
due to the following error: No such interface supported (Exception from HRESULT: 
0x80004002 (E_NOINTERFACE)). 

tomé algo de ayuda de C#: Referencing a windows shell interface pero no hubo suerte.

estoy referenciación shell mediante controles Microsoft depósito y referencia de automatización que es Interop.Shell32 DLL

Si alguien puede guiar lo hará realmente útil.

+1

Es viejo, no creo que los GUID han cambiado, pero quién sabe. Ejecute regedit.exe en esa máquina y navegue hasta HKCR \ Shell.Application. Verifique que el valor de la clave CLSID sea {13709620-C279-11CE-A49E-444553540000} –

+0

Existe una solución más simple, consulte http://stackoverflow.com/a/24967301/625349 –

Respuesta

15

Ok, esto es cómo llegué a través del problema en caso que ayuda a alguien

Así es como mi nuevo código se parece a

Type t = Type.GetTypeFromProgID("Shell.Application"); 

dynamic shell = Activator.CreateInstance(t); 

//This is browse through all the items in the folder 
var objFolder = shell.NameSpace(@"\\fileshares\Files\test"); 

foreach (var item in objFolder.Items()) 
{ 
    //This is to get the file's comments for each files in the folderitem 

    string file_version = objFolder.GetDetailsOf(item, 14).ToString(); 

    Console.WriteLine(file_version); 

} 

Este script es mediante la combinación de la ayuda de http://nerdynotes.blogspot.com/2008/06/vbnet-shell32-code-compiled-on-vista.html

y

http://foro.h-sec.org/net/problemas-en-net/

El segundo enlace es en español, he usado el traductor de google para que sea en Inglés

Gracias a todos los que respondieron a esta pregunta

+0

FYI hay otra solución similar para este mismo problema aquí que podría ser útil: https://stackoverflow.com/questions/26646068/getting-metadata-information-from-a-file-using-c-sharp –

1

Echa un vistazo a esto: http://nerdynotes.blogspot.com/2008/06/vbnet-shell32-code-compiled-on-vista.html Creo que es el mismo problema.

+0

Probé esa opción antes de publicar la pregunta en stackoverflow. Puedo crear un objeto usando object shell = Activator.CreateInstance (t); Pero no estoy seguro de cómo puedo usar la propiedad del espacio de nombres. Intenté usarlo como se sugiere en uno de los comentarios del enlace que publicaste, pero tampoco tuve suerte con eso. – user1131926

1

En lugar de

Type t = Type.GetTypeFromProgID("Shell.Application"); 

dynamic shell = Activator.CreateInstance(t); 

Solía ​​

var shell = (IShellDispatch4) new Shell(); 

shell.Namespace luego funciona como se esperaba.

Resulta que la referencia de un objeto de la cáscara por defecto IShellDispatch5, que no se pueden utilizar en XP o 2003.

+0

No pude obtener la opción IShellDispatch4 en mi código C# (4.0). ¿Debo agregar alguna referencia? – Newbee

Cuestiones relacionadas