2011-02-09 100 views
2

所以我試圖手動執行AxImp的工作(我正在動態執行)。按類型名稱獲取GUID

我的產品是一個廣泛發佈的,被認可的「附加」到第三方產品。他們有一個OCX,我通過COM參考添加到我的表單中。但是,如果客戶端已經(或安裝)他們產品的更新版本,我的產品將無法再加載OCX。

因此,我試圖加載他們的OCX動態。除了我需要其中一個OCX中的其中一個接口的GUID之外,我已經完成了所有工作。我知道類型名稱是什麼,並且系統上註冊了OCX> <。我怎麼才能從類型名稱獲取對象的GUID?

請注意,Assembly.LoadFrom()不起作用,因爲OCX不是.NET,而是COM。

回答

4

由於您的評論讓我們知道GUID在OCX找到,但HKEY_CLASSES_ROOT下沒有登記,我們將不得不從類型庫中讀取數據:

0

不知道爲什麼你不能簡單地將COM reference添加到您的項目的DLL。

Visual Studio會自動將.NET包裝添加到以此方式引用的任何COM對象。

+0

因爲如果第三方更新其OCX(更改GUID)我的程序將無法正常加載。 – 2011-02-09 22:25:04

+0

@Jordan - 不,沒有刪除/添加和重新編譯。第三方應該真的使用穩定的GUID。 – Oded 2011-02-09 22:27:20

+0

@Oded絕對。相信我,我測試的第一件事是通過工作室添加COM參考。這隻有在第三方更新他們的OCX然後崩潰之後纔有效。我無法控制他們做什麼或如何做。 – 2011-02-09 22:31:34

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; 
    } 
}