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中


发布评论