在Delphi FireMonkey中调用MacOS PMGetPageFormatPaper遇访问错误求助
在MacOS下用Delphi FireMonkey获取纸张选择时的访问错误问题
我想在MacOS平台下,使用Delphi FireMonkey在运行时获取(最终实现设置)纸张选择。我把自认为正确的变量和函数替换到之前成功获取纸张矩形、页面矩形及方向的例程中,但这段代码在释放FPrintInfo时出现访问错误。
代码如下:
function getPaperName: string; var FPrintInfo: NSPrintInfo; paper: integer; begin result:=''; FPrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo); FPrintInfo.retain; PMGetPageFormatPaper(FPrintInfo.PMPageFormat, @paper); FPrintInfo.release; result:=IntToStr(paper); end;
苹果文档中PMGetPageFormatPaper函数定义如下:
func PMGetPageFormatPaper( _ format: PMPageFormat, _ paper: UnsafeMutablePointer<PMPaper?> ) -> OSStatus
我注意到指针变量PMPaper?带有问号,而我之前成功使用的函数对应的变量没有问号,这应该很重要,但不清楚具体含义。
问题解决方法
移除不必要的retain/release调用
TNSPrintInfo.OCClass.sharedPrintInfo返回的是系统维护的单例对象,由系统负责内存管理,手动调用retain和release会破坏内存管理规则,直接导致访问错误,这是核心问题。修正参数类型匹配问题
苹果文档里的UnsafeMutablePointer<PMPaper?>表示该指针指向的是可选PMPaper类型(Swift中的?代表变量可能为nil),你用integer作为接收变量类型完全不匹配,应该使用PMPaper类型,并初始化为nil。添加调用状态检查
调用PMGetPageFormatPaper后需要检查返回的OSStatus,确认是否调用成功。
修正后的代码:
function GetPaperIdentifier: string; var FPrintInfo: NSPrintInfo; Paper: PMPaper; Status: OSStatus; begin Result := ''; FPrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo); Paper := nil; Status := PMGetPageFormatPaper(FPrintInfo.PMPageFormat, @Paper); if Status = noErr then begin // 若需要获取纸张名称,可调用PMGetPaperName函数 // 示例返回Paper的指针地址,实际按需处理 Result := IntToStr(Integer(Paper)); end; end;
- 关于
PMPaper?的说明
Swift中的?是可选类型标记,说明该参数对应的变量可能没有有效值(即nil)。在Delphi中只需将PMPaper变量初始化为nil,调用函数后通过返回状态判断是否获取到有效对象即可。
内容的提问来源于stack exchange,提问作者user2580203
相关产品推荐
相关产品推荐

