ActiveX控件註冊的幾種方法

  • ActiveX控件是一個動 態連接庫,是做爲基於COM服務器進行操做的,而且能夠嵌入在包容器宿主應用程序中,ActiveX控件的前身就是OLE控件。因爲ActiveX控件與 開發平臺無關,所以,在一種編程語言上開發的ActiveX控件能夠無須做任何修改,便可在另外一種編程語言中使用,其效果如同使用Windows通用控件 同樣。如:在VC++中開發的ActiveX控件,不做任何修改便可應用於VB中。因而可知,經過使用ActiveX控件便可實現快速小型的組件重用、代 碼共享,從而提升編程效率。
  • 從Internet下載的ActiveX控件,或從其餘途徑獲得的ActiveX控件,用戶應該怎樣 作才能正確使用呢?通常來講,一個外來ActiveX控件要在Windows中被正確使用,首先必須將控件文件(*.OCX)複製到硬盤中,而後將其在 Windows中註冊,未在Windows中註冊過的ActiveX控件是不能使用的。註冊ActiveX控件通常來講有三種途徑,適用範圍不一樣,各有各的優勢,下面分別討論。

1、使用Regsvr32.exe程序對ActiveX控件進行註冊

  • 對於未註冊過的ActiveX控件可以使用此軟件對其進行註冊,外來ActiveX控件要應用到本身的程序中也必須進行註冊。該文件位於Windows目錄的system子目錄下。使用方法以下:點擊「開始」→「運行」;在運行對話框中輸入如下命令:

regsvr32 /s <文件名> 註冊一個ActiveX控件且無論註冊成功與否,均不顯示提示框
regsvr32 /u <文件名> 解除某ActiveX控件的註冊編程

  • 咱們使用一些帶ActiveX控件的應用程序時,有時會出現不能運行的狀況,這有多是其自帶ActiveX控件未註冊所至,這時不妨使用上述命令一試。

2、使用安裝程序註冊

  • 使用regsvr32.exe來註冊ActiveX控件雖然簡單,但須要用戶手工註冊,在不用時還得手工解除註冊,所以,這對一個應用程序來講並不是好的解決方案。大型應用軟件通常都有一個安裝程序,在安裝程序中解決ActiveX控件註冊是較爲理想的一種方案。使用InstallShield能夠製做出專業級的Setup,還可註冊其中的ActiveX控件;並且,在之後攜載軟件時,自動註銷掉之前註冊的ActiveX控件。方法以下:

啓動InstallShield,使用ProjectWizard創建一個新的項目;
新建一個「FileGroup」,將須要註冊的ActiveX控件文件放入此「FileGroup」中;
將上述「FileGroup」的「Self-Registered」屬性設置成「Yes」。服務器

  • 在NSIS中有命令能夠註冊DLL、OCX等文件,代碼如:
regdll "$instdir\xxx.dll"
unregdll "$instdir\xxx.dll" (反註冊)

3、在應用程序中加入註冊代碼

  • 對於小型程序不宜採起第二種方法,較好的方法是在程序中嵌入註冊代碼,實現應用程序自注冊。其編程方法是:

使用WindowsAPI函數LoadLibrary載入ActiveX控件;
使用GetProcAddress函數獲取ActiveX控件中註冊函數DllRegisterServer(註銷函數爲DllUnregisterServer)指針;
調用註冊函數DllRegisterServer(或註銷函數DllUnregisterServer)。編程語言

BOOL RegisterOCX(LPCTSTR OcxFileName)
{
    LPCTSTR pszDllName = OcxFileName ; //ActiveX控件的路徑及文件名
    HINSTANCE hLib = LoadLibrary(pszDllName); //裝載ActiveX控件
    if (hLib < (HINSTANCE)HINSTANCE_ERROR)
    {
        return FALSE ;
    }
    FARPROC lpDllEntryPoint;
    lpDllEntryPoint = GetProcAddress(hLib,("DllRegisterServer")); //獲取註冊函數DllRegisterServer地址
    if(lpDllEntryPoint!=NULL) //調用註冊函數DllRegisterServer
    {
        if(FAILED((*lpDllEntryPoint)()))
        {
            DWORD dwError = GetLastError();
            FreeLibrary(hLib);
            return FALSE ;
        }
        return TRUE ;
    }
    else
        return FALSE ;
}
相關文章
相關標籤/搜索