热情软件屋

 

为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中调用上了,可能参数类型不一致。

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio