在PowerBuilder中调用Windows的动态链接库 许多熟练使用C的程序员在使用PowerBuilder时都希望自己以前在C上做的工作可以被PowerBuilder引用，这是完全可以的。在PowerBuilder中你可以通过外部引用函数的形式来调用动态连接库中的函数。 PowerBuilder调用DLL程序使用规则 PowerBuilder可以支持任何一种非PowerScript编写，并存储在动态链接库中的外部函数或过程的调用。但外部函数的参数必须是符合Pascal规则的(即参数压栈顺序从前至后)。
在函数调用前，因先作函数声明，PowerBuilder支持以下两种外部函数类型：
·全局函数：可以在应用的任意位置调用；
·局部外部函数：在window，menu，user object或用户自定义函数等对象中定义。
外部函数声明的语法是：{Access}FUNCTION ReturnData Type Function-Name({REF}{DataTypelArg1,．．．,Data TypeN ArgN})LIBRARY LibName
外部过程声明的语法是：
{Access}SUBROUTION Subrou tine({REF} {DataType1 Arg1，．．．，Data TypeN ArgN})
如果你使用的是局部外部函数的声明，你还可以指定对象的访问权限：Public，Private，Protected。对局部函数权限访问的限制同对对象的实例变量的限制相同。你可以指定对象名加函数名的方式调用外部函数：
object．function(arguments)
如在window的w_emp上调用局部外部函数Recog()，就可这样使用：
w_emp．Recog()
如何在PowerBuilder与DLL之间传递参数
在PowerBuilder的script中调用DLL中的函数，缺省情况下是通过传值法来传递参数(Passed by value)，也就是说PowerBui-lder将对要传递的参数做一份拷贝，然后通过堆栈将这份拷贝传递给函数。如果你希望DLL中的函数可以改变调用参数的原值，就可以通过参考传值法(Passed by reference)来传递参数，即在参数类型前面加REF关键字来声明该参数将要用参考传值法。
在使用DLL时有一些基本规则
在MS Windows中，一个DLL在被装入内存后，只会有一个实例，不会因为多个程序使用同一个DLL而在内存中产生多个DLL拷贝。每个DLL只有一个最大为64K的数据段。缺省情况下，PowerBuilder都是使用传值法来传递参数。当你在函数应用说明时使用了REF关键字，PowerBuilder将传递一个32位的地址指针(段地址+偏移量)给被调用的函数，而不是只传递偏移量，这才能保证DLL中的函数能得到PowerBuilder中数据的正确地址。在PowerBuilder中使用的数据类型与C语言支持的数据类型不尽相同，C中不支持的数据类型应在调用前先进行转换。
对于结构，要在C和PowerBuilder中做相等的说明。
PowerBuilder不支持函数指针的传递，因此在PowerBuilder中不能使用回调函数(call back function)。如果DLL的参数需要空指针(NULL)，你可以向函数传递一个值为0的长整型。
Windows中使用的有些数据类型C中并不支持，但一般在C的预编译器中用TYPEDEF作预定义，同时PowerBuilder接口也应当作适当转换。
使用DLL的常见错误和需要注意的地方
1．导致保护性错(General Protection Fault)
在Windows中，如果你企图访问不是属于你的应用程序的内存将导致保护性错。导致保护性错的原因可能有以下几点：
a．向DLL中的函数传递了不正确的参数。这种错误是比较难调试的，因为PowerBuilder的调试器不能跟踪到C程序中。你可以通过在C中使用MessageBox函数显示调用参数的方法来检查参数传递的正确性。更全面的方法是使用Windows的调试版本(带有调试信息的Windows环境)和功能更强的调试器(Soft-ice for windows或CodeView等)；
b．C中对数组的访问超出了PowerBuilder中申请的边界。在C中是不作数组边界检查的，这可能是导致保护性错的最常见的原因；
c．使用了已经释放的内存指针。你最好把已经释放的内存指针置为NULL，以便在使用前进行判断。
2．使用远指针
在C中，所有的静态变量和全局变量都是在程序的数据堆中分配的，其他变量都是在栈中分配的。DLL可以有自己的数据段，但是它没有堆栈段，使用的是调用程序的堆栈。这就意味着寄存器DS指向的是DLL数据段，SS指向PowerBuilder应用程序的堆栈。而一般的Windows应用程序中，DS和SS是相同的，你可以使用近指针，但在调用DLL中引用远堆的变量必须使用32位的远指针。如果使用任何与内存寻址有关的C函数，都要使用C中的far版本。例如字符串拷贝函数，应该用_fstrcpy而不要用strcpy。
3．注意静态变量的使用
无论有多少实例调用同一个DLL，在内存中只有一份DLL代码。由于Windows是多任务的环境，因此DLL中的静态变量可能由于其他实例对此DLL的调用而改变。
4．不要试图共享文件句柄
在Windows环境下，不可能在应用程序和DLL间共享文件句柄。每个应用有各自的文件句柄表，如果两个应用通过一个DLL来访问同一个文件，它们必须分别打开这个文件。
5．及时释放使用过的资源
如果你的DLL中使用了GDI对象，一定要及时释放它们，否则会使Windows因申请GDI资源失败而死机；例如你建立了一个逻辑字体或逻辑笔，在使用完后，要用DeleteObject来删除它。
6．为使PowerBuilder应用在Windows环境下正常运行，DLL应放在下列目录之中：
* 当前目录
* 目录
* Windows System目录
* 在DOS的路径中包括的目录
(周云)