为PB4编写16位DLL
编号:QA000732
建立日期: 1999年3月31日 最后修改日期:1999年3月31日
所属类别:
熊冰寒:
powerbuilder 4.0&borlandc 3.1
win95
我想编制一个能让pb4调用的16位dll,但是dll编译成功后pb还是无法调用,我已经使用了pascal 关键字及在.def文件中声明了需引出的函数名,报错信息大意为此dll中无此函数,我编译dll用的是boralnd c++ 3.1,我怀疑与某个设置或声明有关,因为我编译32位的dll时,自己手工生成每个文件再编译时也不能成功,非要用vc的自动生成dll,然后再把函数加进去才行。如果可能是否可以寄个16位dll的例子给我(能被16位pb调用的例子)。我要编的dll实际上是为了取磁盘上一个文件的日期,pb4好象无此函数,请问还有其他方法吗?非常感谢。
回答:
PB的一个缺点是它调用DLL时给出的错误信息总是差不多的,所以很难从错误信息确定问题在哪里。这一点不如VB,VB对不同的问题有不同的错误信息,所以调试这种DLL,最好使用VB。
编写PB用的DLL确实有设置的要求,因为PB调用的DLL同C语言的标准有区别。我专门写了一个读取磁盘上文件日期的DLL例子
filetime.zip,是用VC 1.5写的,但原理和BC 3.1相同。函数定义如下:
UINT FAR PASCAL _export GetFileTime(LPSTR sFile, unsigned * date,
unsigned * time)
被PB调用的DLL必须是FAR PASCAL的。这里的_export和在.DEF文件中定义引出函数是一样的。你可以对照一下你的程序。如果DLL编译后不能被PB调用,你可以使用BC 3.1的命令行工具(在BC31\BIN目录)TDump看看DLL中的函数。语法是
TDump Your.Dll > TDump.txt
打开TDump.txt,在其中找到类似下面的一行:
Name: GETFILETIME Entry: 0003
这里函数名必须是全部大写,如果有小写,说明BC 3.1中Link的选项有问题,应该清除掉Case sensitive export选项。如果函数名中有些其它字符,你应该在C程序函数定义前加上extern "C",或者把文件名由.cpp改为.c。如果这些都正常,那么问题在你PB中调用上了,可能参数类型不一致。
此问题由李海回答。
| |
|
|
| |
|
|