方法一:
1.手工注冊OCX控件
將該控件隨程序一起發布,然后,將此文件拷到windows\system,或者直接放在本運行目錄,然后執行dos命令,run( "regsvr32 *.ocx ")
*表示具體的文件。然后寫注冊表,將控件注冊標志置為1,在程序開始運行時,先檢查該標志,是否需要進行注冊
2.自動注冊OCX控件
在OCX控件中一般都包含一個DLLRegisterServer函數,可以用此函數來實現OCX控件自動注冊。
例如:我們要在應用中自動注冊ActiveMovie控件,首先聲明外部函數:
Function Long DllRegisterServer() LIBRARY "amovie.ocx "
然后在腳本中調用此函數:
DLLRegisterServer()
注意:不能保證此方法對所有OCX控件都適用!
方法二:
1、在DOS或Windows命令行下運行:regsvr32 ocxname.OCX 注冊
2、用Install Shield,在里面選“Self-Registered”,安裝程序將自動注冊。
3、在PB應用程序中注冊:
函數聲明:
Function long DllRegisterServer() Library "ocxname.OCX "
調用:
LONG ll_RC
ll_RC = DllRegisterServer()
方法三:
為了擴展應用程序的功能,許多系統都使用了或多或少的ActiveX控件,這些控件必須在系統中注冊后才能夠使用。所以分發PowerBuilder應用程序時,必須將系統所使用到的這些ActiveX控件一起分發到用戶所使用的計算機上,並且注冊它們,只有這樣系統才能繼續使用這些控件。
本文將提供三種實現方案,供讀者選擇使用。
方法一:在InstallShield中使用程序對控件進行注冊
InstallShield提供了一套編程語言,語法規則與C++語言非常類似,使用很容易掌握。選中“Scripts”頁,你就可以看到安裝程序實際執行的源代碼,通過添加代碼可以實現許多功能。要注冊控件必須先將控件所需文件拷貝到目標計算機上,所以必須選擇適當的位置添加注冊語句。SetupRegistry()函數就是在文件復制完畢后進行系統注冊的地方,所以在這里注冊控件最合適。
function SetupRegistry()
NUMBER nRootKey, nResult;
STRING szProgram, szCmdLine, szMsg;
STRING szHkey;
STRING szKey, szClass, szNumName, szNumValue;
begin
nResult = CreateRegistrySet( ″″ );
//注冊程序中用到的OCX控件
szProgram = ″Regsvr32 /s″;
//假設我們將Myocx.ocx文件復制到〈COMMONFILES〉\My Shared下
szCmdLine = COMMONFILES^″\\My Shared\\Myocx.ocx″;
//給執行文件路徑加上引號
LongPathToQuote (szCmdLine, TRUE);
//執行生成的命令:例如Regsvr32 /s ″C:\ Program Files\Common Files\My Shared″。
if (LaunchAppAndWait(szProgram, szCmdLine, WAIT) < 0) then
MessageBox(″MyAnimateX 控件注冊失敗!″, SEVERE);
end if;
return nResult;
end;
方法四:用注冊表的方法實現
大家知道,一般安裝程序結束后,為了使系統可以運行,經常需要重新啟動計算機,這是由於安裝程序修改了注冊表或者一些系統文件(Autoexec.bat等),必須重新啟動才能生效。注冊表中有這樣一個主鍵,專門用於存放一些只運行一次的程序,存放在這里的一些執行命令只是在Windows系統啟動時運行一次,之后便被清空,所以取名為RunOnce:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce,所以我們可以在InstallShield中的注冊表編輯器中在該主鍵下添加要執行的代碼,來完成控件的注冊,如上圖所示。
注意,此方法必須保證安裝程序彈出“是否重新啟動計算機”的對話框,這樣才能保證用戶知道必須重啟后才能正常使用本系統。
方法五:在PB程序中實現
安裝程序只需負責將OCX拷貝到相應路徑下,PB程序必須可以得到這個路徑,建議拷貝到Windows系統目錄或者與執行文件同目錄下。
具體代碼:
//首先定義API函數,如果OCX控件在與執行文件同目錄下,使用GetCurrentDirectory函數;如果OCX控件放在系統目錄下,使用GetSystemDirectory函數。
Function ulong GetCurrentDirectory(ulong nBufferLength,ref string lpBuffer) Library ″kernel32.dll″ Alias for ″GetCurrentDirectoryA″
Function uint GetSystemDirectory(ref string lpBuffer,uint uSize) Library ″kernel32.dll″ Alias for ″GetSystemDirectoryA″
//在PB應用(Application)的Open事件,假設OCX控件在Windows系統目錄下。
string ls_PathName,ls_Command
ulong ll_RequiredBufferSize
ls_PathName = Space(255)
ll_RequiredBufferSize = GetSystemDirectory(ls_PathName,255)
IF ll_RequiredBufferSize = 0 or ll_RequiredBufferSize > 255 THEN
//報錯信息
else
ls_Command = ″Regsvr32 /s ″ + ″~″″ + ls_PathName + ″\Myocx.ocx″ + ″~″″
Run (ls_Command)
//....
End if
Regsvr32后面的“/s”執行參數是為了隱藏注冊成功消息框。