Reputation: 1341
I am using the following code to reference a shell dll
Type t = Type.GetTypeFromProgID("Shell.Application");
Shell s = (Shell)Activator.CreateInstance(t);
Console.WriteLine("success");
Console.ReadLine();
It works fine on my windows 7 development machine.But when I try running the exe on Win 2003 server I get this exception
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)).
I took some help from C#: Referencing a windows shell interface but no luck.
I am referencing shell using Microsoft Shell Controls and Automation reference which is Interop.Shell32 dll
If someone can guide it will really helpful.
Upvotes: 8
Views: 10607
Reputation: 219
You can reference directly the COM component %SystemRoot%\system32\shell32.dll (ProgID Shell.Application):
Right click project file --> Add --> Com Reference --> Browse --> Select %SystemRoot%\system32\shell32.dll. You should be seeing in Dependencies/COM node in Visual Studio Interop.Shell32. Click on it and change "Embed Interop Types" from Yes to No (if you use Net Core).
You can then use this simple code
var shell = new ShellClass();
Upvotes: 0
Reputation: 239
Instead of
Type t = Type.GetTypeFromProgID("Shell.Application");
dynamic shell = Activator.CreateInstance(t);
I used
var shell = (IShellDispatch4) new Shell();
shell.Namespace then works as expected.
Turns out that reference for a shell object defaults to IShellDispatch5, which can't be used in XP or 2003.
Upvotes: 1
Reputation: 1341
Ok,this is how I got through the problem incase it helps someone
This is how my new code looks like
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);
}
This script is by combining help from http://nerdynotes.blogspot.com/2008/06/vbnet-shell32-code-compiled-on-vista.html
and
http://foro.h-sec.org/net/problemas-en-net/
The second link is in spanish,I used google translate to make it up in English
Thanks to all who replied to this question
Upvotes: 20
Reputation: 21753
Have a look at this: http://nerdynotes.blogspot.com/2008/06/vbnet-shell32-code-compiled-on-vista.html I think it's the same issue.
Upvotes: 1