=#===>>如何制作含ACCESS数据库的安装程序,都包含那些DLL和注册表项?100分!参与有奖<<===#=

yueyang 2002-05-22 01:05:45
安装程序制作大家都知道,需要把PB的支持DLL文件随程序发布出去。如果用了ASA也需要把ASA的DLL相关文件一同发布出去。这样自己开发的程序到用户那里才能正常使用。
现在我用PB8加ACCESS2000数据库编了一个程序,在本机上已测试完成。需要发布到用户那里去用,
1、考虑用户的机子没有安装ACCESS2000及OFFICE2000,都应该将哪些ACCESS数据库使用相关的文件包含到安装文件中,还有些什么注册表项需要建立?
2、如果用户安装了更高或低版本的怎么避免冲突?
3、怎么做出判断:如果用户用2000或XP或NT就把DLL放到 驱动盘符:\系统目录\SYSTEM32,98就放到 驱动盘符:\系统目录\SYSTEM 下?
望高手速回答,参与着有也有奖,但大将只留给解决问题的人。谢谢!
...全文
254 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yueyang 2002-05-22
C:\WINDOWS\SYSTEM\odbcjt32.dll这个文件是不是所有系统都带,还是要另加?
关于注册表部分我把我自己的导出来后在别人那里添加了,因为对方装过ACCESS2000了所以正常,但ODBCJT32。DLL文件一定要有才行,我将ODBCJT32。DLL挪个位置就不行了,注册表中的路径也改了还不行,所以我得先去找台新机子看看有无ODBCJT32程序,如果没有那么关于ACCESS的DLL文件就难判断了。
回复
zbh68 2002-05-22
如果你有InstallShield5.1国际版,上面有个模板关于ODBC的,有怎么安装ACCESS,相关的DLL也有。
如怕DLL被覆盖,可以拷在自己软件目录下,搜索路径是先当前目录的。
不过注意修改一下上面仁兄说的注册表,把HKEY_CURRENT_USER\Software\ODBC\ODBC.INI下的有关启动之类的路径不要。
回复
pei 2002-05-22
你把所需要的文件(EXE、DLL等)最好都放到你自己程序的安装文件夹里,不要放到系统目录,这样移动也方便, 另外还要注册数据源

我这有一个自动注册ODBC数据源的例子,就是注册的ACCESS数据库,虽然不是PB8但都一样,只是DLL文件取PB8里的就行了

外部公共函数(global external functions)
//得到当前路径
public Function Long GetCurrentDirectoryA(long nBufferLength, ref string lpBuffer) Library "kernel32";
//得到年的农历表示
function long MyFormatLunarYear(long iYear,ref string text) library "calendar.dll"
//得到日的农历表示
function long MyGetLunarDate(long iYear, long iMonth, long iDay, ref long iLunarYear, ref long iLunarMonth, ref long iLunarDay) library "calendar.dll"
//得到某日的农历节气序号
function long getjieqi(long iYear, long iMonth, long iDay) library "calendar.dll"


1、sea day plan.ini

/*
run_flag :表示系统是否第一次运行,0为第一次,以便系统判断是否进行建立新的数据源
dsn_def :默认的数据源
week_month:表示开始运行的输入界面是以星期的形式显示还是以月份的形式显示,1-月份;2-星期
icon_flag :表示运行时是否以最小化界面显示。1-是 0 -否
iuser :上次登录的用户id
idiff :上次登录的区分(公司、家庭、其他)
*/

