所以我试图手动完成AxImp的工作(我正在动态地做)。
我的产品是第三方产品的广泛发布,认可的“附加”。他们有一个OCX,我使用COM引用添加到我的表单中...但是,如果客户端已经(或安装)他们产品的更新版本,我的产品将无法再加载OCX。
因此我正在尝试动态加载他们的OCX。除了我需要其中一个OCX中的一个接口的GUID之外,我已经完成了所有工作。我知道类型名称是什么,并且OCX>是<在系统上注册。如何从类型名称中获取对象的GUID?
注意,Assembly.LoadFrom()不起作用,因为OCX不是.NET它的COM。
答案 0 :(得分:4)
由于您的评论让我们知道GUID在OCX中找到但未在HKEY_CLASSES_ROOT
下注册,我们必须从类型库中读取它:
致电LoadTypeLib
或LoadTypeLibEx
,将路径传递给.OCX文件
然后使用返回对象的FindName
方法。
然后GetTypeAttr
后跟PtrToStructure
以获得带有GUID的TYPEATTR
结构。
答案 1 :(得分:0)
不确定为什么不能简单地向项目中添加COM reference。
Visual Studio会自动将.NET包装器添加到以这种方式引用的任何COM对象。
答案 2 :(得分:0)
我必须编写类似的东西来将代码从COM迁移到C#
class GetGuid
{
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int LoadTypeLib(string fileName, out ITypeLib typeLib);
public string SearchRegistry(string dllPath /* or ocx */)
{
var result = string.Empty;
ITypeLib tl;
if (LoadTypeLib(dllPath, out tl) == 0)
{
ITypeInfo tf;
tl.GetTypeInfo(0, out tf);
var ip = IntPtr.Zero;
tl.GetLibAttr(out ip);
if (ip != IntPtr.Zero)
{
var ta = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR)Marshal.PtrToStructure(ip, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR));
result = ta.guid.ToString();
}
}
return result;
}
}