关于调用DLL的一个问题

时间:2022-09-30 14:55:29
这个问题遇到过几次了,就是我在程序中引用了DLL里的函数,在第一次打开PB并运行时,调用DLL是正确的,但是关闭程序后第二次运行是就会报错(此时没有关闭PB),错误内容大致如下:
Error opening DLL library Test.dll for external function at line 22 in function of_add of object uo_test.

按字面意思看,就是说这个函数有问题,但是为什么在第一次运行的时候没有问题。然后把PB关闭了再打开,重新运行运行程序就正常了,当然也跟前面一样,只能运行一次,要想运行第二就必须把PB关闭了再打开。如果把程序编译成EXE后,运行多少次都不会报错。

在PB9和PB11.5里都遇到过,不知道有没有遇到过类似问题的朋友,说说看什么原因造成的。

9 个解决方案

#1


另外补充一下,刚才这个Test.dll用在了不同的workspace中,一个有类似的问题,另外一个就没有这样的问题,随便怎么运行都不会报错

#2


在调用外部函数前,写上
messagebox('', GetCurrentDirectory ( )) 看它不提示错误和提示错误时先后都弹出的是什么内容。

#3


同意楼上的,试一下

#4


引用 2 楼 wag_enu 的回复:
在调用外部函数前,写上
messagebox('', GetCurrentDirectory ( )) 看它不提示错误和提示错误时先后都弹出的是什么内容。


刚才试了下,路径没有变,我也检查了下,没有改变路径的代码

#5


是不是有返回参数而没有对变量进行初始化的?

#6


引用 5 楼 pb8 的回复:
是不是有返回参数而没有对变量进行初始化的?

变量都初始化了的,其实就是网上的一个加密解密对象,但是用到这个项目上就有问题了:

定义外部API:
Function Int b64_size(ULong size,ULong flag) Library "des.dll" Alias FOR "b64_size;Ansi"
Function Int b64_des(Ref String In,Ref String out,String Key,ULong size,ULong flag) Library "des.dll" Alias FOR "b64_des;Ansi"

解密:
of_UnEncrypt(string as_pass)

Long Ll_Size
String Ls_OutPass
String Ls_InPass

Ls_InPass = Trim(As_Pass)
Ll_Size = b64_size(lena(Ls_InPass),1)
Ls_OutPass = Space(Ll_Size)
B64_Des (Ls_InPass , Ls_OutPass , is_key , Lena (Ls_InPass) , 0 )  // is_key是对象的实例变量
RETURN Ls_OutPass

就这么简单一个调用,在其他的workspace中都正常,这次就不正常了,不知道是怎么的

#7


感觉好像跟Oracle有关系,用SQL Server就没有问题,ASA也没有问题,但是又找不出来是什么原因

#8


可能是pb的问题,只要编译以后没有问题,就不要管他了

#9


引用 8 楼 lzp_lrp 的回复:
可能是pb的问题,只要编译以后没有问题,就不要管他了


现在也只能这样了

#1


另外补充一下,刚才这个Test.dll用在了不同的workspace中,一个有类似的问题,另外一个就没有这样的问题,随便怎么运行都不会报错

#2


在调用外部函数前,写上
messagebox('', GetCurrentDirectory ( )) 看它不提示错误和提示错误时先后都弹出的是什么内容。

#3


同意楼上的,试一下

#4


引用 2 楼 wag_enu 的回复:
在调用外部函数前,写上
messagebox('', GetCurrentDirectory ( )) 看它不提示错误和提示错误时先后都弹出的是什么内容。


刚才试了下,路径没有变,我也检查了下,没有改变路径的代码

#5


是不是有返回参数而没有对变量进行初始化的?

#6


引用 5 楼 pb8 的回复:
是不是有返回参数而没有对变量进行初始化的?

变量都初始化了的,其实就是网上的一个加密解密对象,但是用到这个项目上就有问题了:

定义外部API:
Function Int b64_size(ULong size,ULong flag) Library "des.dll" Alias FOR "b64_size;Ansi"
Function Int b64_des(Ref String In,Ref String out,String Key,ULong size,ULong flag) Library "des.dll" Alias FOR "b64_des;Ansi"

解密:
of_UnEncrypt(string as_pass)

Long Ll_Size
String Ls_OutPass
String Ls_InPass

Ls_InPass = Trim(As_Pass)
Ll_Size = b64_size(lena(Ls_InPass),1)
Ls_OutPass = Space(Ll_Size)
B64_Des (Ls_InPass , Ls_OutPass , is_key , Lena (Ls_InPass) , 0 )  // is_key是对象的实例变量
RETURN Ls_OutPass

就这么简单一个调用,在其他的workspace中都正常,这次就不正常了,不知道是怎么的

#7


感觉好像跟Oracle有关系,用SQL Server就没有问题,ASA也没有问题,但是又找不出来是什么原因

#8


可能是pb的问题,只要编译以后没有问题,就不要管他了

#9


引用 8 楼 lzp_lrp 的回复:
可能是pb的问题,只要编译以后没有问题,就不要管他了


现在也只能这样了