[public]
begin_year=2001
end_year=2005
year_step=1
month_step=1
curr_path=D:\pb\日?`排\pbl
week_month=1

[ini]
ini_flag=1
run_flag=1
dsn_def=dsn_sdp
icon_flag=0
iuser=jdh
idiff=1

2、ue_ini() returens(none)

//设置默认数据源
if len(trim(profileString("sea day plan.ini","ini","dsn_def","")))=0 then
setprofileString("sea day plan.ini","ini","dsn_def","dsn_sdp")
end if

3、ue_outo_set_odbc() returns(none)

/*自动设置odbc数据源
与odbc相关的键中:
HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBCDRIVER 中记录了所有已安装的ODBC?驱动程序
HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI 中记录了各种ODBC?驱动程序的相关信息
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources 记录了各种数据源的类型
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI 则记录了各种数据源的详细信息*/

string ls_sys[]
ls_sys[1]="HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC DRIVERS"
ls_sys[2]="HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI"
ls_sys[3]="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources"
ls_sys[4]="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI"

//判断系统是否已安装Access
string ls_install
RegistryGet(ls_sys[1], "Microsoft Access Driver (*.mdb)", RegString!,ls_install)
if trim(ls_install)<> "Installed" then
messagebox("错误","未安装Microsoft Access Driver")
halt
end if
//取得当前路径
string ls_curr_path
ls_curr_path=profileString("sea day plan.ini","public","curr_path","")
if len(trim(ls_curr_path))=0 then
messagebox("错误","系统发生当前路径初始化文件错误!")
halt
end if
//取得默认数据源名称
string ls_dsn
ls_dsn=profileString("sea day plan.ini","ini","dsn_def","")
if len(trim(ls_dsn))=0 then
messagebox("错误","系统发生数据源初始化文件错误!")
halt
end if
//修改注册表
RegistrySet(ls_sys[3], ls_dsn,RegString!,"Microsoft Access Driver (*.mdb)")//记录数据源类型
RegistrySet(ls_sys[4]+"\"+ls_dsn,"DBQ",RegString!,ls_curr_path+"\sea_day_plan.mdb")//记录数据源的详细信息
RegistrySet(ls_sys[4]+"\"+ls_dsn,"Driver",RegString!,"C:\WINDOWS\SYSTEM\odbcjt32.dll")
RegistrySet(ls_sys[4]+"\"+ls_dsn,"FIL",RegString!,"MS Access;")
RegistrySet(ls_sys[4]+"\"+ls_dsn,"PWD",RegString!,"sql")
RegistrySet(ls_sys[4]+"\"+ls_dsn,"UID",RegString!,"dba")

ulong lu_driverid,lu_SafeTransactions
lu_driverid=25
lu_SafeTransactions=0
RegistrySet(ls_sys[4]+"\"+ls_dsn,"DriverId",Regulong!,lu_driverid)
RegistrySet(ls_sys[4]+"\"+ls_dsn,"SafeTransactions",Regulong!,lu_SafeTransactions)

4、open事件

open(w_ver_promp)

if profilestring("sea day plan.ini","ini", "run_flag", "")="0" then
//取得当前路径
string ls_current_path
long ll_length=50
int li_rtn
string ls_dsn="dsn_sdp"
li_rtn=GetCurrentDirectoryA(ll_length,ref ls_current_path) //放到ue_ini事件中出错
if li_rtn=0 then
messagebox("存取失败","应用程序目录存取失败,请重新安装")
halt
end if
setProfileString("sea day plan.ini","public", "curr_path", ls_current_path)
//初始化
this.triggerevent("ue_ini")
//初始化注册表
this.triggerevent("ue_auto_set_odbc")
end if
//取得默认数据源
ls_dsn=profileString("sea day plan.ini","ini","dsn_def","")
if len(trim(ls_dsn))=0 then
messagebox("错误","系统发生数据源初始化文件错误!")
halt
end if
//配置数据源
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN="+ls_dsn+";UID=dba;PWD=sql'"

connect using sqlca;

IF SQLCA.SQLCode <> 0 THEN
MessageBox("数据库连接失败","不能连接到数据库,可能原因"+ SQLCA.SQLErrText)
RETURN
END IF
close(w_ver_promp)

open(w_main)
open(w_promp)
//清空数据库
if isvalid(w_promp) then
w_promp.dw_1.Object.t_1.Text = "正在载入数据,请稍候......"
end if
w_main.triggerevent("ue_new")
setProfileString("sea day plan.ini","ini", "run_flag", "1")
close(w_promp)
open(w_test)




*******************

//窗口自动居中
environment le_envir
int li_ReturnCode
this.SetRedraw(False) // 获得屏幕分辨率大小??
li_ReturnCode = GetEnvironment(le_envir) // 把窗口移动到屏幕中央
if li_ReturnCode<>1 then //失败
this.SetRedraw(true)
return
end if
li_ReturnCode=this.move((PixelsToUnits(le_envir.ScreenWidth,XPixelsToUnits!) - this.Width)/2,(PixelsToUnits(le_envir.ScreenHeight,YPixelsToUnits!) - This.Height)/2)
if li_ReturnCode=1 then this.SetRedraw(true)

--------------------------------------------------------------------------------
回复
liuyxit 2002-05-22
1.沒試過,現一般的机子都裝有office
2.用制作安裝程序的軟件做﹐它可以判別要安裝的文件是否比原來的新﹐是不履蓋
3.同2.如用create install3.14軟件﹐它提供一個%syspath%為系統目錄﹐你可以定義那些文件放在該目錄。
詳細請看軟件幫忙。
回复
相关推荐
发帖
数据库相关
创建于2007-09-28

738

社区成员

PowerBuilder 数据库相关
申请成为版主
帖子事件
创建了帖子
2002-05-22 01:05
社区公告
暂无公告