2024年4月30日发(作者:)

第2章 API函数的声明和调用

在PowerBuilder中,API函数的调用属于外部函数的范畴。外部函数的调用与

PowerBuilder的内部函数有许多不同之处,如在调用前必须预先声明、为函数传入正确的参

数、指明函数传递的方式,以及定义函数返回值的类型等等。

2.1 PowerBuilder中API函数声明

2.1.1 PowerBuilder与API函数数据类型的转换

在微软出版的MSDN中给出了每个API函数C语言格式,函数的格式及参数的数据类型

完全是按照C的要求定义的。例如检索打印设备驱动性能的API函数DeviceCapabilities,

在MSDN中的C定义如下:

DWORD DeviceCapabilities(

LPCTSTR pDevice, // printer name

LPCTSTR pPort, // port name

WORD fwCapability, // device capability

LPTSTR pOutput, // output buffer

CONST DEVMODE *pDevMode // device data buffer

);

该声明中还包括一个名为DEVMODE的结构,在结构中包含打印机设备的初始化和环境信

息,结构的C语言定义如下:

typedef struct _devicemode {

BCHAR dmDeviceName[CCHDEVICENAME];

WORD dmSpecVersion;

WORD dmDriverVersion;

WORD dmSize;

WORD dmDriverExtra;

DWORD dmFields;

union {

struct {

short dmOrientation;

short dmPaperSize;

short dmPaperLength;

short dmPaperWidth;

};

第2章 API函数的声明和调用

POINTL dmPosition;

};

short dmScale;

short dmCopies;

short dmDefaultSource;

short dmPrintQuality;

short dmColor;

short dmDuplex;

short dmYResolution;

short dmTTOption;

short dmCollate;

BCHAR dmFormName[CCHFORMNAME];

WORD dmLogPixels;

DWORD dmBitsPerPel;

DWORD dmPelsWidth;

DWORD dmPelsHeight;

union {

DWORD dmDisplayFlags;

DWORD dmNup;

}

DWORD dmDisplayFrequency;

#if(WINVER >= 0x0400)

DWORD dmICMMethod;

DWORD dmICMIntent;

DWORD dmMediaType;

DWORD dmDitherType;

DWORD dmReserved1;

DWORD dmReserved2;

#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)

DWORD dmPanningWidth;

DWORD dmPanningHeight;

#endif

#endif /* WINVER >= 0x0400 */

} DEVMODE;

19

在上述定义中,包含了各种各样的C的数据类型,由于这些数据类型无论从形式上还是

从内在含义上都与PB中的数据类型有一定的差异,要在PB中调用这些过程,需要将它们转

换成合法的PB外部函数声明语句,并使用正确的参数调用它们。表2-1中列出了API函数

的C原型的数据类型与PB中相应的数据类型对应关系。

C语言中的远指针,如LPBYTE、LPDWORD、LPRINT、LPLONG、LPVOID和LPWORD在PB中