Database 版 (精华区)

发信人: starstar (今天打老虎), 信区: Database
标  题: PowerBuilder编程俱乐部
发信站: 哈工大紫丁香 (2001年09月12日21:23:23 星期三), 站内信件

  问题一:各位高手请进,不要嫌问题简单!请问用PB如何调用WINDOWS的API函数,
即具体要在哪 几个地方写些代码?最好能给出实例。
  答:调用 API 函数步骤: 1、在适当的位置声明函数,如窗口内,Application内
,UserObject内,定义在Local External Function或Global External Function中,如
播放声音的: Function boolean sndPlaySoundA (string SoundName, uint Flags) L
ibrary "WINMM.DLL" Function uint waveOutGetNumDevs () Library "WINMM.DLL" 也
可以创建一个UserObject,集中声明常用的API及函数本地化,如定义用户对象 u_exter
nal_function: Declare Local External Function(定义外部函数): Function boo
lean sndPlaySoundA (string SoundName, uint Flags) Library "WINMM.DLL" Functi
on uint waveOutGetNumDevs () Library "WINMM.DLL" Declare User Object Functio
n(定义用户对象函数): uf_play_sound(string as_wave_name, integer ai_option)
 函数内容如下: //参数:as_wave_name :wav文件名 // ai_option :同步或异步(1
/0) uint lui_numdevs lui_numdevs = WaveOutGetNumDevs() If lui_numdevs > 0 Th
en sndPlaySoundA(as_wave_name,ai_option) return 1 Else return -1 End If 2、调
用时在程序中定义一个实体并调用其函数: u_external_function iu_external_funct
ion iu_external_function = create u_external_function iu_external_function.u
f_play_sound('c:\windows\media\ding.wav',1) 试试看,如果有声卡,就会听到“叮
”的一声。 其它API函数也是如此处理。关于如何声明,在俱乐部的主页上有一个帮助
,在我的主页PB手记http://liulee.yeah.net 的“源码天地”下也有一个集成了常用A
PI函数的用户对象,你可以下载回去参考。 (此题由流方回答)   
  问题二:如何在PB应用程序中创建目录?   
  答:可以用API函数CreateDirectoryA实现,定义:   function boolean Create
DirectoryA(ref string pathname,int sa) Library "Kernel32.dll"   调用代码: 
    boolean rtn     string ls_dir     ls_dir = "c:\newdir" //要创
建的目录名称     rtn = CreateDirectoryA(ls_dir,0)     if rtn then  
       Messagebox("Succeed","Succeed!" )     else         
Messagebox("Failed","Failed!")     End if   
  问题三:我写的系统中带了OCX控件,当系统编译后发行时必须带上该OCX控件,但
在用户的机子上必须注册该OCX控件才能使用,否则程序运行会出错,请问用什么方法注
册该OCX控件?   
  答:提供以下几种方法供参考:   1、在Windows命令行或DOS下运行:regsvr32
 ocxname.OCX   2、用Install Shield 做安装程序时,在里面选“Self-Registered
”,安装程序将自动注册。   3、在PB程序中调用regsvr32实现,安装程序只需负责
将OCX拷贝到相应路径下,这个路径PB程序必须可以得到,建议拷贝到Windows系统目录
或者与执行文件同目录下。   具体代码:   //首先定义API函数,如果OCX控件在
与执行文件同目录下,使用GetCurrentDirectory函数;如果OCX控件放在系统目录下,
使用GetSystemDirectory函数。   Function ulong GetCurrentDirectory(ulong nB
ufferLength,ref string lpBuffer) Library "kernel32.dll" Alias for "GetCurren
tDirectoryA"   Function uint GetSystemDirectory(ref string lpBuffer,uint u
Size) Library "kernel32.dll" Alias for "GetSystemDirectoryA"   //假设OCX文
件在Windows系统目录下,在PB应用(Application)的Open事件编写如下代码:   s
tring 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 + "\M
yocx.ocx" + "~""     Run (ls_Command)     …   End if   Regsvr32
后面的"/s"执行参数是为了隐藏注册成功消息框。   (此种方法由张涛提供)   
4、在PB应用程序中注册:   函数声明:   Function long DllRegisterServer()
 Library "ocxname.OCX"   调用:   LONG ll_RC   ll_RC = DllRegisterServ
er()
  问题四:如何带参数执行SQL的系统储存过程?我想在script中执行系统存储过程S
p_DropUser删除MS SQL Server 7某用户。我是这样写的:execute Sp_DropUser(Sp_Dr
opUser语法),编译提示Sp_DropUser为未定义的系统存储过程。
  答:代码如下: string ls_name ls_name = 'username' //要删除的用户名 //定
义存储过程 DECLARE dropUser_proc PROCEDURE FOR Sp_DropUser @name_in_db =:ls_
name; SQLca.AutoCommit = TRUE EXECUTE dropUser_proc ; //执行 SQLca.AutoCommi
t = false

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: hfi.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.445毫秒