Forgive me if my terminology is off, as this is somewhat uncharted territory for me.
I have a program which needs to create a FolderShortcut
. Microsoft has documentation on how to create it in C++, and I'm trying to translate the directions to C#. The instructions state that the CoCreateInstance
function needs to be called with CLSID_FolderShortcut
as a parameter, which I infer to mean that it's instantiating a COM object. The CLSID for this object is {0AFACED1-E828-11D1-9187-B532F1E9575D}
.
I've tried adding a reference to Shell32.dll from the COM tab, but the FolderShortcut
object does not show up in Intellisense (maybe it's not in the typelib?). I also thought about doing a DLLImport
, but, of course, that only gives me access to functions, not objects.
What do I need to do to get access to this object in .Net?
If you do not want to import the classes during compile time, as Simon Mourier describes it is also possible to do some late binding to the COM objects, using
Activator
.If you've got the
ProgID
of your object, get the type usingotherwise you can get the type by it's
CLSID
:Using this type, you are now able to create an instance of the coclass, using
Activator.CreateInstance
:Basicly you can now invoke methods using
Type.InvokeMember
. This only works if the object implements theIDispatch
interface.However for your specific example you should be able to cast the instance to
System.Runtime.InteropServices.ComTypes.IPersistFile
, which results in an call toQueryInterface
for COM objects. Using this interface you can easily access the members ofIPersistFile
.You may continue here with further reading.
It sounds like that you have tried adding your COM using the "Add a new COM reference". These are the things that I'd try:
What I'd do first is to make sure that your COM DLL is registered in your computer. If not then register it then try to add it again using the COM tab.
Are you running on a 64bit machine? Try to also make sure that your project properties is set to AnyCPU for it to be able to read the 32bit COM.
Make sure that you have the interop equivalent of the DLL that you are trying to access. It is usually named like "Interop.YourDLLName.dll". Add a reference to that DLL and that should work.
Here is a piece of code that allows you to create a folder shortcut. The CoCreateInstance can (in general) be replaced by declaring a simple class decorated with the Guid attribute with the required CLSID, and the ComImport attribute. The
new
call will do the COM magic automatically. With this code, you don't even need a Shell32 reference (or you can reuse the IShellLink declaration from there if you prefer).Usage:
Code:
Did you try to add a new reference: