用C#建立ActiveX問題

weixin_30639719發表於2020-04-05
        這裡只對我遇到的問題進行說明及解答,其它請參見MSDNCOM互動:

一、              最好使用自定義的介面。否則很容易匯出一些不必要的東西,在編譯時還會有一大堆的警告(當從.Net自身的類繼承時會出現這種情況,其它情況我沒有試。)。

二、              介面中的方法或屬性要有DispID屬性(否則可能會報“找不到成員”錯誤,當介面中含有成員時,如果不使用DispID,則該成員有可能不會匯出!)。

三、              介面不能將繼承的的介面進行公佈。如果要公佈的介面繼承自另一介面,不知為什麼其父介面中的內容不會被匯出。如果有知道的朋友不妨告知一下。

四、              我曾經想將.Net中的強型別化資料集作為引數或返回值,試驗是行不通的。因為只面涉及到了只有.Net才能用的東西如ComponentModel等。

五、              視覺化控制元件整體不顯示的問題的解決方法:請指定分別含有下面兩個屬性的兩個方法。

    [ComRegisterFunction()]

[ComUnregisterFunction()]

    並在登錄檔中建立或刪除“Control”鍵及設定或刪除“Codebase”項的值。如下:

None.gif[ComRegisterFunction()]
None.gif
public static void RegisterClass(string key)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifStringBuilder sb 
= new StringBuilder(key);
InBlock.gifsb.Replace(
@"HKEY_CLASSES_ROOT\""");
InBlock.gifRegistryKey k 
= Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
InBlock.gifRegistryKey ctrl 
= k.CreateSubKey("Control");
InBlock.gifctrl.Close();
InBlock.gifRegistryKey inprocServer32 
= k.OpenSubKey("InprocServer32"true);
InBlock.gifinprocServer32.SetValue(
"CodeBase", Assembly.GetExecutingAssembly().CodeBase);
InBlock.gifinprocServer32.Close();
InBlock.gifk.Close();
ExpandedBlockEnd.gif}

None.gif
None.gif[ComUnregisterFunction()]
None.gif
public static void UnregisterClass(string key)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifStringBuilder sb 
= new StringBuilder(key);
InBlock.gifsb.Replace(
@"HKEY_CLASSES_ROOT\""");
InBlock.gifRegistryKey k 
= Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
InBlock.gifk.DeleteSubKey(
"Control"false);
InBlock.gifRegistryKey inprocServer32 
= k.OpenSubKey("InprocServer32"true);
InBlock.gifk.DeleteSubKey(
"CodeBase"false);
InBlock.gifk.Close();
ExpandedBlockEnd.gif}

None.gif

六、              視覺化控制元件內某些子控制元件無法顯示的問題的解決方法有三種

為控制元件設定非預設背景色。

在介面中指定背景色屬性(請將alpha值設定為255)。

將窗體設定為支援透明(但在放在Delphi上面時並不透明,只是能夠顯示完整而已。)

            SetStyle(ControlStyles.SupportsTransparentBackColor, true);

            this.BackColor = Color.Transparent;

轉載於:https://www.cnblogs.com/llxxbb/archive/2006/10/20/CreateActiveX.html

相關文章